[Kubernetes]Static Podの作成方法を確認する

#はじめに
Podはkube-apiserverで管理されています。Static Podは特殊なPodで、kube-apiserverではなく、kubeletが直接管理するPodです。etcdやkube-apiserverなどがStatic Podとしてデプロイされています。

Static Podをユーザ環境に合わせて追加することはあまりないかも知れませんが、今回はStatic Podの作成方法を確認しましたのでまとめました。
なお、Static Podは今後廃止される可能性があるとのことです。

https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/#static-pods

#Static Podの作成
Static PodはMasterノードだけでなくworkerノードにも作ることができます。
今回はworkerノードに作成してみたいと思います。Masterノードに作る場合も同じです。

##環境の確認
まずはkubeleteの設定情報を確認します。確認しなくてもデフォルトのままだとは思いますが、念のため確認します。
Configファイルのディレクトリを確認します。「--config」の値を確認します。

```
[worker01]$ systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           mq10-kubeadm.conf
        /etc/systemd/system/kubelet.service.d
           mq20-extra-args.conf
   Active: active (running) since 日 2020-08-02 21:43:32 JST; 15min ago
     Docs: https://kubernetes.io/docs/
 Main PID: 842 (kubelet)
    Tasks: 28
   Memory: 110.5M
   CGroup: /system.slice/kubelet.service
           mq842 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=systemd --netw...
・・・
```

config.yamlファイルを確認し、「staticPodPath」のディレクトリを確認します。
このディレクトリにStatic Podのマニフェストファイルを保存します。

```/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
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
```

staticPodPathを確認します。workerノードにはマニフェストファイルはありません。

```
[worker01]$ ls -la /etc/kubernetes/manifests/
合計 0
drwxr-xr-x. 2 root root  6  5月 21 02:46 .
drwxr-xr-x. 4 root root 54  2月 26 06:39 ..
```

##Static Podマニフェストファイルの作成
マニフェストファイルを作成し、staticPodPathに保存します。
ここではとりあえずnginxのマニフェストファイルを作成しました。

```/etc/kubernetes/manifests/nginx-static.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx-static
  name: nginx-static
spec:
  containers:
  - image: nginx
    name: nginx-static
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
```

###コンテナの確認
マニフェストファイルを作成すると、コンテナが自動で起動します。

```
[worker01]$ sudo docker ps | grep nginx-static
ba94e5f78d5c        nginx                  "/docker-entrypoint.…"   53 seconds ago      Up 53 seconds                           k8s_nginx-static_nginx-static-k8s-worker01_default_f0ea6bb0822d50cc515c545276d758e8_0
1e43b8139676        k8s.gcr.io/pause:3.1   "/pause"                 58 seconds ago      Up 57 seconds                           k8s_POD_nginx-static-k8s-worker01_default_f0ea6bb0822d50cc515c545276d758e8_0
```

##Podの確認（Masterノード）
MasterノードでもStatic Podが起動したことが確認できます。

```
[master]$ kubectl get pod nginx-static-k8s-worker01 -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
nginx-static-k8s-worker01   1/1     Running   0          2m59s   192.168.79.121   k8s-worker01   <none>           <none>
```

#まとめ
どういうときにユーザオリジナルのStatic Podを作成するのかわかりませんが、kubeletのConfigファイルの確認から、staticPodPathの確認方法は押さえておこうと思います。