更新ACK专有集群即将过期的证书

更新时间:
复制 MD 格式

本文介绍如何更新ACK专有集群即将过期的证书。您可以通过控制台或kubectl更新所有节点的证书,也可以手动更新MasterWorker节点证书。

说明

ACK会自动更新ACK托管集群Master节点的证书,无需您手动处理。

通过控制台更新所有节点证书

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 单击证书即将过期集群右侧的更新证书,进入更新证书页面。

    说明

    如果集群证书即将在两个月左右过期,会出现更新证书

    在集群列表中找到目标集群,单击其右侧操作列中的更新证书

  3. 更新证书页面,单击更新证书,按照页面指引完成证书的更新。

    成功更新集群证书后,您可以看到以下内容:

    • 更新证书页面,显示更新成功

    • 集群列表页面,目标集群没有更新证书提示。

通过kubectl自动更新所有节点证书

更新证书

在集群任意Master节点,执行以下命令完成集群所有节点的证书更新。

curl http://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/cert-update/renew.sh | bash

结果验证

需已通过kubectl连接集群,请参见通过kubectl连接Kubernetes集群
  1. 执行以下命令,查看集群MasterWorker节点状态。

    kubectl get nodes
    [root@xxx ~]# kubectl get nodes
    NAME                      STATUS    ROLES     AGE       VERSION
    cn-hangzhou.xxx           Ready     <none>    23d       v1.11.2
    cn-hangzhou.xxx           Ready     <none>    23d       v1.11.2
    cn-hangzhou.xxx           Ready     master    47d       v1.11.2
    cn-hangzhou.xxx           Ready     master    47d       v1.11.2
    cn-hangzhou.xxx           Ready     master    47d       v1.11.2
    cn-hangzhou.xxx           Ready     <none>    47d       v1.11.2
    cn-hangzhou.xxx           Ready     <none>    47d       v1.11.2
    [root@xxx ~]#
  2. 执行以下命令,当Master节点对应的COMPLETIONS均为1,Worker节点对应的COMPLETIONS为集群Worker节点数时,所有证书完成更新。

    kubectl -n kube-system get job
    [root@                              ~]# kubectl get job -nkube-system
    NAME                                  COMPLETIONS   DURATION   AGE
    aliyun-cert-renew-master-1            1/1           46s        4m49s
    aliyun-cert-renew-master-2            1/1           28s        4m19s
    aliyun-cert-renew-master-3            1/1           26s        3m48s
    aliyun-cert-renew-worker              6/6           46s        3m18s
    ingress-nginx-admission-create        1/1           29s        3d
    ingress-nginx-admission-patch         1/1           43s        3d
    kube-eventer-init-1.5-5e0e7cl-aliyun  1/1           31s        3d

手动更新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节点个数和节点名称等信息。

    • 方法一:通过命令行

      执行以下命令:

      kubectl get nodes
      [root@xxx            ~]# kubectl get nodes
      NAME               STATUS    ROLES     AGE    VERSION
      cn-hangzhou.ixxx   Ready     <none>    22d    v1.11.2
      cn-hangzhou.ixxx   Ready     <none>    22d    v1.11.2
      cn-hangzhou.ixxx   Ready     master    46d    v1.11.2
      cn-hangzhou.ixxx   Ready     master    46d    v1.11.2
      cn-hangzhou.ixxx   Ready     master    46d    v1.11.2
      cn-hangzhou.ixxx   Ready     <none>    46d    v1.11.2
      cn-hangzhou.ixxx   Ready     <none>    46d    v1.11.2
      [root@xxx            ~]#
    • 方法二:通过控制台

      1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

      2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情

      3. 在集群管理页的左侧导航栏中,选择节点管理 > 节点获取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节点的证书更新。

    [root@xxx ~]# kubectl get job -nkube-system
    NAME          COMPLETIONS   DURATION   AGE
    cert-job-2    1/1           46s        22m
    cert-job-3    1/1           28s        2m
    cert-job-4    1/1           26s        1m
    [root@xxx ~]#

手动更新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文件中增加对该Tainttolerations,即在securityContext: {}volumes:之间增加以下内容(若有n个带有TaintWorker节点,请复制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. 执行以下命令,查询带有TaintWorker节点的${name}${value}

      kubectl get nodes -o go-template-file="taint.tml"
      [root@xxx                       ~]# kubectl get nodes -o go-template-file="taint.tml"
      Node                              Taint
      cn-hangzhou.i-xxx                 key1=value1:NoSchedule
      cn-hangzhou.i-xxx                 node-role.kubernetes.io/master=<no value>:NoSchedule
      cn-hangzhou.i-xxx                 node-role.kubernetes.io/master=<no value>:NoSchedule
      cn-hangzhou.i-xxx                 node-role.kubernetes.io/master=<no value>:NoSchedule
  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
    [root@xxx ~]# kubectl get job -nkube-system
    NAME          COMPLETIONS   DURATION   AGE
    cert-job-2    1/1           46s        1h
    cert-job-3    1/1           28s        47m
    cert-job-4    1/1           26s        46m
    cert-node-2   4/4           46s        1m
    [root@xxx ~]#