CoreDNS手动升级

如果您在容器服务ACK控制台的组件管理页面CoreDNS组件上无法看到升级按钮,且当前组件版本较低,说明您的集群无法进行CoreDNS的自动升级。针对无法自动升级CoreDNS的情况,您可以手动升级CoreDNS。本文介绍CoreDNS手动升级的操作步骤。

前提条件

已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

升级前须知

  • 如果您使用了IPVS作为kube-proxy负载均衡模式,在CoreDNS升级完成后,您可能会遇到五分钟内全集群范围内的解析超时或失败的情况,通过以下任意方式可以降低IPVS缺陷的影响:

  • 升级过程约2分钟,实际耗时可能和集群中CoreDNS副本数相关。如果遇到新副本无法调度或启动的情况,可提交工单咨询。旧的副本不会被停止,不影响业务解析。

查看当前CoreDNS版本

使用控制台

  1. 登录容器服务管理控制台

  2. 在控制台左侧导航栏中,单击集群

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

  4. 在集群管理页面左侧导航栏选择工作负载 > 无状态

  5. 无状态页面顶部设置命名空间为kube-system,然后查看CoreDNS的版本。dns

使用kubectl

您可执行以下命令查看当前CoreDNS版本:

kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"

预期输出:

registry-vpc.cn-hangzhou.aliyuncs.com/acs/coredns:1.6.2 # 1.6.2为示例中的版本

确认升级目标版本

在升级前,请您确认目标CoreDNS版本。CoreDNS与集群版本的兼容性如下,建议您使用兼容集群的最新CoreDNS版本。

Kubernetes版本

CoreDNS版本

[1.11, 1.16]

v1.6.2

1.14.8之后版本至1.22之前版本

v1.6.7、v1.7.0

1.20.4之后版本

v1.8.4、v1.9.3

重要

v1.8.4及v1.9.3有多个子版本,例如v1.8.4.3-644f4735-aliyunv1.9.3.1-5e7ba42d-aliyun等。详细信息请参见CoreDNS

手动升级

使用控制台

  1. (可选)使用forward字段替换proxy字段。

    CoreDNS v1.6.2版本中废弃了Proxy插件。从v1.6.2之前的版本升级到v1.6.2及之后的版本时,您需要参照下方步骤,手动更改CoreDNS配置。

    更改CoreDNS配置

    1. 登录容器服务管理控制台

    2. 在控制台左侧导航栏中,单击集群

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

    4. 在集群管理页面左侧导航栏选择配置管理 > 配置项

    5. 配置项页面顶部设置命名空间为kube-system,然后单击coredns右侧操作列下的YAML编辑

    6. 查看YAML面板,将proxy修改为forward,然后单击确定forward

  2. 更新CoreDNS镜像版本。

    1. 登录容器服务管理控制台

    2. 在控制台左侧导航栏中,单击集群

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

    4. 在集群管理页面左侧导航栏选择工作负载 > 无状态

    5. 无状态页面顶部设置命名空间为kube-system,找到coredns,然后在其右侧选择更多 > 查看Yaml

    6. 编辑YAML页面,更新image字段中的版本。然后单击更新image

  3. 确认升级成功

    1. 执行以下命令,查看当前CoreDNS版本。

      kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"

      预期输出:

      registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/coredns:v1.9.3.10-5e7ba42d-aliyun
    2. 执行以下命令查看集群内所有CoreDNS Pod是否都处于Running状态。

      kubectl get pods -n kube-system | grep coredns

      预期输出:

      coredns-78d4b8****-6g62w                           1/1     Running   0          9d
      coredns-78d4b8****-n6wjm                           1/1     Running   0          9d

使用kubectl

  1. (可选)使用forward字段替换proxy字段。

    CoreDNS v1.6.2版本中废弃了Proxy插件。从v1.6.2之前的版本升级到v1.6.2及之后的版本时,您需要参照下方步骤,手动更改CoreDNS配置。

    更改CoreDNS配置

    1. 执行以下命令编辑CoreDNS配置文件,将proxy修改为forward,然后保存退出。

      kubectl edit configmap/coredns -n kube-system
    2. 执行以下命令,查看CoreDNS Pod的日志,确认CoreDNS是否正常重新加载配置。

      kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system

      预期输出如下。其中包含plugin/reload,则表明CoreDNS配置重新加载成功。

      .:53
      [INFO] plugin/reload: Running configuration MD5 = 71c5f1ff539d304c630521f315dc2ac2
      CoreDNS-1.6.7
      linux/amd64, go1.13.6, da7f65b
      [INFO] 127.0.0.1:48329 - 42313 "HINFO IN 1108347002237365533.4506541768939609094. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.008874794s
  2. 执行以下命令,编辑CoreDNS配置,更新image字段中的版本,然后保存退出。

    kubectl edit deployment/coredns -n kube-system
  3. 确认升级成功

    1. 执行以下命令,查看当前CoreDNS版本。

      kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"

      预期输出:

      registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/coredns:v1.9.3.10-5e7ba42d-aliyun
    2. 执行以下命令查看集群内所有CoreDNS Pod是否都处于Running状态。

      kubectl get pods -n kube-system | grep coredns

      预期输出:

      coredns-78d4b8****-6g62w                           1/1     Running   0          9d
      coredns-78d4b8****-n6wjm                           1/1     Running   0          9d

