如何使用出口网络策略允许访问 kubernetes api?



带有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是Calico。

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

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

或使用命名空间(默认和 kube 系统命名空间(:

...
  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 和印花布 3.2.7 仍然存在问题

您需要使用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

在将ciliumnetworkpolicy与helm一起使用时遇到了同样的问题。对于任何有类似问题的人,这样的事情应该有效:

{{- $kubernetesEndpoint := lookup "v1" "Endpoints" "default" "kubernetes" -}}
{{- $kubernetesAddress := (first $kubernetesEndpoint.subsets).addresses -}}
{{- $kubernetesIP := (first $kubernetesAddress).ip -}}
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  ...
spec:
  ...
  egress:
    - toCIDRSet:
        - cidr: {{ $kubernetesIP }}/32
    ...

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

我们在 AWS 中查询主节点的 CIDR,并将此数据用作为 k8s API 访问创建网络策略的掌舵图的值。

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

更新:先试试戴夫·麦克尼尔的答案。

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

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

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

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

您可以允许出口流量流向 Kubernetes API 端点 IP 和端口。

您可以通过运行 $ kubectl get endpoints kubernetes -oyaml 来获取终结点。

我不明白为什么只允许流量到 default kubernetes 命名空间中 服务的集群 IP 不起作用(KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT env vars 中的内容(,但无论如何,它可以允许流量流向底层端点。

要在 Helm 图表模板中执行此操作,您可以执行以下操作:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ...
spec:
  podSelector: ...
  policyTypes:
    - Egress
  egress:
    {{- range (lookup "v1" "Endpoints" "default" "kubernetes").subsets }}
    - to:
        {{- range .addresses }}
        - ipBlock:
            cidr: {{ .ip }}/32
        {{- end }}
      ports:
        {{- range .ports }}
        - protocol: {{ .protocol }}
          port: {{ .port }}
        {{- end }}
    {{- end }}

最新更新