在CoreDNS组件的升级过程中,ACK会进行CoreDNS配置文件即Corefile的配置迁移,同时进行CoreDNS容器组的重建。整个升级过程中,您可能会遇到部分DNS解析请求失败或者超时的情况。本文介绍CoreDNS升级前的检查和优化操作,以降低DNS解析请求失败或者超时的可能性。

前提条件

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

升级CoreDNS过程说明

CoreDNS升级过程中,ACK会用新版本的YAML模板覆盖您集群中旧版本的CoreDNS YAML模板,只有以下类型变更会被保留:
  • CoreDNS的副本数。
  • CoreDNS配置项,即ConfigMap coredns

从1.7.0版本起,CoreDNS的默认内存限制会被调整至2 GB,正常情况下不会出现Pod内存溢出OOM(Out of Memory)情况,无需对内存限制再次修改。

若您此前对YAML模板进行手动自定义变更,修改了容忍Toleration、内存和CPU的资源请求和限制等字段,将会被覆盖。针对这种情况,您可以手动升级CoreDNS,或者在自动升级CoreDNS后再次更新YAML模板内容。具体操作,请参见【组件升级】CoreDNS升级公告

升级CoreDNS组件前,进行以下操作可降低DNS解析请求失败或者超时的可能性:

配置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

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

      yum install -y ipvsadm
    2. 在集群任意一台ECS节点中执行以下命令查看第三个数字。
      ipvsadm -L --timeout
      如果输出结果中第三个数字是10,则说明IPVS类型集群的UDP超时时间变更成功。
      说明 变更成功后,请观察至少五分钟后再进行下一步操作。

K8s 1.16及以下版本集群

此类版本集群的kube-proxy不支持udpTimeout参数,推荐使用OOS服务批量在所有集群机器上执行ipvsadm命令以调整UDP超时时间配置。命令如下:
yum install -y ipvsadm
ipvsadm -L --timeout > /tmp/ipvsadm_timeout_old
ipvsadm --set 900 120 10
ipvsadm -L --timeout > /tmp/ipvsadm_timeout_new
diff /tmp/ipvsadm_timeout_old /tmp/ipvsadm_timeout_new

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

配置Kube-DNS服务

控制台操作方式

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择网络 > 服务
  5. 在kube-system命名空间下,单击服务kube-dns右侧的查看YAML
  • 如果发现sessionAffinity字段为None,则无需进行以下步骤。
  • 如果发现sessionAffinityClientIP,则进行以下步骤。
  1. 删除sessionAffinitysessionAffinityConfig及所有子键,然后单击更新
    // 删除以下所有内容。
    sessionAffinity: ClientIP
      sessionAffinityConfig:
        clientIP:
          timeoutSeconds: 10800
  2. 再次单击服务kube-dns右侧的查看YAML,校验sessionAffinity字段是否为None,为None则Kube-DNS服务变更成功。

命令行操作方式

  1. 执行以下命令查看kube-dns服务配置信息。
    kubectl -n kube-system get svc kube-dns -o yaml
  • 如果发现sessionAffinity字段为None,则无需执行以下步骤。
  • 如果发现sessionAffinityClientIP,则执行以下步骤。
  1. 执行以下命令打开并编辑名为kube-dns的服务。
    kubectl -n kube-system edit service kube-dns
  2. 删除sessionAffinity相关设置(sessionAffinitysessionAffinityConfig及所有子键),并保存退出。
    // 删除以下所有内容。
    sessionAffinity: ClientIP
      sessionAffinityConfig:
        clientIP:
          timeoutSeconds: 10800
  3. 修改完成后,再次运行以下命令查看sessionAffinity字段是否为None,为None则Kube-DNS服务变更成功。
    kubectl -n kube-system get svc kube-dns -o yaml

配置CoreDNS优雅退出

说明 CoreDNS刷新配置过程中,可能会占用额外内存。修改CoreDNS配置项后,请观察Pod运行状态,如果出现Pod内存不足的情况,请及时修改CoreDNS Deployment中容器内存限制,建议将内存调整至2 GB。

控制台操作方式

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择配置管理 > 配置项
  5. 在kube-system命名空间下,单击配置项coredns右侧的YAML编辑
  6. 参考下列的YAML文件,保证health插件开启,并调整lameduck参数为15s,然后单击确定
    .:53 {
            errors       
            // health插件在不同的CoreDNS版本中可能有不同的设置情形。
            // 情形一:默认未启用health插件。   
            // 情形二:默认启用health插件,但未设置lameduck时间。
            health      
            // 情形三:默认启用health插件,设置了lameduck时间为5秒。   
            health {
                lameduck 5s
            }      
            // 对于以上三种情形,应统一修改成以下,调整lameduck参数为15秒。
            health {
                lameduck 15s
            }       
            // 其它插件不需要修改,此处省略。
        }
    如果CoreDNS Pod正常运行则说明CoreDNS优雅退出的配置更新成功。如果CoreDNS Pod出现异常,可以通过查看Pod事件及日志定位原因。

命令行操作方式

  1. 执行以下命令打开CoreDNS配置文件。
    kubectl -n kube-system edit configmap coredns
  2. 参考下列的YAML文件,保证health插件开启,并调整lameduck参数为15s
    .:53 {
            errors     
            // health插件在不同的CoreDNS版本中可能有不同的设置情形。
            // 情形一:默认未启用health插件。     
            // 情形二:默认启用health插件,但未设置lameduck时间。
            health
            // 情形三:默认启用health插件,设置了lameduck时间为5秒。   
            health {
                lameduck 5s
            }
            // 对于以上三种情形,应统一修改成以下,调整lameduck参数为15秒。
            health {
                lameduck 15s
            }
            // 其它插件不需要修改,此处省略。
        }
  3. 修改CoreDNS配置文件后保存退出。
    如果CoreDNS正常运行则说明CoreDNS优雅退出的配置更新成功。如果CoreDNS Pod出现异常,可以通过查看Pod事件及日志定位原因。