一足遅れて Kubernetes を学び始める - 15. セキュリティ -では、RBAC による権限について学習しました。今回は最後に Kubernetes のコンポーネントについて学習します。
Kubernetes では、下記のような構成になっています。

※ https://kubernetes.io/docs/concepts/architecture/cloud-controller/
それぞれのコンポーネントについて学習します。
pi@raspi001:~/tmp $ k get nodes
NAME STATUS ROLES AGE VERSION
raspi001 Ready master 42d v1.14.1
raspi002 Ready worker 42d v1.14.1
raspi003 Ready worker 42d v1.14.1
pi@raspi001:~/tmp $ k get pods -n kube-system -o=wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-fb8b8dccf-mtzvd 1/1 Running 34 37d 10.244.0.26 raspi001 <none> <none>
coredns-fb8b8dccf-nv6dj 1/1 Running 81 37d 10.244.2.151 raspi003 <none> <none>
etcd-raspi001 1/1 Running 31 42d 192.168.3.32 raspi001 <none> <none>
kube-apiserver-raspi001 1/1 Running 95 42d 192.168.3.32 raspi001 <none> <none>
kube-controller-manager-raspi001 1/1 Running 89 42d 192.168.3.32 raspi001 <none> <none>
kube-flannel-ds-arm-4s22p 1/1 Running 73 38d 192.168.3.34 raspi003 <none> <none>
kube-flannel-ds-arm-7nnbj 1/1 Running 88 38d 192.168.3.33 raspi002 <none> <none>
kube-flannel-ds-arm-ckwq5 1/1 Running 86 38d 192.168.3.32 raspi001 <none> <none>
kube-proxy-6fwl5 1/1 Running 31 42d 192.168.3.32 raspi001 <none> <none>
kube-proxy-wgjdq 1/1 Running 28 42d 192.168.3.33 raspi002 <none> <none>
kube-proxy-zvmqf 1/1 Running 28 42d 192.168.3.34 raspi003 <none> <none>
kube-scheduler-raspi001 1/1 Running 87 42d 192.168.3.32 raspi001 <none> <none>下記は、MasterNode で動いています。
下記は、全 Node で動いています。
coredns は、Master1 台と Worker1 台で動いています。
※ このときに設定しました。
MasterNode に存在するコンポーネントです。 分散 Key-ValueStore である etcd は、Kubernetes のクラスタにある全情報が保存されています。そのため、単一障害にならないようクラスタを組むことが推奨されているみたいです。ここのデータにアクセスするのは kube-apiserver から経由しなければなりません。 直接確認したい場合は、etcdctl を使ってみると良いです。
MasterNode に存在するコンポーネントです。 KubernetesAPI を提供するコンポーネントです。kube-scheduler や kube-controller-manager,kubelet から呼ばれます。 etcd に対してリソースを管理するだけで、Pod の起動はしません。
MasterNode に存在するコンポーネントです。 Node 情報が未割り当ての Pod を検知して、その Pod に Node を割り当てるリクエストを kube-apiserver に送ります。 割り当てるだけであって、Pod を起動させません。Node を割り当てる際、NodeAffinity や Taints などを考慮に入れます。
各 Node 上で動作するコンポーネントです。未割り当てだった Node が割り当てられたことを検知し、 実際に Pod を起動します。
MasterNode に存在するコンポーネントです。 様々なコントローラを実行するコンポーネントです。Deployment や ControllerReplicaSetController では、 状態を監視し、期待する Pod 数と現在の Pod 数を見ます。kube-apiserver に対して、過不足分の Pod を調整するよう要求します。 その後は、さきほどの kube-scheduler,kubelet の一連の流れになります。
各 Node 上で動作するコンポーネントです。NodePort や ClusterIP 宛のトラフィックを転送します。
kubernetes クラスタ内の名前解決やサービスディスカバリに利用される DNS サーバです。 私の環境では、CoreDNS を使っていました。
CRD は独自のリソースを定義できるリソースです。このような拡張性をもたせることで、様々な開発が進められます。 CRD は、単なる Kubernetes オブジェクトなだけなので、Operator というカスタムコントローラをセットで作る必要があります。 Operator Framework と呼ばれるもので簡単に作成できるそうです。
ようやく Kubernetes 完全ガイドの内容を読み切ることができました。 当初は、ここまで記事にアウトプットし続けるつもりはなかったです。 実際に kubernetes を raspberryPi 上で動かしてみると、 いろいろな発見があってのめり込んでしまいました。
ただ、一足遅れて Kubernetes を学び始める - 12. リソース制限 -ぐらいから、いろいろとあって、 書籍の内容を、ほぼそのまま使わさせてもらいました。(笑)
これからは、実際に GKE を使ってアプリケーション開発をしてみようと思います。
タグ「クラウドインフラ」の記事
Dockerイメージ内の構造や設定が期待通りかどうかを検証する `container-structure-test` を知りました。container-structure-test GitHub リポジトリ。せっかくなので、試してみました。
BigQuery、皆さん使っていますか? 私は、業務でBigQueryを使ったデータ構築をしています。品質担保のため、BigQueryのSQLに対してテストをしたいと考えています。本記事では、BigQueryだけで完結し、かつ、Mockデータを差し替え可能なユニットテスト手法について、紹介します。
TikTokへスクレイプするバッチをGCP上で構築しました。GCP構築のシステム設計話と、その構築時に、ハマったことを共有します。