我添加了此NetworkPolicy以阻止所有出口,但允许DNS。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all-egress
namespace: {{ $namespace }}
spec:
podSelector: {}
egress:
- to:
- namespaceSelector:
matchLabels:
networking/namespace: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
policyTypes:
- Egress
然而,我在这个规则适用的服务中遇到了这个错误:Could not lookup srv records on _origintunneld._tcp.argotunnel.com: lookup _origintunneld._tcp.argotunnel.com on 10.2.0.10:53: read udp 10.32.1.179:40784->10.2.0.10:53: i/o timeout
该IP(10.2.0.10(属于kube dns服务,该服务有一个带有k8s-app=kube-dns
标签的pod,并且位于带有networking/namespace=kube-system
标签的kube系统命名空间中。
如果我删除pod选择器和命名空间选择器,那么出口策略有效,并且我不会得到错误
这是有效的,但不安全,因为它不限于kube dns pod:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all-egress
namespace: {{ $namespace }}
spec:
podSelector: {}
egress:
- to:
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
policyTypes:
- Egress
kube系统名称空间yaml:kubectl get namespace kube-system -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2020-07-30T22:08:25Z"
labels:
networking/namespace: kube-system
name: kube-system
resourceVersion: "4084751"
selfLink: /api/v1/namespaces/kube-system
uid: b93e68b0-7899-4f39-a3b8-e0e12e4008ee
spec:
finalizers:
- kubernetes
status:
phase: Active
我遇到了同样的问题。对我来说,这是因为在我的集群上启用了NodeLocal DNSCache。
当前策略不明确允许流量到Kubernetes DNS。因此,来自{{ $namespace }}
中pod的DNS查询将被删除,除非其他规则允许。
创建k8s DNS的允许出口规则应该可以解决您的问题。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all-egress
namespace: {{ $namespace }}
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
networking/namespace: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- port: 53
protocol: TCP
- port: 53
protocol: UDP
- to:
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- port: 53
protocol: UDP
我遇到了类似的问题。在我的案例中,我使用的是GKE Dataplane v2网络策略。在这个场景中,Dataplane V2基本上是一个托管的Cillium实现(没有完全实现(。它将管理维护健康网络所需的一些内部CRD资源。这可能会导致与自动同步k8s资源的应用程序部署工具(例如:ArgoCD(发生一些冲突。通过适当的测试,我发现我的网络策略与";k8s应用程序:kube-dns"。
因此,也许测试的一个快速解决方案是通过删除podSelector代码来允许kube系统命名空间中的所有pod:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all-egress
namespace: {{ $namespace }}
spec:
podSelector: {}
egress:
- to:
- namespaceSelector:
matchLabels:
networking/namespace: kube-system
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
policyTypes:
- Egress
如果您确认egress正在工作,则需要进一步对您的环境进行故障排除,并了解为什么您的netpolicy与kube-dns标签不匹配。
如果你正在使用ArgoCD,一个好的开始是将cillium.io资源列入黑名单/排除在外。例如,将其包含在您的ArgoCD配置中:
resource.exclusions: |
- apiGroups:
- cilium.io
kinds:
- CiliumIdentity
- CiliumEndpoint
clusters:
- "*"