20

使用命令初始化容器kubectl get pod用于获取其他 pod 的就绪状态。

开启 Egress NetworkPolicy 后,init container can't access Kubernetes API: Unable to connect to the server: dial tcp 10.96.0.1:443: i/o timeout. CNI 是印花布。

尝试了几个规则,但没有一个有效(服务和主主机 IP,不同的 CIDR 掩码):

...
  egress:
  - to:
    - ipBlock:
        cidr: 10.96.0.1/32
    ports:
    - protocol: TCP
      port: 443
...

或使用命名空间(默认和 kube-system 命名空间):

...
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          name: default
    ports:
    - protocol: TCP
      port: 443
...

看起来ipBlock规则不起作用,命名空间规则不起作用,因为 kubernetes api 是非标准 pod。

可以配置吗?Kubernetes 是 1.9.5,Calico 是 3.1.1。

GKE 1.13.7-gke.8 和 calico 3.2.7 仍然存在问题

4

3 回答 3

10

您需要获取使用的主服务器的真实 IPkubectl get endpoints --namespace default kubernetes并制定出口策略以允许这样做。

---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1 
metadata:
  name: allow-apiserver
  namespace: test
spec:
  policyTypes:
  - Egress
  podSelector: {}
  egress:
  - ports:
    - port: 443
      protocol: TCP
    to:
    - ipBlock:
        cidr: x.x.x.x/32
于 2019-06-07T12:38:31.563 回答
2

更新:首先尝试戴夫麦克尼尔的答案

如果它对您不起作用(对我有用!),以下可能是一种解决方法:

  podSelector:
    matchLabels:
      white: listed
  egress:
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0

这将允许访问 API 服务器 - 以及互联网上的所有其他 IP 地址:-/

您可以将此与来自命名空间规则的拒绝所有未列入白名单的流量相结合,以拒绝所有其他 pod 的出口。

于 2019-01-31T12:12:22.437 回答
0

我们不在 GCP 上,但同样适用。

我们向 AWS 查询我们的主节点的 CIDR,并将这些数据用作 helm 图表的值,为 k8s API 访问创建 NetworkPolicy。

在我们的例子中,主节点是自动扩展组的一部分,所以我们需要 CIDR。在您的情况下,IP 可能就足够了。

于 2019-12-17T06:54:00.067 回答