容器服务 CoreDNS ServiceAccount Token 过期问题解决方案

在 Kubernetes 1.22 及以上版本中,Pod 不再使用 ServiceAccount 绑定的 Secret Token,而是使用 kubelet 周期性申请的 Token。该 Token 默认有效期为一年,Token 过期后不会自动更新。

相关产品
容器服务 产品页,含版本规格、价格与购买入口。

一、问题影响

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 平滑升级。

赞 (0)
上一篇 4天前
下一篇 4天前