Open8

k8s作って壊して学ぶ

TkmyztTkmyzt

本番環境のアプリケーションはDeploymentというリソースを使用してPodを冗長化している。
特定のPodだけがハングしてしまったというケースにはkubectl deleteを使用して削除するというケースもある。
Deploymentが効いてあるべきPod数に戻す。

TkmyztTkmyzt
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: httpserver
  labels:
    app: httpserver
spec:
  replicas: 3
  selector:
    matchLabels:
      app: httpserver
  template:
    metadata:
      labels:
        app: httpserver
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.3

ReplicaSetがPodを冗長化する役割を果たしている。
.metadata.labelsはReplicaSetを識別するためのラベル。
.spec.selector.matchLabelsはどのPodをReplicaSetが管理しているかを表すためのラベル。
.template.metadata.labelsはPodのラベル。これが上記のmatchLabelsと一致していなければReplicaSetの管理対象とはならない。

$ k get pod -n default        
NAME               READY   STATUS    RESTARTS   AGE
httpserver-87c24   1/1     Running   0          62s
httpserver-cvgz4   1/1     Running   0          62s
httpserver-mq4gk   1/1     Running   0          62s

ReplicaSetは同じPodを複製し、Nameの末にはsuffixがつけられる。

$ k get rs -n default
NAME         DESIRED   CURRENT   READY   AGE
httpserver   3         3         3       2m26s

理想状態と現実状態

TkmyztTkmyzt
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
TkmyztTkmyzt

Deploymentで作成したリソースにアクセスするためにはIPアドレスが割り振られているPodにアクセスしなければならないが消えたりしたらアクセスできなくなるので複数podへのアクセスをいい感じにルーティングするServiceという概念が存在する

TkmyztTkmyzt

ConfigMap

  1. コンテナ内のコマンドの引数として
  2. コンテナ環境変数
  3. volume

コンテナの環境変数として読み込む場合は変更した後にコンテナの再起動が必要になる