我已经添加了这个网络策略来阻止所有出口,但允许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-system名称空间中。
如果我删除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
3条答案
按热度按时间uklbhaso1#
我遇到过同样的问题。对我来说,这是因为NodeLocal DNSCache在我的群集上启用。
6jjcrrmo2#
当前策略未明确允许到Kubernetes DNS的流量。因此,除非其他规则允许,否则将丢弃来自
{{ $namespace }}
中Pod的DNS查询。创建一个允许出口规则到k8s DNS应该可以解决您的问题。
avkwfej43#
我今天遇到了这个问题。我使用的是GKE Dataplane v2 Network Policies。在这种情况下,Cillium将管理一些维护健康网络所需的内部CRD资源。这可能会导致与自动同步k8s资源的应用部署工具发生冲突(例如:经过适当的测试,我发现我的网络策略与“k8s-app:库贝-DNS”。
因此,对于您的测试来说,一个快速的解决方案可能是通过删除podSelector代码来允许kube-system名称空间中的所有pod:
如果您确认egress工作正常,则需要进一步排除环境故障,并了解netpolicy与kube-dns标签不匹配的原因。
如果您使用的是ArgoCD,最好先将www.example.com资源列入黑名单/排除cillium.io。例如,在您的ArgoCD配置中包含以下内容: