LinuCエヴァンジェリストの鯨井貴博@opensourcetechです。
はじめに
今回は、kubernetesでstatic podを起動させてみます。
なお、作業はこちらの記事で作成したkubernetesクラスター v1.26.00で実施します。
static podとは
通常のPod(コンテナ)は、yamlを適用(apply)するとkubernetesのAPIサーバによって起動されます。
Podが起動されるNodeは、nodeSelectorやnodeアフィニティなどで決定されます。
※詳細は、こちら。
static podはそれとは異なり、Podのyamlファイルを起動させたいNodeのkubeletが指定するパスに格納してkubeletが起動します。
https://kubernetes.io/ja/docs/tasks/configure-pod-container/static-pod/
static pod yamlの格納場所
static pod yamlの格納場所ですが、kubelet.confに記載されています。
staticPodPath: /etc/kubernetes/manifestsという箇所がそれです。
kubeuser@master01:~/kubernetes_install$ sudo cat /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 authentication: anonymous: enabled: false webhook: cacheTTL: 0s enabled: true x509: clientCAFile: /etc/kubernetes/pki/ca.crt authorization: mode: Webhook webhook: cacheAuthorizedTTL: 0s cacheUnauthorizedTTL: 0s cgroupDriver: systemd clusterDNS: - 10.1.0.10 clusterDomain: cluster.local cpuManagerReconcilePeriod: 0s evictionPressureTransitionPeriod: 0s fileCheckFrequency: 0s healthzBindAddress: 127.0.0.1 healthzPort: 10248 httpCheckFrequency: 0s imageMinimumGCAge: 0s kind: KubeletConfiguration logging: flushFrequency: 0 options: json: infoBufferSize: "0" verbosity: 0 memorySwap: {} nodeStatusReportFrequency: 0s nodeStatusUpdateFrequency: 0s resolvConf: /run/systemd/resolve/resolv.conf rotateCertificates: true runtimeRequestTimeout: 0s shutdownGracePeriod: 0s shutdownGracePeriodCriticalPods: 0s staticPodPath: /etc/kubernetes/manifests streamingConnectionIdleTimeout: 0s syncFrequency: 0s volumeStatsAggPeriod: 0s
/etc/kubernetes/manifests/を見ると、いくつかのyamlファイルが既にあり、
etcd・kube-apiserver・kube-controller-manager・kube-schedulerがstatic podとして起動されていることが分かります。
kubeuser@master01:~/kubernetes_install$ ls /etc/kubernetes/manifests/ etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml kubeuser@master01:~/kubernetes_install$ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-57b57c56f-p6xds 1/1 Running 0 12d calico-node-phmkb 1/1 Running 0 12d calico-node-wjdqx 1/1 Running 0 12d calico-node-xdkfv 1/1 Running 0 12d coredns-787d4945fb-6n79l 1/1 Running 0 12d coredns-787d4945fb-dfplr 1/1 Running 0 12d etcd-master01 1/1 Running 3 12d kube-apiserver-master01 1/1 Running 2 12d kube-controller-manager-master01 1/1 Running 0 12d kube-proxy-2sdm6 1/1 Running 0 18h kube-proxy-dvrph 1/1 Running 0 18h kube-proxy-gpp8x 1/1 Running 0 18h kube-scheduler-master01 1/1 Running 3 12d metrics-server-6b6f9ccc7-qmtb9 1/1 Running 0 21h
static podの起動
では、早速Podのyamlを/etc/kubernetes/manifests/に配置してみましょう。
※Webサーバ(nginx)のpodを使ってます。
kubeuser@master01:~/staticpod$ kubectl run webserver --image=nginx:1.23.1 --dry-run=client -o yaml > webserver.yaml kubeuser@master01:~/staticpod$ ls webserver.yaml kubeuser@master01:~/staticpod$ cat webserver.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: webserver name: webserver spec: containers: - image: nginx:1.23.1 name: webserver resources: {} dnsPolicy: ClusterFirst restartPolicy: Always status: {} kubeuser@master01:~/staticpod$ sudo cp ./webserver.yaml /etc/kubernetes/manifests/ kubeuser@master01:~/staticpod$ ls /etc/kubernetes/manifests/ etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml webserver.yaml
その後、podが起動されます。
起動されたpodの名前を見るとわかりますが、
通常のpodの場合は"yaml内のnameで指定した名前-xxxxxxx(ランダムの文字列)"となりますが、
static podの場合は"yaml内のnameで指定した名前-起動したnode名"となります。
kubeuser@master01:~/staticpod$ kubectl get pods -w NAME READY STATUS RESTARTS AGE nginx-6cbc9bb4f5-jm8mr 1/1 Running 0 3d4h nginx-6cbc9bb4f5-pfhfz 1/1 Running 0 3d20h nginx2-f96cfc57b-vnsfm 1/1 Running 0 3d20h webserver-master01 0/1 ContainerCreating 0 11s webserver-master01 0/1 ContainerCreating 0 17s webserver-master01 1/1 Running 0 38s kubeuser@master01:~/staticpod$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-6cbc9bb4f5-jm8mr 1/1 Running 0 3d4h 10.0.5.32 worker01 <none> <none> nginx-6cbc9bb4f5-pfhfz 1/1 Running 0 3d20h 10.0.30.106 worker02 <none> <none> nginx2-f96cfc57b-vnsfm 1/1 Running 0 3d20h 10.0.30.107 worker02 <none> <none> webserver-master01 1/1 Running 0 44s 10.0.241.68 master01 <none> <none>
不要になったら、/etc/kubernetes/manifestsからyamlファイルを削除すればOKです。
おわりに
この機能を積極的に使ってpodを起動しようというものというよりは、
kubernetesではstatic podとしていくつかのpodを起動しているということを知っておくことが重要、そんなところでしょうか。