在 GKE 中应用出口网络策略后无法从 Pod 连接互联网

unable to connect internet from pod after applying egress network policy in GKE

我在 GKE 中有一个 pod (kubectl run app1 --image tomcat:7.0-slim) 在应用出口网络策略 apt-get update 命令后无法连接互联网。

应用政策前:

应用策略后:

这是应用的策略:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app2-np
  namespace: default
spec:
  podSelector:
    matchLabels:
      name: app2
  policyTypes:
  - Egress
  - Ingress
  ingress:
  - {}
  egress:
  - to:
    - podSelector:
        matchLabels:
          name: app3
    ports:
    - port: 8080

  - ports:
    - port: 80
    - port: 53
    - port: 443

这里能够连接同一命名空间中app3 pod 的8080 端口。请帮助纠正我的netpol。

发生这种情况是因为您只为端口 8080 上的 app3 定义了出口规则,它将阻止所有互联网连接尝试。

如果您需要从您的某些 pods 访问互联网,您可以标记它们并创建一个 NetworkPOlicy 以允许互联网访问。

在下面的示例中,带有标签 networking/allow-internet-egress: "true" 的 pods 将能够访问互联网:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: internet-egress
spec:
  podSelector:
    matchLabels:
      networking/allow-internet-egress: "true"
  egress:
  - {}
  policyTypes:
  - Egress

另一个选项是 allow by ip blocks,在下面的示例中,规则将允许 internet 访问 (0.0.0.0) except for the ipBlocks 10.0.0.0/8

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-internet-only
spec:
  podSelector: {}
  policyTypes:
    - Egress
  egress:
    - to:
      - ipBlock:
        cidr: 0.0.0.0/0
          except:
            - 10.0.0.0/8

最后,在 this 站点中,您可以以一种很好的方式可视化您的 NetworkPolices,以了解确切的行为是什么。

参考文献:

https://www.stackrox.com/post/2020/01/kubernetes-egress-network-policies/

Kubernets networkpolicy allow external traffic to internet only