えいのうにっき

a-knowの日記です

Kubernetesクラスタを構成するコンポーネントについて(入門k8s 読書メモ)

入門 Kubernetes を読んでいる。

入門 Kubernetes

入門 Kubernetes

読みながら「ほほう」と思ったところについては、自分の趣味用に持っているk8s(GKE)クラスタを相手にコマンドを実行しながら・その結果や過程をメモしながら読み進めることで、理解を深める助けにしていきたいと思う。

Kubernetesクラスタを構成するコンポーネントについて

Kubernetesクラスタを構成するコンポーネント自体も、Kubernetesを使って各ノードにデプロイされている。面白い。これらのコンポーネントは、いずれも kube-system namespace 内で稼働している。

Kubernetes proxy

  • Kubernetes クラスタ内のロードバランスされたServiceに、ネットワークトラフィックをルーティングする役割を担う
    • そのため、このコンポーネントはクラスタ内の各ノードで稼働している必要がある
    • 各ノードで稼働させるために、DaemonSet が用いられている。
$ kubectl get daemonSets --namespace=kube-system
NAME                       DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR                                  AGE
fluentd-gcp-v2.0.17        4         4         4         4            4           beta.kubernetes.io/fluentd-ds-ready=true       30d
metadata-proxy-v0.1        0         0         0         0            0           beta.kubernetes.io/metadata-proxy-ready=true   30d
nvidia-gpu-device-plugin   0         0         0         0            0           <none>                                         30d

Kubernetes DNS

  • クラスタ内で定義されているServiceのネーミングとディスカバリをおこなうため、DNSサーバも持っている
  • DNSサーバは、クラスタ内では、レプリケーションされたServiceとして動作している
  • 1つ、もしくは複数のDNSサーバがクラスタ内で動作している
    • 数はクラスタのサイズによる。
  • DNSサーバは、KubernetesのDeploymentとして稼働している。
$ kubectl get deployments --namespace=kube-system kube-dns
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-dns   2         2         2            2           30d
  • クラスタのサイズによって数をスケールさせるための Deployments が kube-dns-autoscaler
$ kubectl get deployments --namespace=kube-system kube-dns-autoscaler
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-dns-autoscaler   1         1         1            1           30d
  • このDNSサーバをロードバランスさせるための Kubernetes Service も動いている。
$ kubectl get services --namespace=kube-system kube-dns   
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kube-dns   ClusterIP   10.43.240.10   <none>        53/UDP,53/TCP   30d
  • 上記のような結果をもつクラスタの場合、クラスタ内の各コンテナ内 /etc/resolv.conf10.43.240.10 が設定されている。

Kubernetes GUI

  • Kubernetes GUI も Kubernetes コンポーネントを構成するもののひとつ。
  • Deployment として管理されている。
$ kubectl get deployments --namespace=kube-system kubernetes-dashboard
NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-dashboard   1         1         1            1           30d
  • GUI にも、ロードバランスのための Service がある。
$ kubectl get services --namespace=kube-system kubernetes-dashboard   
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.43.247.50   <none>        443/TCP   30d
  • GUIにアクセスするためには、kubectl proxy コマンドを用いる。
    • このコマンドにより、サーバを localhost:8001 で起動する・ http://localhost:8001/ui から Kubernetes Web GUI が見られる。

f:id:a-know:20180811170100p:plain

  • http://localhost:8001/ui は 1.10 で廃止予定、以降は http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ を使用する。
  • GKE の場合は事前に gcloud container clusters get-credentials を実施しておく必要がある。