このエントリはKubernetesアドベントカレンダー2014の3日目です。
今日も引き続きKubernetesのDesign Overviewを見ていきます。
The Kubernetes Node
Master
や Minion
などのKubernetesの各nodeでは以下のプロセスが稼働します。
kubelet
kube-proxy
図に出てくる cAdvisor
は google/cadvisor で、独立したプロセスではなく kubelet
に組み込まれているようです(ちょっとあやふや)。
kubelet
container manifest(コンテナマニフェスト)に従いコンテナを起動します。
container manifestには、yaml形式で起動したい Pod
の情報と設定を書きます。
kubelet
はContainer Agent( GoogleCloudPlatform/container-agent )の後継プロダクトです。
kubelet
には4つの方法でcontainer manifiestを渡せます。
File
: ファイルパスを指定します。ファイルは20秒おきに再チェックされますHTTP endpoint
:HTTP endpoint
(要はURL)を指定します。kubelet
は20秒おきにetcd server
: 指定されたetcd
の/registry/hosts/$(hostname -f)
をwatch
します。この方法だと変更の反映がとてもすばやく実現できますHTTP server
:kubelet
自身がHTTPでcontainer manifestを受け取ります。まだ今のところunder specです
なお File
と HTTP endpoint
の再チェック間隔は設定で変更できます。
kube-proxy
ネットワークプロキシです。
Service
で既定されたとおり、TCPとUDPを Pod
に転送します。
kubernetes/services.md at v0.5.3 · GoogleCloudPlatform/kubernetes
このあたりは昨日のエントリに少し詳しく書いてあります。
The Kubernetes Control Plane
KubernetesのControl Planeはいくつかのプロセスで構成されていますが、ぜんぶ1つのサーバ( Master
)で稼働します。
etcd
kube-apiserver
kube-scheduler
kube-controller-manager
etcd
分散KVSです。Kubernetesでは Master
の状態・設定を永続化するために利用しています。
watch
機能を利用して Minion
や Pod
などの状態をすばやくクラスタに反映させることができるようになっています。
Kubernetesでは、 Master
の各プロセスと、各 Minion
の kubelet
が etcd
を使って設定やステータスを共有します。
kube-apiserver, kube-scheduler
2つ合わせて、いわゆる Kubernetes API Server
です。
Kubernetesの3つのオブジェクト( pod
, service
, replicationController
)に対するRESTでの操作を受け付けて etcd
に保存します。それと、 Minion
に対する Pod
のスケジューリングと、 Pod
の情報( Pod
がどの Minion
にいるか、どのポートを EXPOSE
しているか)と Service
設定を同期します。
schedulerは今のところとてもシンプルで、登録されているホスト( Minion
)の中で、priorityの値が低いものを選択します。同じプライオリティであればその中からランダムに選択します。
kubernetes/generic_scheduler.go at v0.5.3 · GoogleCloudPlatform/kubernetes
kube-controller-manager
etcd
にある replicationController
オブジェクトを監視( watch
)して、変化があったらKubernetes APIを叩いてReplicationを発動させます。
まとめ
Kubernetesのバックエンドは etcd
と、その watch
機能で構成されてます。
etcd
は凄いやつ。