k8s学习(35):k8s之Network Policy
kubernetes采用了Container Networking Interface(CNI)规范,是CoreOS提出的容器网络规范,它使用了插件模型创建容器的网络战
常见的kubernetes网络方案,Flannel、Calico、Canal、Weave Net
network Policy概念
network Policy是kubernetes的一种资源,network policy通过label选择pod,并指定其他pod或外界如何与这些pod通信
默认情况下,所有Pod是非隔离的,即任何来源的网络流量都能够访问Pod,没有任何限制。
并不是所有的kubernetes网络方案都支持network policy,例如:Calico支持,Flannel不支持
Canal
Canal:使用Flannel实现kubernetes集群网络、同时又使用Calico实现Networ Policy
部署Canal
相关文档: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
执行如下命令部署 Canal
1 | kubectl apply -f https://raw.githubusercontent.com/projectcalico/canal/master/k8s-install/1.7/rbac.yaml |
部署成功后,可以查看到 Canal 相关组件
Network Policy
首先部署一个httpd应用
1 | apiVersion: apps/v1beta1 |
验证访问
1 启动一个busybox Pod访问
curl和ping
2 集群节点访问
3集群外部访问
创建Network Policy
1 | kind: NetworkPolicy |
解析:
- 定义network policy中的规则应用于label为
run: httpd
的pod ingress
中定义了只有label为access: true
的Pod才能访问- 只能访问
80
端口,ping也不行
验证Network Policy的有效性
1 busybox Pod访问Service
1 | kubectl run busybox --rm -it --image=busybox /bin/sh |
2 集群节点访问
无法访问
3 集群外部访问
无法访问
让某个网络能够访问到应用
修改yaml文件,添加ipBlock
字段
1 | ... |
现在集群节点和集群外已经能够访问应用了
常用
ingress
限制进入的流量egress
限制外出的流量
小结
CNI规范使得kubernetes可以灵活选择多种plugin实现集群网络
Network Policy赋予kubernetes强大的网络访问控制机制