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を起動しているということを知っておくことが重要、そんなところでしょうか。