本文介绍CoreDNS升级前的检查和优化操作,以及自动升级的步骤。
前提条件
已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
升级CoreDNS过程说明
CoreDNS升级过程中,ACK会用新版本的YAML模板覆盖您集群中旧版本的CoreDNS YAML模板,其中CoreDNS的配置文件会被自动升级,但CoreDNS的副本数不会变化。
若您此前对YAML模板进行手动自定义变更,修改了容忍Toleration、内存和CPU的资源请求和限制等字段,将会被覆盖。针对这种情况,您可以手动升级CoreDNS,或者在自动升级CoreDNS后再次更新YAML模板内容。关于如何手动升级,请参见CoreDNS手动升级。
如果您使用了IPVS作为kube-proxy负载均衡模式,在CoreDNS升级完成后,您可能会遇到五分钟内全集群范围内的解析超时或失败的情况,通过以下任意方式可以降低IPVS缺陷的影响:
修改kube-proxy中IPVS UDP会话保持的超时时间,具体操作,请参见如何修改kube-proxy中IPVS UDP会话保持的超时时间?。
使用节点DNS缓存NodeLocal DNSCache,具体操作,请参见使用节点DNS缓存NodeLocal DNSCache。
如果集群节点采用Alibaba Cloud Linux 2,建议您将节点内核升级至4.19.91-25.1.al7.x86_64或更新版本,关于Alibaba Cloud Linux 2的版本记录,请参见Alibaba Cloud Linux 2镜像发布记录。
如果集群节点采用其它操作系统,您可以配置IPVS类型集群的UDP超时时间避免此问题。具体操作,请参见配置IPVS类型集群的UDP超时时间。
如果您不希望执行上述操作,可以将所有业务容器接入NodeLocal DNSCache后再进行CoreDNS升级。具体操作,请参见使用NodeLocal DNSCache。
升级过程约2分钟,实际耗时可能和集群中CoreDNS副本数相关。如果遇到新副本无法调度或启动的情况,可提交工单咨询。但旧的副本不会被停止,因此不影响业务解析,升级十分钟内系统会自动回滚。
开启ready
插件
如果您之前有手动升级CoreDNS且当前CoreDNS版本大于1.5.0,那您在自动升级CoreDNS之前,需要检查CoreDNS配置文件是否已经开启ready
插件。如果配置文件中没有ready
插件,您需要开启ready
插件,然后再进行自动升级CoreDNS操作,否则CoreDNS将无法正常启动。
登录容器服务管理控制台。
在控制台左侧导航栏,单击集群。
在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群管理页左侧导航栏,选择 。
在配置项页面顶部设置命名空间为kube-system,然后单击coredns右侧操作列下的YAML编辑。
在查看YAML面板检查是否有
ready
字段,如果没有,请添加ready
字段,然后单击确定。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready #如果没有这一行,请增加本行,注意缩进与kubernetes保持一致。 kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop log reload loadbalance }
执行以下命令,检查CoreDNS Pod的标准输出是否加载了CoreDNS配置。热加载新配置一般需要30s。
kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system
预期输出中包含
plugin/reload
信息,说明加载了CoreDNS配置。
开始升级
您可以通过控制台的组件管理入口进行CoreDNS的版本升级。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,搜索CoreDNS,然后单击升级。
配置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。
sudo yum install -y ipvsadm
在集群任意一台ECS节点中执行以下命令查看第三个数字。
sudo ipvsadm -L --timeout
如果输出结果中第三个数字是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。
sudo yum install -y ipvsadm
在集群任意一台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。