一、问题影响
TKE 服务中 CoreDNS 1.6.2 及以下版本不会自动加载 Token,导致运行时间超过1年的 CoreDNS 访问 apiserver 鉴权失败,无法获取到 service/endpoint 最新的变更事件,导致用户可能受到的影响如下:
1. 业务使用 service 做服务发现,新建的 service 域名无法正常解析。
2. 业务使用 headless service 做服务发现,workload 发生变更后,headless service 域名不会解析到最新 pod ip 地址,会影响到存量业务访问。
二、问题原因
CoreDNS 1.6.2 版本使用了 v11.0.0 版本的 client-go,不会重新加载 Token,导致运行时间超过1年的 coredns,访问 apiserver 鉴权失败,无法获取到 service/endpoint 最新的变更事件。
三、修复方案
针对这些集群,你需要将 CoreDNS 升级到1.8.4版本,可彻底解决该问题,具体操作方式请参见 CoreDNS 升级到 1.8.4。
注意:CoreDNS 升级影响如下:
注意:1. iptables 模式下,kube-proxy 会在同步 iptables 规则后及时清理遗留的 conntrack 表项,CoreDNS 升级不会影响用户集群。
注意:2. ipvs 模式下,内核默认打开会话保持特性,这会导致在 CoreDNS 升级或重启期间,业务侧的 DNS 解析请求,在5分钟(300s)内概率性超时。如果业务自身没有 UDP 服务,可以降低 IPVS UDP 协议的会话保持超时时间,以此来减少解析超时的持续时间。
注意:具体详情请参见 配置 CoreDNS 平滑升级。
四、临时修复
如果你短期内无法升级 CoreDNS 版本,可以通过重建 CoreDNS 的 pod 临时修复,CoreDNS 会默认加载 1 年的有效期,具体操作方式如下(此方案仅为临时修复方案,请尽快通过升级方式彻底解决)。
TKE 集群TKE Serverless 集群
·针对 TKE 集群,当 kube-proxy 是 iptables 模式时,可以通过重新部署 CoreDNS,触发 CoreDNS 滚动更新修复问题。操作步骤如下:
1.1 选择集群 > 工作负载 > Deployment,在 kube-system ns 下选择 coredns,单击设置更新策略。如下:
配置更新策略如下:
1.2 单击重新部署。如下:
·当 kube-proxy 是 ipvs 模式时,如果希望 CoreDNS 实现平滑升级,不出现域名解析超时或者尽量减少服务不可用时间,可以通过配置 CoreDNS 平滑升级,具体指引请参见 配置 CoreDNS 平滑升级。
针对 TKE Serverless 集群,操作步骤如下:1. 选择集群 > 工作负载 > Deployment,在 kube-system ns 下选择 coredns,单击设置更新策略。如下:配置更新策略如下:2. 单击重新部署。如下:
五、1. 为什么做这次修复变更?
低版本 CoreDNS 存在 Token 过期隐患,会导致用户 service 访问异常。
六、2. 这个隐患会有什么影响?
当证书到期后,CoreDNS 将无法连接到 apiserver,这会导致集群内的 pod 的 service 服务发现出现异常。具体表现为:
1. 业务使用 service 做服务发现,新建的 service 域名无法正常解析。
2. 业务使用 headless service 做服务发现,workload 发生变更后,headless service 域名不会解析到最新 pod ip 地址,会影响到存量业务访问。
七、3. 如何进行平滑升级?
具体指引请参见 配置 CoreDNS 平滑升级。