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

时间:2018-04-30 14:46:49

标签: kubernetes project-calico kubernetes-networkpolicy

带有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系统命名空间):

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

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

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

3 个答案:

答案 0 :(得分:0)

到目前为止,我能想到的唯一解决方法是:

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

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

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

答案 1 :(得分:0)

您需要使用“ kubectl获取终结点-名称空间默认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

答案 2 :(得分:0)

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

我们向AWS查询主节点的CIDR,并将此数据用作舵图的值,以创建用于k8s API访问的NetworkPolicy。

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