Static Pod の取り扱い
基本
Static Pod 用のディレクトリが存在しており、そこに Pod の manifest file を配置することで kubelet が Pod 作成を行う。
また、 kubelet がその Pod を稼働し続けることを面倒見てくれる。
このディレクトリからファイルを削除することで Pod も削除される。
なお、この方法で作成できるのは Pod のみであり、 ReplicaSet や Deployment などのリソースは作成できない。
イメージ図は以下。

ディレクトリの決定
このディレクトリはどうやって決まるのか。
具体的は 2 パターンある。
kubelet 起動時に渡される
kubelet 起動時に pod-manifest-path オプションが利用され、以下のような形で渡される。
--pod-manifest-path=/etc/Kubernetes/manifests
config 内に記載する
config ファイル自体のパスを起動時に渡して、その中で書くこともできる。
kubelet 起動時に config オプションが利用され、以下のような形で渡される。
--config=kubeconfig.yaml
config.yaml の中では staticPodPath として指定される。
...
staticPodPath: /etc/kubernetes/dev/manifests
Pod の確認
Node がクラスタに属している場合は、kubectl get pods で static Pod も表示される。
しかし、Read Only Mirror として表示されるので、編集も削除もできない。
staticPodPath 内の、実ファイルを操作する必要がある。
操作例
staticPodPath の特定
ps コマンドから起動時に渡されたオプションを確認する。
$ ps -aux | grep kubelet
root 2053 5.5 4.6 944284 95720 ? Ssl 18:58 0:09 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni
--config=/var/lib/kubelet/config.yaml という設定ファイルの中に書かれている、ということがわかる。
Static Pod の作成
kubectl run コマンドを --dry-run で実行し、マニフェストファイルを staticPodPath に出力する。
以下のようなコマンドを投げると楽かな。
$ kubectl run --restart=Never --image=nginx static-nginx --dry-run -o yaml > /etc/kubernetes/manifests/static-nginx.yaml
Static Pod の編集
シンプルに staticPodPath のマニフェストを編集して保存するだけでよい。
おまけ
Udemy 教材の問題の解答。
以下の Pod static-greenbox-node01 を削除しろという問題。
master $ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGEdefault static-greenbox-node01 1/1 Running 0 47skube-system coredns-78fcdf6894-pk9jv 1/1 Running 0 7mkube-system coredns-78fcdf6894-sh9fk 1/1 Running 0 7mkube-system etcd-master 1/1 Running 0 6mkube-system kube-apiserver-master 1/1 Running 0 6mkube-system kube-controller-manager-master 1/1 Running 0 6mkube-system kube-proxy-hcdn8 1/1 Running 0 7mkube-system kube-proxy-hq87r 1/1 Running 0 7m
kube-system kube-scheduler-master 1/1 Running 0 6m
kube-system weave-net-htmw8 2/2 Running 1 7m
kube-system weave-net-rsk8d 2/2 Running 1 7m
Pod が動いている Node を特定し ssh する。
master $ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready master 7m v1.11.3 172.17.0.78 <none> Ubuntu 16.04.2 LTS 4.4.0-62-generic docker://1.13.1
node01 Ready <none> 7m v1.11.0 172.17.0.82 <none> Ubuntu 16.04.2 LTS 4.4.0-146-generic docker://17.3.2
master $ ssh 172.17.0.82
Static Pod の削除はファイルの削除が必要なので staticPodPath を探す。
node01 $ ps -aux | grep kubelet
root 5646 3.1 2.1 623720 87036 ? Ssl 19:06 0:02 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni
root 6459 0.0 0.0 14228 924 pts/1 S+ 19:07 0:00 grep --color=auto kubelet
node01 $ cat /var/lib/kubelet/config.yaml | grep staticPodPath
staticPodPath: /etc/just-to-mess-with-you
実ファイルを削除。
node01 $ rm -f /etc/just-to-mess-with-you/greenbox.yaml
