问题影响
在 Kubernetes 1.22 及以上版本中,Pod 不再使用 ServiceAccount 绑定的 Secret Token,而是使用 kubelet 周期性申请的 Token。该 Token 默认有效期为一年,Token 过期后不会自动更新,详情请参见 1.21 CHANGELOG。
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. iptables 模式下,kube-proxy 会在同步 iptables 规则后及时清理遗留的 conntrack 表项,CoreDNS 升级不会影响用户集群。
2. ipvs 模式下,内核默认打开会话保持特性,这会导致在 CoreDNS 升级或重启期间,业务侧的 DNS 解析请求,在5分钟(300s)内概率性超时。如果业务自身没有 UDP 服务,可以降低 IPVS UDP 协议的会话保持超时时间,以此来减少解析超时的持续时间。
临时修复
如果您短期内无法升级 CoreDNS 版本,可以通过重建 CoreDNS 的 pod 临时修复,CoreDNS 会默认加载 1 年的有效期,具体操作方式如下(此方案仅为临时修复方案,请尽快通过升级方式彻底解决)。
针对 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 地址,会影响到存量业务访问。