このトピックでは、Kubernetes クラスター証明書の更新方法を紹介します。 すべてのノードの証明書を同時に更新することができます。また、対象となるマスターノードおよびワーカーノードの証明書を手動で更新することもできます。
前提条件
- Kubernetes クラスターが作成されている必要があります。 詳しくは、Kubernetes クラスターの作成 をご参照ください。
- kubectl を通じてクラスターに接続している必要があります。 詳しくは、kubectl を利用した Kubernetes クラスターへの接続 をご参照ください。
すべてのノード証明書の同時更新
マスターノードにログインし、以下のコマンドを実行します。
$ curl http://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/cert-update/renew.sh | bash
結果
- 以下のコマンドを実行して、マスターノードおよびワーカーノードのステータスを表示します。
$ kubectl get nodes
- 以下のコマンドを実行します。 それぞれのマスターノードの SUCCESSFUL パラメーターの値が 1 であり、かつ、それぞれのワーカーノードの SUCCESSFUL パラメーターの値がクラスターワーカーノードの数に等しい場合、すべての証明書が更新されています。
$ kubectl get job –nkube-system
マスターノード証明書の手動更新
- 以下のコードをコピーし、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}
- マスターノード数および hostname の値を取得します。
-
方法 1:
以下のコマンドを実行します。$ kubectl get nodes
-
方法 2:
- Container Service コンソール にログインします。
- Kubernetes で、左側のナビゲーションウィンドウから [クラスター] をクリックします。
- 対象となるクラスター名をクリックし、クラスターの詳細を表示します。その後、左側のナビゲーションウィンドウから [ノードリスト] をクリックし、ノード数および hostname の値を表示します。
-
- 以下のコマンドを実行し、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 はマスターノード名を設定します。
- 以下のコマンドを実行し、Job を作成します。
$ kubectl create -f job-master2.yml
- 以下のコマンドを実行して、Job ステータスを表示します。 SUCCESSFUL パラメーターの値が 1 の場合、証明書が更新されています。
$ kubectl get job –nkube-system
- 手順 3 から手順 5 を繰り返し、すべてのマスターノードの証明書を更新します。
ワーカーノード証明書の手動更新
- 以下のコードをコピーし、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} を取得する方法は以下のようになります。
- 以下のコードをコピーし、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}}
- 以下のコマンドを実行し、テイントを持つワーカーノードに対する ${name} の値および ${value} の値を表示します。
$ kubectl get nodes -o go-template-file="taint.tml"
- 以下のコードをコピーし、taint.tml ファイルを作成するため任意のパスに貼り付けます。
- 以下のコマンドを実行し、クラスター CAKey を取得します。
$ sed '1d' /etc/kubernetes/pki/ca.key | base64 -w 0
- 以下のコマンドを実行し、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 と置き換えます。
- 以下のコマンドを実行し、Job を作成します。
$ kubectl create –f job-node2.yml
- 以下のコマンドを実行して、Job ステータスを表示します。 SUCCESSFUL パラメーターの値がクラスターワーカーノード数と等しい場合、すべての証明書が更新されています。
$ kubectl get job –nkube-system