带有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仍然存在问题
4条答案
按热度按时间bq9c1y661#
您需要使用
kubectl get endpoints --namespace default kubernetes
获取主服务器的真实的IP,并制定一个出口策略来允许这样做。8ehkhllq2#
更新:先尝试Dave McNeill's answer。
如果它对你不起作用(对我起作用了!),以下可能是一个解决方案:
这将允许访问API服务器-沿着互联网上的所有其他IP地址:-/
您可以将此规则与DENY all non-whitelisted traffic from a namespace规则结合使用,以拒绝所有其他pod的出口。
mpbci0fu3#
我们不是在GCP上,但同样应该适用。
我们向AWS查询主节点的CIDR,并将此数据用作为k8s API访问创建NetworkPolicy的Helm图表的值。
在我们的例子中,master是自动伸缩组的一部分,所以我们需要CIDR。在您的例子中,IP可能就足够了。
bmvo0sr54#
在helm中使用ciliumnetworkpolicy时遇到了同样的问题。对于任何有类似问题的人,应该可以使用以下方法: