【kubernetes・k8s】Podの基本的な概念や使い方まとめ
記事の内容
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
上記コマンドにて、nginx
Dockerイメージが動作する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で配信しています。
Discussion