1クール続けるブログ

とりあえず1クール続けるエンジニアの備忘録

KubernetesのDeploymentでややこしいところ

Deploymentに何回も同じキーワード出てきてない…?

Deploymentの中身ってこんな感じ

apiVersionのところは、1.9からDeploymentがベータでなくなったため、1.8以前とは書き方が異なります。注意。GKE使っている人で公式のマスターノードのバージョンを自動アップグレードに任せている人は、まだバージョンが1.8なのでextensions/v1beta1となっているはず。

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.7.9
        ports:
        - containerPort: 80

3つのLabel

.metadataに含まれるものと、.spec.selector.matchLabels.spec.template.metadata.labelsで3回もKeyValueでラベルを書くところがあるじゃないですか!Deploymentは、ECSでいうServiceとTask Definitionをガッチャンコした感じなので、要素が詰まってて混乱してしまいがち。 例えば、ECSのServiceで指定するクラスターや最小ヘルス率、タスク数などは、KubernetesのDeploymentではそれぞれ、.spec.template.spec.nodeSelector(厳密には全然違うけど)、.spec.strategy.rollingUpdate.maxUnavailable.spec.replicasとなる。

この3箇所で書くLabelはそれぞれ意味が違う

  • .metadata.labels : Deployment自体へのlabelを指す。kubectl get deployment -l app=nginxとかコマンドラインで使うことが多いかも。hpaで定義するときにこのlabelを使用すると思いがちだが、hpaでの定義は.metadata.nameを使う
  • .spec.selector.matchLabels : これはReplica Setで管理するpodのラベルを定義するもの。このラベルにマッチするpodを.spec.replicasの値に保とうとする。
  • spec.template.metadata.labels : これがtemplateで定義しているPodにひっつくLabel。基本的には、上のreplica setの管理対象として書いたpodのlabelと一致させる。PDBやServiceで指定するのに使ったりする。他のワークロードから参照されるので慎重に。

2つのspec

  • .spec : これはDeploymentという単位に対するspecification(仕様)。
  • .spec.template.spec : これはpodという単位に対するspecification(仕様)。

まとめ

spec.template.metadata.labelsで指定しているLabelは、PDBやServiceで宣言することになる。 .spec.template.spec.nodeSelectorも言ってしまえば、label記述だったか…。