【问题标题】:How to allow access to kubernetes api using egress network policy?如何使用出口网络策略允许访问 kubernetes api?
【发布时间】:2018-10-10 16:36:57
【问题描述】:

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

开启 Egress NetworkPolicy 后,init 容器无法访问 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 仍然存在问题

【问题讨论】:

  • 这个问题你解决了吗?
  • GKE 1.11.6-gke.3 上的相同问题(使用 Calico v3.2.4)
  • 您是否使用标签name=default 标记了您的default 命名空间?对我来说,命名空间需要标记并不明显 - 我从 TGI Kubernetes 085: Network Policies 学到的
  • 嗨。你设法解决了这个问题吗?我被困住了,我什么都试过了。使用 CIDR、标签。

标签: kubernetes project-calico kubernetes-networkpolicy


【解决方案1】:

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

---
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

【讨论】:

  • master的IP可以改吗?如果是这样,则此配置可能会中断。
  • 确保您也使用了正确的端口。 pod 内部使用的 443 端口可能已在 pod 外部更改为类似 4443。get endpoints --namespace default kubernetes -o wide 列出了 IP 地址 + 端口。
【解决方案2】:

更新:先试试Dave McNeill's answer。

如果它不适合您(它适合我!),以下可能是一种解决方法:

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

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

您可以将此与 DENY all non-whitelisted traffic from a namespace 规则结合使用,以拒绝所有其他 pod 的出口。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2020-10-06
      • 2019-01-21
      • 1970-01-01
      • 2020-03-04
      • 2020-01-01
      • 2021-05-24
      • 2021-01-17
      • 1970-01-01
      相关资源
      最近更新 更多