GCE上MicroK8s Pod无法解析metadata.google.internal如何解决
问题根因
Google Cloud的元数据服务域名metadata.google.internal固定对应链路本地地址169.254.169.254,MicroK8s集群默认的CoreDNS服务没有配置该域名的解析规则,会将解析请求直接转发到公共DNS,公共DNS无法解析该内网专用域名,因此出现解析失败报错。
解决方案
方案1:修改CoreDNS配置(全集群永久生效)
该方案适合集群内多个Pod都需要访问GCP元数据服务的场景,配置一次全集群生效:
- 执行命令编辑CoreDNS配置项:
microk8s kubectl edit configmap coredns -n kube-system - 在
Corefile配置段的.:53块中新增hosts配置,静态绑定域名与IP:
.:53 { errors health ready # 新增以下hosts配置段 hosts { 169.254.169.254 metadata.google.internal fallthrough } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop reload loadbalance }
- 保存配置后重启CoreDNS服务使配置生效:
microk8s kubectl rollout restart deployment coredns -n kube-system
方案2:配置Pod HostAlias(单Pod生效)
该方案无需修改集群全局配置,仅针对需要访问元数据服务的单个Pod配置:
在Pod的YAML定义的spec段中新增hostAliases配置即可:
apiVersion: v1 kind: Pod metadata: name: your-pod-name spec: # 新增以下配置 hostAliases: - ip: "169.254.169.254" hostnames: - "metadata.google.internal" # 剩余Pod配置保持不变 containers: - name: your-container-name image: your-image
验证与注意事项
- 配置完成后进入Pod执行
nslookup metadata.google.internal,如果返回169.254.169.254则说明解析配置生效。 - 宿主机测试时返回403是因为请求未携带
Metadata-Flavor: Google请求头,Google Cloud SDK调用时会自动添加该头,不会影响正常使用。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