配置IPVS类型集群的UDP超时时间

如果您的ACK集群使用了kube-proxy IPVS模式,IPVS的会话保持策略会导致整个集群在升级完成后五分钟内出现概率性解析失败的问题。您可以按以下方式降低IPVS UDP类型的会话保持超时时间至10秒,以减少解析失败的次数。如果您ACK集群中包含UDP类型的业务,需要您提前评估该操作是否有影响再执行该操作。如果您无法评估,您可以提交工单咨询。

说明

如果您的集群不是IPVS类型,请忽略配置IPVS类型集群的UDP超时时间的操作。关于如何查看kube-proxy代理模式,请参见查看集群信息

K8s 1.18及以上版本集群

控制台操作方式

  1. 登录容器服务管理控制台

  2. 在控制台左侧导航栏,单击集群

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

  4. 在集群管理页左侧导航栏,选择配置管理 > 配置项

  5. 在顶部选择kube-system命名空间,然后单击配置项kube-proxy-worker右侧的YAML编辑

  6. 查看YAML面板中的ipvs字段下,添加udpTimeout: 10s,然后单击确定

    apiVersion: v1
    data:
      config.conf: |
        apiVersion: kubeproxy.config.k8s.io/v1alpha1
        kind: KubeProxyConfiguration
        # 其它不相关字段已省略。
        mode: ipvs
        # 如果ipvs键不存在,需要添加此键。
        ipvs:
          udpTimeout: 10s
  7. 重建所有名为kube-proxy-worker的容器。

    1. 在集群管理页左侧导航栏中,选择工作负载 > 守护进程集

    2. 在守护进程集列表中,找到并单击kube-proxy-worker

    3. kube-proxy-worker页面中的容器组页签下对应容器组右侧,选择更多 > 删除,然后单击确定

      重复操作删除所有容器组。删除容器组后,系统会自动重建所有容器。

  8. 验证UDP超时时间的配置是否成功。

    1. 执行以下命令安装ipvsadm

      ipvsadm是IPVS模块的管理工具。更多信息,请参见ipvsadm

      sudo yum install -y ipvsadm
    2. 在集群任意一台ECS节点中执行以下命令查看第三个数字。

      sudo ipvsadm -L --timeout

      如果输出结果中第三个数字是10,则说明IPVS类型集群的UDP超时时间变更成功。

      说明

      变更成功后,请观察至少五分钟后再进行下一步操作。

命令行操作方式

  1. 执行以下命令修改kube-proxy的配置文件kube-proxy-worker

    kubectl -n kube-system edit configmap kube-proxy-worker
  2. 在kube-proxy配置文件中的ipvs字段下,添加udpTimeout: 10s并保存退出。

    apiVersion: v1
    data:
      config.conf: |
        apiVersion: kubeproxy.config.k8s.io/v1alpha1
        kind: KubeProxyConfiguration
        # 其它不相关字段已省略。
        mode: ipvs
        # 如果ipvs键不存在,需要添加此键。
        ipvs:
          udpTimeout: 10s
  3. 执行以下命令重建所有名为kube-proxy-worker的容器。

    1. 执行以下命令查看存在的容器组信息。

      kubectl -n kube-system get pod -o wide | grep kube-proxy-worker
    2. 执行以下命令删除上步骤中查看所有容器,系统将会自动重建名为kube-proxy-worker容器。

      kubectl -n kube-system delete pod <kube-proxy-worker-****>
      说明

      将<kube-proxy-worker-****>替换为上述打印的所有容器组名称。

  4. 验证UDP超时时间的配置是否成功。

    1. 执行以下命令安装ipvsadm

      ipvsadm是IPVS模块的管理工具。更多信息,请参见ipvsadm

      sudo yum install -y ipvsadm
    2. 在集群任意一台ECS节点中执行以下命令查看第三个数字。

      sudo ipvsadm -L --timeout

      如果输出结果中第三个数字是10,则说明IPVS类型集群的UDP超时时间变更成功。

      说明

      变更成功后,请观察至少五分钟后再进行下一步操作。

K8s 1.16及以下版本集群

此类版本集群的kube-proxy不支持udpTimeout参数,推荐使用OOS服务批量在所有集群机器上执行ipvsadm命令以调整UDP超时时间配置。命令如下:

sudo yum install -y ipvsadm
sudo ipvsadm -L --timeout > /tmp/ipvsadm_timeout_old
sudo ipvsadm --set 900 120 10
sudo ipvsadm -L --timeout > /tmp/ipvsadm_timeout_new
diff /tmp/ipvsadm_timeout_old /tmp/ipvsadm_timeout_new

关于OOS的批量操作实例介绍,请参见批量操作实例

后续步骤

升级完成后,您可以对CoreDNS进行优化,合理配置CoreDNS。具体操作,请参见合理配置CoreDNS