Kubernetes Pods

Podとは

Pod(ポッド)はApplicationの最小実行単位であり、Kubernetesで管理の基本単位としてグループ化した仮想ホストのようなものを意味する。
つまり、Kubernetesでコンテナ、またはコンテナ群を指す名前である。単純にコンテナと考えてよい。

このPodは仮想Network Interface、同じIP、ファイルシステムを共有するため、仮想ホストのような役割を持つ。
1つまたは複数のApplication container、storage、networkなどの情報を含む。

Podの特徴

  • Podにはそれぞれ固有のprivate IPが割り当てられる。
  • Pod内のcontainerはPodのIPをlocalhostとして共有する。
  • Podは実質的にPodを持つvirtual machineと言える。

Pod制御

このようなPodを作成し、情報を確認する方法を見ていく。

Pod起動 - kubectl run

まずPodの起動について見てみよう。次のコマンドを実行するとPodが起動する。

kubectl run –-image [イメージ名]:[タグ名] (オプション) [Pod名]

次のコマンドでWebServerであるnginxを起動してみる。

kubectl run webserver --image=nginx:1.14 --port 80

実行結果:

% kubectl run webserver --image=nginx:1.14 --port 80
pod/webserver created

kubectl runについてもdocker runと同じように、さまざまなオプションを指定できる。たとえば、-eオプションを使用して環境変数を設定できる。 その他のオプションは次のページを参照してほしい。

Pod一覧取得 - kubectl get

Pod一覧を見るには次のコマンドを実行する。

kubectl get pods

実行結果:

% kubectl get pods
NAME        READY   STATUS              RESTARTS   AGE
webserver   0/1     ContainerCreating   0          4s

作成直後に実行すると、上のように状態が作成中(ContainerCreating)というメッセージになる。

% kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
webserver   1/1     Running   0          16s

少し時間が経ってから実行すると、実行状態(Running)というメッセージになる。

Pod一覧をさらに詳しく見るには、次のコマンドを実行する。

kubectl get pods -o wide

実行結果:

% kubectl get pods -o wide
NAME        READY   STATUS              RESTARTS   AGE   IP       NODE       NOMINATED NODE   READINESS GATES
webserver   0/1     Running             0          9s    <none>   minikube   <none>           <none>

Pod詳細取得 - kubectl describe

Podのメタデータを見るには、次のコマンドを実行する。

kubectl describe pod [Pod名]

実行結果はPod名、Namespace、Node、IP、Container、Eventなどの詳細情報を表示する。

Pod log確認 - kubectl logs

Podのログを見たい場合は、次のコマンドを実行する。

kubectl logs [Pod名]

実行結果:

% kubectl logs webserver
172.17.0.4 - - [08/Sep/2022:23:38:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.85.0-DEV" "-"

Pod実行結果確認 - curl

curlコマンドで接続できるか確認してみる。

curl [IP]

実行結果ではnginxのWelcomeページHTMLが表示される。

Podに入る - kubectl exec

作成したPodの中に入るには、次のコマンドを実行する。

kubectl exec -it [Pod名] [イメージ名]

Podの中に入る。

% kubectl exec webserver -it -- /bin/bash
root@webserver:/#

nginxの最初のページファイルがあるパスへ移動する。

root@webserver:/# cd /usr/share/nginx/html/

内容を確認する。

root@webserver:/usr/share/nginx/html# cat index.html

内容を修正する。

root@webserver:/usr/share/nginx/html# echo "Hello, devkuma" > index.html

修正内容が反映されたかサーバーへ接続して確認する。

$ curl 172.17.0.3
Hello, devkuma

Podでポートフォワード - kubectl port-forward

kubectl port-forward 8080:80

YAMLファイルを作成してPodを起動する

ここではPod起動をYAMLで作成し、そのYAMLを利用してPodを起動してみる。

  1. コマンドを作る
    まず--dry-runフラグを使って、実行されないコマンドを作ってみる。

    kubectl run webserver --image=nginx:1.14 --port 80 --dry-run=client
    

    --dry-runフラグを使用すると、実際には実行されず、クラスタへ送るオブジェクトを事前に確認できる。

  2. YAML設定内容を確認する

    kubectl run webserver --image=nginx:1.14 --port 80 --dry-run=client -o yaml
    

    実行するとPodのapiVersionkindmetadataspecなどを含むYAMLが出力される。

  3. YAMLファイルを作る
    この内容をwebserver-pod.yamlというファイル名で作成する。

    % kubectl run webserver --image=nginx:1.14 --port 80 --dry-run=client -o yaml > webserver-pod.yaml
    
  4. 既存Podを削除する 既存の同じ名前のwebserver Podを削除する。

    % kubectl delete pod webserver
    pod "webserver" deleted
    
  5. YAMLで新しいPodを作成する YAMLファイルで新しいPodを作成する。

    kubectl create -f webserver-pod.yaml
    

    正しく作成されたか確認する。

    % kubectl get pods
    NAME        READY   STATUS    RESTARTS   AGE
    webserver   1/1     Running   0          12s
    

Podを削除 - kubectl delete

作成したPodを削除するには、次のコマンドを実行する。

kubectl delete pod [Pod名]

実行結果:

% kubectl delete pod webserver
pod "webserver" deleted

Podをデプロイする

kubectl create deployment mainui --image=httpd: --replicas=3
kubectl get deployment.apps
kubectl describe deployment.apps mainui
kubectl get pods
kubectl get pods -o wide
kubectl edit deployment.apps maini