我有一个安装了 Calico 网络覆盖的 Kubernetes 集群。如何配置网络策略对象以防止 Pod 连接到节点上的端口 10250(kubelet API)?我有以下几点:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-egress-to-nodes
namespace: dev
spec:
podSelector: {}
policyTypes:
- Egress
- Ingress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 172.20.0.0/16
ingress:
- {}
不过,这并没有专门阻止端口 10250。它阻止了到节点的所有出站连接,这也会阻止集群中运行的应用程序服务之间的通信。有没有办法只阻止到集群节点中端口 10250 的出站连接?我知道可以通过 IPTABLES 来完成,但我更愿意通过 Calico 使用网络策略对象来完成。
参考:https://raesene.github.io/blog/2018/03/25/kubernetes-network-policies/
答案1
通过创建具有以下内容的另一个网络策略对象,我可以使其正常工作:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-egress-to-nodes-on-ports-80-and-443
namespace: dev
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 172.20.0.0/16
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
我必须在端口 80 和 443 上启用 Pod 的出口连接,因为 Pod 通过 HTTP/S 相互通信。但我不确定为什么需要在节点 CIDR 块上打开这些端口,因为作为服务的 Pod 在它们自己的 CIDR 不同块上运行。因此,如果有人提供更好的答案,我不会将此标记为已接受的答案,但这解除了我的障碍。
答案2
Calico 项目是一种用于高度可扩展数据中心的纯第 3 层虚拟网络方法,它作为 Kubernetes 堆栈上的微防火墙而广受欢迎。
您可以使用出口 IP 地址池指定端口和协议。尝试应用此配置:
kubectl create -f - <<EOF
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-egress-to-nodes
namespace: dev
spec:
podSelector: {}
policyTypes:
- Egress
- Ingress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 172.20.0.0/16
ports:
- protocol: TCP
port: 10250
ingress:
- {}
EOF
我根据 Project Calico 调整了配置教程。