为存量ACK托管集群Pro版开启内部域名解析功能后,节点组件(如 kubelet、kube-proxy)可从通过负载均衡(CLB)固定 IP 地址访问 API Server 优化为通过内部域名动态解析 API Server 访问端点后直接访问,提升大规模集群中节点组件访问 API Server 的性能表现和可用性。
适用范围
仅适用于ACK托管集群Pro版,且集群版本为1.30及以上。
混合云节点池暂无法启用本功能。
以下集群已默认启用API Server内部域名,无需手动启用:
2024年11月以后新建,且版本为1.20及以上的集群。
通过DescribeClusterDetail查询,若
internal_dns_config.enabled为true,则表明已启用。
变更和影响
网络路径变更与安全组影响:
启用后,节点访问 API Server 的通信路径将从API Server负载均衡(CLB)固定 IP 地址切换为内部域名直连。
变更前(CLB 转发):节点 -> CLB IP -> API Server
变更后(内网域名直连):节点 -> (内部域名解析) -> API Server ENI
这意味着流量将绕过 CLB,直接访问API Server ENI。因此,需确保节点所在安全组与其 ENI 所在安全组之间网络互通。
公网访问依赖:启用后,API Server对外的默认路由将变更为集群 VPC。若集群配置了依赖公网地址的 OIDC Issuer URL 或外部 Webhook,需确保集群 VPC 具备公网访问能力,否则API Server将无法连接外部服务。
配置生效范围:
启用后,kubelet 和 kube-proxy 访问API Server的路径将由访问负载均衡(CLB)固定 IP 地址切换至直连 API Server ENI。
default 命名空间下的
kubernetesService Endpoints 会由指向API Server CLB IP切换为 API Server ENI IP,允许集群内的 Operator 等应用直连。
前置检查
执行操作前,请务必完成以下检查,否则会导致节点无法连接API Server。
1. 检查安全组配置
开启直连后,流量将直达 API Server 的 ENI。需确保其ENI 所在安全组规则允许直连。操作入口,请参见管理安全组。
安全组类型
检查项
操作建议
企业级安全组
入方向规则
必须显式放行,手动添加规则:允许集群 VPC 网段及所有附加网段访问 TCP 6443 端口。
普通安全组
组内互通性
若节点或容器与API Server在同一安全组,则默认互通。
若在不同安全组,需配置安全组互通或放行对应网段的 6443 端口。
检查节点及节点弹性网卡的安全组出方向,确保未禁止访问 6443 端口。
2. 检查 Webhook 与 OIDC 公网依赖
检查是否存在依赖公网 URL 的 Webhook。
kubectl get validatingwebhookconfiguration -o yaml -A | grep url kubectl get mutatingwebhookconfiguration -o yaml -A | grep url在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,单击组件管理。定位API Server并查看其配置中的OIDC相关参数,确认是否使用公网地址。
若API Server存在上述公网访问,且集群 VPC 无公网出口,需先配置用NAT网关统一公网流量出口。
3. 检查 DNS 解析配置
API Server 域名解析依赖 VPC 默认内网 DNS(100.100.2.136 和 100.100.2.138)。
默认情况:若节点使用默认 DNS 配置,无需额外操作。
自定义 DNS:若在节点或容器上配置了自定义 DNS 服务器,需确保该 DNS 服务器能将
*.aliyuncs.com或 API Server 域名转发给上述阿里云内网 DNS 进行解析。
步骤一:开启API Server内部域名解析
调用OpenAPI ModifyCluster,在集群 VPC 内创建内网解析记录。本小节以默认情况为例,即节点使用阿里云默认内网 DNS。
如节点或容器使用自建 DNS 服务器,请参见下文自定义 DNS 说明。
调用ModifyCluster,填写参数。
{ "control_plane_endpoints_config": { "internal_dns_config": { "enabled": true } } }更新过程中,API Server会自动重启。等待重启完成,通过DescribeClusterDetail查看
internal_dns_config.enabled参数取值为true,确认配置生效。
步骤二:修改 kube-proxy 配置
API Server域名生效后,将 kube-proxy 的连接地址从 IP 切换为该域名。
步骤三:验证内部域名是否生效
修改存量节点前,通过创建新节点或新 Pod 来验证域名解析是否已对新增资源生效。
在集群中扩容一个新节点,新节点的 kubelet 和 kube-proxy 将自动使用内部域名。
待节点就绪后,登录节点,通过以下命令查看其kubelet配置文件的
server地址是否为内部域名。cat /etc/kubernetes/kubelet.conf虚拟节点:
ACK Virtual Node组件需为v2.14.0及以上。
开启内部域名后,新建的ECI Pod和ACS Pod默认通过内部域名与API Server交互。
此时,新增一个Pod,Pod能够正常进入
Ready状态。
步骤四:重建存量 kube-proxy Pod 使其生效
kube-proxy 配置更新后,重建其存量 Pod 以加载新配置。
在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
命名空间选择 kube-system,定位并单击 kube-proxy-worker和kube-proxy-worker-windows,在容器组页签下,按照页面提示逐一删除其Pod,使其重建并加载新配置。
重要为确保业务平稳,需采用灰度方式分批删除,观察 Pod 重建正常后再执行后续删除。
步骤五:修改存量节点的 kubelet 配置
更新存量节点的 kubelet 配置并重启服务,完成向内部域名访问的切换。为确保集群稳定性,本小节分为单节点验证和批量运维两部分。
单节点验证。
选择一个存量节点,登录节点并执行以下命令,将 API Server 地址从 IP 切换为域名,并重启 kubelet。
{clb-ip}:当前 /etc/kubernetes/kubelet.conf 中配置的 CLB IP{cluster-id}:集群 ID{region-id}:地域 ID
# 以下为单行命令,将替换配置与重启服务合并执行 sed -i.bak 's#https://{clb-ip}:6443#https://apiserver.{cluster-id}.{region-id}.cs.aliyuncs.com:6443#g' /etc/kubernetes/kubelet.conf && systemctl restart kubelet示例如下:
sed -i.bak 's#https://10.XX.XX.1:6443#https://apiserver.c34f3cdb665954e2f8e8e40a824a*****.cn-hangzhou.cs.aliyuncs.com:6443#g' /etc/kubernetes/kubelet.conf && systemctl restart kubelet完成后,在控制台观察节点,确保处于就绪状态。
批量运维剩余节点。
单节点验证成功后,在控制台使用批量运维节点功能,对剩余的存量节点分批次进行批量操作。
在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
勾选待执行操作的节点,单击页面下方的批量运维,然后选择执行 Shell 命令。按照页面提示配置执行命令,提交批量任务的执行。
# 在执行命令的命令内容中,填入以下参数 sed -i.bak 's#https://{clb-ip}:6443#https://apiserver.{cluster-id}.{region-id}.cs.aliyuncs.com:6443#g' /etc/kubernetes/kubelet.conf && systemctl restart kubelet等待任务执行完成,观测节点状态无误后重复此操作,直至完成存量节点的更新。
附录
自定义 DNS 说明
当节点或容器配置了自建 DNS 服务器时,请参见本小节开启API Server内部域名解析。
API Server域名解析生效依赖于VPC 中默认配置的内网 DNS 解析服务地址 100.100.2.136 和 100.100.2.138。若自建 DNS 服务器需要解析该域名,需将 DNS 服务器所在的 VPC 关联到该内部域名解析范围。
操作步骤
通过 OpenAPI ModifyCluster修改集群配置,在开启 API Server访问优化的同时,通过 bind_vpcs 参数关联自建 DNS 服务器的 VPC。
本步骤默认 DNS 服务器 VPC 与集群在同一账号下。若属于不同账号,请参见跨账号关联VPC完成内网DNS解析统一管理(即步骤1到5)。
调用OpenAPI ModifyCluster,填写以下内容。
在
["vpc-id"]中填写 DNS 服务器所在的 VPC ID。数组类型,多个VPC之间使用英文半角逗号(,)分隔。{ "control_plane_endpoints_config": { "internal_dns_config": { "enabled": true, "bind_vpcs": ["vpc-id"] } } }等待生效后,通过DescribeClusterDetail查看生效后的信息。
后续操作: