Opensourcetechブログ

OpensourcetechによるNGINX/Kubernetes/Zabbix/Neo4j/Linuxなどオープンソース技術に関するブログです。

kubernetesでstatic podを起動させる


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

Opensourcetech by Takahiro Kujirai