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

前提条件

控制台更新所有节点证书

在容器服务管理控制台,单击目标集群的更新证书更新即将过期的证书,请参考更新即将过期证书

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

登录集群任意master节点,执行以下命令完成集群所有节点的证书更新。
$ curl http://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/cert-update/renew.sh | bash
执行结果
  1. 执行以下命令,查看集群master和worker节点状态。
    $ kubectl get nodes


  2. 执行以下命令,当master节点对应的SUCCESSFUL均为1,worker节点对应的SUCCESSFUL为集群worker节点数时,所有证书完成更新。
    $ kubectl get job –nkube-system


手动更新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


    • 方法二:

      1. 登录容器服务管理控制台
      2. 在Kubernetes菜单下,单击左侧导航栏的集群 > 集群,进入集群列表页面。

      3. 选择目标集群,单击集群名称,查看集群详细信息,单击左侧导航栏的节点列表获取master个数和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和Pod的名称,此处设置为cert-job-2
    • ${hostname}为集群master节点的名称,此处请将hostname替换为步骤2中查看到的master名称。
  4. 执行以下命令创建Job。
    $ kubectl create -f job-master2.yml
  5. 执行以下命令查看Job状态,当SUCCESSFUL均为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和Pod的名称,此处设置为cert-node-2
    • ${nodesize}为worker节点个数,获取方法可参考手动更新master节点证书的步骤2。此处请将nodesize替换为集群的worker个数。
    • ${key}为集群的CAKey,此处请将key替换为手动更新worker节点证书步骤3获取到的CAKey。
  4. 执行以下命令创建 Job。
    $ kubectl create –f job-node2.yml
  5. 执行以下命令查看Job状态,当SUCCESSFUL为集群worker节点数时,证书完成更新。
    $ kubectl get job –nkube-system