kubernetes k8s出口网络策略不适用于dns

qgzx9mmu  于 2023-01-25  发布在  Kubernetes
关注(0)|答案(3)|浏览(112)

我已经添加了这个网络策略来阻止所有出口,但允许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
uklbhaso

uklbhaso1#

我遇到过同样的问题。对我来说,这是因为NodeLocal DNSCache在我的群集上启用。

6jjcrrmo

6jjcrrmo2#

当前策略未明确允许到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
avkwfej4

avkwfej43#

我今天遇到了这个问题。我使用的是GKE Dataplane v2 Network Policies。在这种情况下,Cillium将管理一些维护健康网络所需的内部CRD资源。这可能会导致与自动同步k8s资源的应用部署工具发生冲突(例如:经过适当的测试,我发现我的网络策略与“k8s-app:库贝-DNS”。
因此,对于您的测试来说,一个快速的解决方案可能是通过删除podSelector代码来允许kube-system名称空间中的所有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,最好先将www.example.com资源列入黑名单/排除cillium.io。例如,在您的ArgoCD配置中包含以下内容:

resource.exclusions: |
    - apiGroups:
      - cilium.io
      kinds:
      - CiliumIdentity
      - CiliumEndpoint
      clusters:
      - "*"

相关问题