问题描述
我有一个 AKS 集群 (Azure CNI),我正在尝试在其上实施 NetworkPolicies。我创建的网络策略是
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
Metadata:
name: myserver
spec:
podSelector:
matchLabels:
service: my-server
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
service: myotherserver
- podSelector:
matchLabels:
service: gateway
- podSelector:
matchLabels:
service: yetanotherserver
ports:
- port: 8080
protocol: TCP
egress:
- to:
ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
- port: 5432
protocol: TCP
- port: 8080
protocol: TCP
但是当我应用该策略时,我看到重复出现的消息表明无法解析主机名。我已经在 myserver pod 上安装了 dnsutils;并且可以看到 DNS 请求超时;我也试过在同一个 pod 上安装 tcpdump;我可以看到从 myserver 到 kube-dns 的请求。我没有看到任何回复。
如果我删除 networkpolicy DNS 会直接回来;所以我确定我的网络策略存在问题,但找不到允许 DNS 流量的方法。如果有人能阐明我哪里出错了,将不胜感激!
解决方法
为避免重复,请创建单独的网络策略以开放 DNS 流量。首先我们标记 kube-system
命名空间。然后允许从所有 pod 到 kube-system
命名空间的 DNS 流量。
kubectl label namespace kube-system name=kube-system
kubectl create -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns-access
namespace: <your-namespacename>
spec:
podSelector:
matchLabels: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
name: kube-system
ports:
- protocol: UDP
port: 53
EOF