如何允许使用egress网络策略访问kubernetes API?

voase2hg  于 2023-04-05  发布在  Kubernetes
关注(0)|答案(4)|浏览(171)

带有kubectl get pod命令的Init容器用于获取其他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-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仍然存在问题

bq9c1y66

bq9c1y661#

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

8ehkhllq2#

更新:先尝试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的出口。

mpbci0fu

mpbci0fu3#

我们不是在GCP上,但同样应该适用。
我们向AWS查询主节点的CIDR,并将此数据用作为k8s API访问创建NetworkPolicy的Helm图表的值。
在我们的例子中,master是自动伸缩组的一部分,所以我们需要CIDR。在您的例子中,IP可能就足够了。

bmvo0sr5

bmvo0sr54#

在helm中使用ciliumnetworkpolicy时遇到了同样的问题。对于任何有类似问题的人,应该可以使用以下方法:

{{- $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
    ...

相关问题