はじめに
Calicoのkube-controllersのLiveness/Readinessを見ると、内部的に以下コマンドで生死監視が行われています。
exec [/usr/bin/check-status -l] delay=10s timeout=10s period=10s #success=1 #failure=6
本記事にて実機を用いて内部的に何が確認されているのかを調査しました。
環境情報
calico/kube-controllers:v3
/usr/bin/check-status --version v3.21.4
check-statusはjsonファイルを確認している
コンテナ内部で同コマンドのヘルプ画面を出力すると以下となっており
# ./check-status --help Usage of check-status: -f, --file string File to read with status information (default "/status/status.json") -l, --live Check liveness -r, --ready Check readiness -v, --version Display version
/status/status.json
というファイルの状態を確認しており、同ファイルは正常時は下記のようになっています。
# cat /status/status.json {"Readiness":{"CalicoDatastore":{"Ready":true,"Reason":""},"KubeAPIServer":{"Ready":true,"Reason":""}}}
kube-controllersがファイルに書き込みを行っている
このファイルに書き込みを行っているのが同Pod内で稼働しているプロセス(/usr/bin/kube-controllers
)であり、該当のプロセスの中はGolangで記述されていて以下のようなメッセージが出力されていました。
[INFO][18109] main.go 94: Loaded configuration from environment config=&config.Config{LogLevel:"info", WorkloadEndpointWorkers:1, ProfileWorkers:1, PolicyWorkers:1, NodeWorkers:1, Kubeconfig:"", DatastoreType:"etcdv3"} client_config.go:615] --kubeconfig nor --master was specified. Using the inClusterConfig. ... load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT
上記にもある通りでKubernetesのAPIServerとの正常な疎通ができていることを確認しているので、実際にPotとMasterNodeの通信を遮断するとPodはLivenessの失敗に伴い停止します。以下は通信遮断時のkubelet.logの抜粋。
{"message":"... kubelet.service[6090]: ... kubelet.go:2182] \"SyncLoop (probe)\" probe=\"liveness\" status=\"unhealthy\" pod=\"kube-system/calico-kube-controllers-679df47c7b-8rxwb\"",...
終わりに
同デプロイメントはノードやNetworkPolicyといったリソースの追加/削除を監視している事情でMasterNodeとの通信が途絶えると停止するようになっています。
以上、ご参考になれば幸いです。