如果您在容器服务ACK控制台的组件管理页面CoreDNS组件上无法看到升级按钮,且当前组件版本较低,说明您的集群无法进行CoreDNS的自动升级。针对无法自动升级CoreDNS的情况,您可以手动升级CoreDNS。本文介绍CoreDNS手动升级的操作步骤。
升级CoreDNS过程说明
- 如果您使用了IPVS作为kube-proxy负载均衡模式,在CoreDNS升级完成后,您可能会遇到五分钟内全集群范围内的解析超时或失败的情况,通过以下任意方式可以降低IPVS缺陷的影响:
- 升级过程约2分钟,实际耗时可能和集群中CoreDNS副本数相关。如果遇到新副本无法调度或启动的情况,可提交工单咨询。旧的副本不会被停止,不影响业务解析。
手动升级
- 确认集群版本与CoreDNS版本的兼容性。
您需要先确认集群版本号,然后再确认与CoreDNS 1.6.2版本的兼容性。ACK Kubernetes集群版本与CoreDNS 1.6.2版本兼容情况如下表(Kubernetes 1.11/1.12/1.14/1.16均兼容CoreDNS
1.6.2版本)。
版本 |
兼容信息 |
Kubernetes版本 |
1.11 |
1.12 |
1.14 |
1.16 |
CoreDNS |
1.6.2 |
1.6.2 |
1.6.2 |
1.6.2 |
确认集群版本号的操作步骤如下:
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表中,找到目标集群,然后查看集群Kubernetes版本。
- 确认集群CoreDNS的版本。
- 变更CoreDNS配置项。
1.6.2版本CoreDNS废弃了Proxy插件,使用
forward来替代。您需要先将
kube-system命名空间下的配置项
coredns内的
proxy字段替换为
forward字段。
- 查看CoreDNS Pod的标准输出是否正常重新加载了配置(热加载新配置一般需要30s)。
- 执行以下命令,查看集群内的CoreDNS Pod,确定其是否处于运行状态。
kubectl get pods -n kube-system | grep coredns
预期输出:
coredns-78d4b8bd88-6g62w 1/1 Running 0 9d
coredns-78d4b8bd88-n6wjm 1/1 Running 0 9d
- 执行以下命令,查看CoreDNS Pod的日志。
kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system
预期输出:
.: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
预期输出中包含plugin/reload
信息,说明加载了CoreDNS配置。
- 变更CoreDNS应用内镜像版本到1.6.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及以上版本集群
控制台操作方式
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择。
- 在顶部选择kube-system命名空间,然后单击配置项kube-proxy-worker右侧的YAML编辑。
- 在查看YAML面板中的ipvs字段下,添加
udpTimeout: 10s
,然后单击确定。apiVersion: v1
data:
config.conf: |
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
// 其它不相关字段已省略。
mode: ipvs
// 如果ipvs键不存在,需要添加此键。
ipvs:
udpTimeout: 10s
- 重建所有名为kube-proxy-worker的容器。
- 在集群管理页左侧导航栏中,选择。
- 在守护进程集列表中,找到并单击kube-proxy-worker。
- 在kube-proxy-worker页面中的容器组页签下对应容器组右侧,选择,然后单击确定。
重复操作删除所有容器组。删除容器组后,系统会自动重建所有容器。
- 验证UDP超时时间的配置是否成功。
- 执行以下命令安装ipvsadm。
ipvsadm是IPVS模块的管理工具。更多信息,请参见ipvsadm。
yum install -y ipvsadm
- 在集群任意一台ECS节点中执行以下命令查看第三个数字。
如果输出结果中第三个数字是10,则说明IPVS类型集群的UDP超时时间变更成功。
说明 变更成功后,请观察至少五分钟后再进行下一步操作。
命令行操作方式
- 执行以下命令修改kube-proxy的配置文件kube-proxy-worker。
kubectl -n kube-system edit configmap kube-proxy-worker
- 在kube-proxy配置文件中的ipvs字段下,添加
udpTimeout: 10s
并保存退出。apiVersion: v1
data:
config.conf: |
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
// 其它不相关字段已省略。
mode: ipvs
// 如果ipvs键不存在,需要添加此键。
ipvs:
udpTimeout: 10s
- 执行以下命令重建所有名为kube-proxy-worker的容器。
- 执行以下命令查看存在的容器组信息。
kubectl -n kube-system get pod -o wide | grep kube-proxy-worker
- 执行以下命令删除上步骤中查看所有容器,系统将会自动重建名为kube-proxy-worker容器。
kubectl -n kube-system delete pod <kube-proxy-worker-****>
说明 将<kube-proxy-worker-****>替换为上述打印的所有容器组名称。
- 验证UDP超时时间的配置是否成功。
- 执行以下命令安装ipvsadm。
ipvsadm是IPVS模块的管理工具。更多信息,请参见ipvsadm。
yum install -y ipvsadm
- 在集群任意一台ECS节点中执行以下命令查看第三个数字。
如果输出结果中第三个数字是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的批量操作实例介绍,请参见批量操作实例。
后续步骤
升级完成后,您可以对CoreDNS进行优化,合理配置CoreDNS。具体操作,请参见合理配置CoreDNS。