Kubernetes网络策略问题:Service访问Pod的Egress配置异常排查
问题排查:AKS+Calico环境下Network Policy导致Service DNS解析失败及Pod通信异常
我在Azure Kubernetes Service(AKS)环境使用Calico网络策略,有两个ns命名空间的Pod:
- 客户端Pod:
sleeper - 服务端Pod:
frontend,由frontend-svcService代理(该Service将8080端口转发至Pod的80端口)
原本通过wget -qO- http://frontend-svc.ns:8080/api/Ping可正常通信,配置Network Policy后出现访问异常。
初始Egress策略配置
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-to-frontend-egress namespace: ns spec: podSelector: matchLabels: app: sleeper policyTypes: - Egress egress: - to: - podSelector: matchLabels: app: frontend
问题现象
配置后出现Service地址解析失败,提示wget: bad address 'frontend-svc.ns:8080',但直接通过Pod IP(wget -qO- 10.x.x.x:80/api/Ping)访问可正常响应。
错误的DNS访问允许策略
为解决DNS解析问题,我添加了以下Egress策略,允许ns命名空间所有Pod访问kube-system命名空间的所有Pod:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-egress-kube-system namespace: ns spec: podSelector: {} egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: "kube-system" podSelector: {} policyTypes: - Egress
问题恶化
配置后不仅DNS解析问题未解决,连原本正常的Pod IP通信也失效了。
最终可用的严格DNS Egress策略
以下配置可以解决问题,仅允许ns命名空间所有Pod访问kube-system中的kube-dns服务的53端口(UDP/TCP):
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-all-pods-dns-egress namespace: ns spec: policyTypes: - Egress podSelector: {} egress: - to: - namespaceSelector: matchLabels: # 该标签在K8s 1.19版本引入,若版本更低需手动为kube-dns Pod添加标签 kubernetes.io/metadata.name: "kube-system" podSelector: matchLabels: k8s-app: kube-dns ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
内容的提问来源于stack exchange,提问作者Jurgy
相关产品推荐
相关产品推荐

