代码之家  ›  专栏  ›  技术社区  ›  Esben Eickhardt

Kubernetes NetworkPolicy:阻止所有出口,尽管没有指定块

  •  0
  • Esben Eickhardt  · 技术社区  · 4 年前

    我有一项服务,我希望能够访问互联网和其他吊舱。然而,ALL egress规则似乎阻止了所有出口。

    # No NetworkPolicies
    kubectl -n mytestnamespace exec service-c-78f784b475-qsdqg -- bin/bash -c 'curl www.google.com'
    

    没有NetworkPolicy,我的pod就可以访问互联网。接下来,我制定了一个允许出口到所有IP地址的Networkpolicy。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all
      namespace: mytestnamespace
    spec:
      podSelector: {}
      policyTypes:
        - Egress
      egress:
        - to:
          - ipBlock:
              cidr: 0.0.0.0/0
    

    但现在curl不能再上网了,但为什么??????

    NetworkPolicies允许出口到所有IP!

    kubectl -n mytestnamespace exec service-c-78f784b475-qsdqg -- bin/bash -c 'curl www.google.com'
    

    为什么此NetworkPolicy会阻止所有出口?毫无意义!

    0 回复  |  直到 4 年前
        1
  •  1
  •   Esben Eickhardt    4 年前

    事实证明,尽管对所有IP地址都开放,但网络策略不允许出口到另一个命名空间中的DNS pod。

    # Identifying DNS pod
    kubectl get pods -A | grep dns
    
    # Identifying DNS pod label
    kubectl describe pods -n kube-system coredns-64cfd66f7-rzgwk
    

    接下来,我将dns标签添加到出口策略中:

    # network_policy.yaml
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-all
      namespace: mytestnamespace
    spec:
      podSelector: {}
      policyTypes:
      - Egress
      - Ingress
      egress:
      - to:
        - ipBlock:
            cidr: "0.0.0.0/0"
      - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: "kube-system"
        - podSelector:
            matchLabels:
              k8s-app: "kube-dns"
    

    我应用网络策略并测试curl调用:

    # Setting up policy
    kubectl apply -f network_policy.yaml
    
    # Testing curl call
    kubectl -n mytestnamespace exec service-c-78f784b475-qsdqg -- bin/bash -c 'curl www.google.com'
    

    成功!现在我可以进行出口呼叫,接下来我只需要在专用网络中屏蔽适当的IP地址。

        2
  •  0
  •   zer0    4 年前

    原因是, curl 尝试与位于的HTTP服务器建立双向TCP连接 www.google.com 这意味着, 二者都 需要在您的策略中允许出入流量。目前,只允许对外交通。也许,如果您在详细模式下运行curl,您将能够更详细地看到这一点:

    kubectl -n mytestnamespace exec service-c-78f784b475-qsdqg -- bin/bash -c 'curl www.google.com' -v
    

    然后,您可以看到箭头标记的来回通信 > (外出)和 < (即将到来)。你只会注意到 > 将列出箭头,而不是 < 将显示交通。

    注意:如果你做一些更简单的事情,比如 ping google.com 它可能会起作用,因为这是一种简单的无状态通信。

    为了做到这一点,你可以简单地在你的策略中添加一个允许所有入口的规则,比如:

    ingress:
      - {}
    

    此外,还有一种更简单的方法可以允许所有出口流量,简单如下:

    egress:
      - {}
    

    我希望这能有所帮助。您可以阅读有关政策的更多信息 here

    推荐文章