本文介绍如何更新专有版集群即将过期的证书。您可以通过控制台操作,也可以通过命令行自动化一键式更新所有节点证书,也可以手动更新Master和Worker节点证书。

前提条件

控制台更新所有节点证书

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 单击证书即将过期集群右侧的更新证书,进入更新证书页面。
    说明 如果集群证书即将在两个月左右过期,会出现更新证书
    更新证书
  4. 更新证书页面单击更新证书
  5. 提示页面单击确定
    成功更新集群证书后,您可以看到以下内容:
    • 更新证书页面,显示更新成功
    • 集群列表页面,目标集群无更新证书提示。

命令行自动更新所有节点证书

在集群任意Master节点,执行以下命令完成集群所有节点的证书更新。
curl http://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/cert-update/renew.sh | bash

结果验证:

  1. 执行以下命令,查看集群Master和Worker节点状态。
    kubectl get nodes
    nodes
  2. 执行以下命令,当Master节点对应的COMPLETIONS均为1,Worker节点对应的COMPLETIONS为集群Worker节点数时,所有证书完成更新。
    kubectl -n kube-system get job
    nodes

手动更新Master节点证书

  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. 获取集群Master节点个数和hostname
    • 方法一:通过命令行

      执行以下命令:
      kubectl get nodes
      nodes
    • 方法二:通过控制台

      1. 登录容器服务管理控制台
      2. 在控制台左侧导航栏中,单击集群
      3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      4. 在集群管理页的左侧导航栏中,选择节点管理 > 节点获取Master个数和和对应的名称、IP地址、实例ID。
  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}为集群Master节点的名称,此处请将hostname替换为步骤2中查看到的Master名称。
  4. 执行以下命令创建Job。
    kubectl create -f job-master2.yml
  5. 执行以下命令查看Job状态,当COMPLETIONS均为1时,证书完成更新。
    kubectl get job -nkube-system
  6. 重复执行步骤3~5,完成所有Master节点的证书更新。

手动更新Worker节点证书

  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}
    说明 如果Worker节点带有Taint,需要在job-node.yml文件中增加对该Taint的tolerations,即在securityContext: {}volumes:之间增加以下内容(若有n个带有Taint的Worker节点,请复制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. 执行以下命令,查询带有Taint的Worker节点的${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}为Worker节点个数,获取方法可参见手动更新Worker节点证书的步骤1。此处请将nodesize替换为集群的Worker个数。
    • ${key}为集群的CAKey,此处请将key替换为手动更新Worker节点证书步骤2获取到的CAKey。
  4. 执行以下命令创建Job。
    kubectl create -f job-node2.yml
  5. 执行以下命令查看Job状态,当COMPLETIONS为集群Worker节点数时,证书完成更新。
    kubectl get job -nkube-system
    nodes