😺

【kubernetes・k8s】Podの基本的な概念や使い方まとめ

2022/11/09に公開

記事の内容

kubernetesのPodに関する知識をまとめます

対象読者

  • kubernetesのPodに関して、知識を整理したい人
  • kubernetesを学び始めた人

Podとは

kubernetes上でデプロイ可能なワークロードの最小単位で、アプリケーションが動作するDockerコンテナの集合体です。
単体のDockerコンテナを動作させることはもちろん、複数のDockerコンテナを同一Pod上で動作させることも可能です。

複数のコンテナ

1つのPodに複数のコンテナを配置することが可能なため、Pod内のコンテナはPodのIPを共有し、ネットワーク・CPU・メモリなども共有します。
同一Pod内のコンテナ同士で通信する際は、localhostで名前解決をします。

Podの新規作成

kubectlを用いた方法

$ kubectl run test-pod --image=nginx --port=80
pod/test-pod created

上記コマンドにて、nginxDockerイメージが動作するtest-pod という名前のPodが新規作成されます。
※80番portを解放しています。

確認コマンド

$ kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          93s

test-podは80番ポートを解放したnginxイメージが稼働するDocker Containerのため、以下コマンドでブラウザからnginxの起動画面を確認可能です。

$ kubectl port-forward test-pod 1111:80
$ curl localhost:1111
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

削除コマンド

$ kubectl delete pod test-pod

manifestを用いた方法

kubectlコマンドで直接作る方法の他に、manifestファイルを作成して、manifestファイルをapplyする方法でPodを作成することもできます。

$ touch pod.yaml
$ vi pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - image: nginx
      name: test-pod
      ports:
        - containerPort: 80
          name: http
          protocol: TCP

pod.yaml というyamlファイルを作成します。そして、kubectlコマンドでapplyすることで、nginxイメージのtest-podというPodが作成されます。

$ kubectl apply -f pod.yaml
$ kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          3m58s

ブラウザから確認

$ kubectl port-forward test-pod 1111:80
$ curl localhost:1111
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

削除

$ kubectl delete -f pod.yaml

Podに対する操作

describe

Podの詳細を確認できます。

$ kubectl describe pod test-pod

log

コンテナの標準出力を確認できます。

$ kubectl logs test-pod

exec

Podで動作するコンテナに対してコマンドを実行できます。

$ kubectl exec test-pod -- echo 'a'
a

複数コンテナの場合

複数コンテナが同一Podに配置されている場合、-cオプションで対象のコンテナを指定します。

PodのHealthCheck

Liveness Probe

Pod上のContainerが起動していることを確認するためにLivenss ProbeというHealthCheckが使われる。
/ へのリクエストが正常に行われるかをkuberenetesが確認し、失敗した場合は、コンテナの再起動が行われる

先ほど作成したyamlファイルに、Liveness Probeを設定したもの

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - image: nginx
      name: test-pod
      ports:
        - containerPort: 80
          name: http
          protocol: TCP
      livenessProbe:
        httpGet:
          path: /
          port: 80
        initialDelaySeconds: 10
        timeoutSeconds: 10
        periodSeconds: 10
        failureThreshold: 10  

Readiness Probe

Liveness Probeだけでなく、コンテナが正常にリクエストを受け付けているかを確認するReadiness Probeも存在する。

先ほど作成したyamlファイルに、Readiness Probeを設定したもの

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - image: nginx
      name: test-pod
      ports:
        - containerPort: 80
          name: http
          protocol: TCP
      readinessProbe:
        httpGet:
          path: /
          port: 80
        initialDelaySeconds: 10
        timeoutSeconds: 10
        periodSeconds: 10
        failureThreshold: 10

LivenessとReadinessの違い

Liveness Probeはコンテナが起動しているかをチェックし、Readiness Probeはコンテナがリクエストを受け付けられるかをチェックしている。
そのため、Liveness Checkが失敗したコンテナは再起動され、Readiness Checkが失敗したコンテナはLoadBalancerのターゲットから外される等の処理がされる。

リソース管理

一般的なコンテナ管理サービスと同じように、各コンテナに対してリソースの割り当てが柔軟にできる。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - image: nginx
      name: test-pod
      ports:
        - containerPort: 80
          name: http
          protocol: TCP
      resources:
        requests:
          cpu: "500m"
          memory: "64Mi"
        limits:
          cpu: "1000m"
          memory: "128Mi"

0.5CPUと64MBのmemoryを要求し、1CPUと128MBを上限としたPodのyamlファイル
requestsは下限・limitsは上限のイメージ

随時更新

Podに関する情報を随時更新していきます。

note

勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。

https://note.com/ring_belle/membership

Discussion