このトピックでは、Kubernetes クラスター証明書の更新方法を紹介します。 すべてのノードの証明書を同時に更新することができます。また、対象となるマスターノードおよびワーカーノードの証明書を手動で更新することもできます。

前提条件

すべてのノード証明書の同時更新

マスターノードにログインし、以下のコマンドを実行します。
$ curl http://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/cert-update/renew.sh | bash
結果
  1. 以下のコマンドを実行して、マスターノードおよびワーカーノードのステータスを表示します。
    $ kubectl get nodes
  2. 以下のコマンドを実行します。 それぞれのマスターノードの SUCCESSFUL パラメーターの値が 1 であり、かつ、それぞれのワーカーノードの SUCCESSFUL パラメーターの値がクラスターワーカーノードの数に等しい場合、すべての証明書が更新されています。
    $ kubectl get job –nkube-system

マスターノード証明書の手動更新

  1. 以下のコードをコピーし、job-master.yml ファイルを作成するため任意のパスに貼り付けます。
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: ${jobname}
      namespace: kube-system
    spec:
      backoffLimit: 0
      completions: 1
      parallelism: 1
      template:
        spec:
          activeDeadlineSeconds: 3600
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                    - ${hostname}
          containers:
          - command:
            - /renew/upgrade-k8s.sh
            - --role
            - master
            image: registry.cn-hangzhou.aliyuncs.com/acs/cert-rotate:v1.0.0
            imagePullPolicy: Always
            name: ${jobname}
            securityContext:
              privileged: true
            volumeMounts:
            - mountPath: /alicoud-k8s-host
              name: ${jobname}       
          hostNetwork: true
          hostPID: true
          restartPolicy: Never
          schedulerName: default-scheduler
          securityContext: {}
          tolerations:
          - effect: NoSchedule
            key: node-role.kubernetes.io/master
          volumes:
          - hostPath:
              path: /
              type: Directory
            name: ${jobname}
  2. マスターノード数および hostname の値を取得します。
    • 方法 1:

      以下のコマンドを実行します。
      $ kubectl get nodes
    • 方法 2:

      1. Container Service コンソール にログインします。
      2. Kubernetes で、左側のナビゲーションウィンドウから [クラスター] をクリックします。
      3. 対象となるクラスター名をクリックし、クラスターの詳細を表示します。その後、左側のナビゲーションウィンドウから [ノードリスト] をクリックし、ノード数および hostname の値を表示します。
  3. 以下のコマンドを実行し、job-master.yml ファイルの ${jobname} および ${hostname} の値を置き換えます。
    $ sed 's/${jobname}/cert-job-2/g; s/${hostname}/hostname/g' job-master.yml > job-master2.yml
    ここで、
    • ${jobname} は Job およびポッド名です。 この例では、この値は cert-job-2 に設定されています。
    • ${hostname} はマスターノード名です。 この例では、手順 2 で取得した hostname はマスターノード名を設定します。
  4. 以下のコマンドを実行し、Job を作成します。
    $ kubectl create -f job-master2.yml
  5. 以下のコマンドを実行して、Job ステータスを表示します。 SUCCESSFUL パラメーターの値が 1 の場合、証明書が更新されています。
    $ kubectl get job –nkube-system
  6. 手順 3 から手順 5 を繰り返し、すべてのマスターノードの証明書を更新します。

ワーカーノード証明書の手動更新

  1. 以下のコードをコピーし、job-node.yml ファイルを作成するため任意のパスに貼り付けます。
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: ${jobname}
      namespace: kube-system
    spec:
      backoffLimit: 0
      completions: ${nodesize}
      parallelism: ${nodesize}
      template:
        spec:
          activeDeadlineSeconds: 3600
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: job-name
                    operator: In
                    values:
                    - ${jobname}
                topologyKey: kubernetes.io/hostname
          containers:
          - command:
            - /renew/upgrade-k8s.sh
            - --role
            - node
            - --rootkey
            - ${key}
            image: registry.cn-hangzhou.aliyuncs.com/acs/cert-rotate:v1.0.0
            imagePullPolicy: Always
            name: ${jobname}
            securityContext:
              privileged: true
            volumeMounts:
            - mountPath: /alicoud-k8s-host
              name: ${jobname}
          hostNetwork: true
          hostPID: true
          restartPolicy: Never
          schedulerName: default-scheduler
          securityContext: {}
          volumes:
          - hostPath:
              path: /
              type: Directory
            name: ${jobname}
    ワーカーノードにテイントがある場合、job-node.yml ファイルのテイントに対応するtolerations を追加する必要があります。 つまり、以下のコードを securityContext: {}volumes: の間に追加する必要があります。(テイントがあるワーカーノード数が n の場合、以下のコードを n 回追加する必要があります)
          tolerations:
          - effect: NoSchedule
            key: ${key}
            operator: Equal
            value: ${value}

    ${name} および ${value} を取得する方法は以下のようになります。

    1. 以下のコードをコピーし、taint.tml ファイルを作成するため任意のパスに貼り付けます。
      {{printf "%-50s %-12s\n" "Node" "Taint"}}
      {{- range .items}}
          {{- if $taint := (index .spec "taints") }}
              {{- .metadata.name }}{{ "\t" }}
              {{- range $taint }}
                  {{- .key }}={{ .value }}:{{ .effect }}{{ "\t" }}
              {{- end }}
              {{- "\n" }}
          {{- end}}
      {{- end}}
    2. 以下のコマンドを実行し、テイントを持つワーカーノードに対する ${name} の値および ${value} の値を表示します。
      $ kubectl get nodes -o go-template-file="taint.tml"
  2. 以下のコマンドを実行し、クラスター CAKey を取得します。
    $ sed '1d' /etc/kubernetes/pki/ca.key | base64 -w 0
  3. 以下のコマンドを実行し、job-node.yml ファイルの指定された値 ${jobname}${nodesize} および ${key} を置き換えます。
    $ sed 's/${jobname}/cert-node-2/g; s/${nodesize}/nodesize/g; s/${key}/key/g' job-node.yml > job-node2.yml
    ここで、
    • ${jobname} の値は、Job およびポッド名です。 この例では、この変数の値は cert-node-2 に設定されます。
    • ${nodesize} の値は、ワーカーノード数です。 この値の取得方法に関しては、マスターノード証明書の手動更新の手順 2 をご参照ください。 nodesize をクラスターワーカーノード数に置き換えます。
    • ${key} の値はクラスター CAKey です。 keyワーカーノード証明書を手動で更新の手順 3 で取得した CAKey と置き換えます。
  4. 以下のコマンドを実行し、Job を作成します。
    $ kubectl create –f job-node2.yml
  5. 以下のコマンドを実行して、Job ステータスを表示します。 SUCCESSFUL パラメーターの値がクラスターワーカーノード数と等しい場合、すべての証明書が更新されています。
    $ kubectl get job –nkube-system