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
2
kubectl apply -f https://raw.githubusercontent.com/projectcalico/canal/master/k8s-install/1.7/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/projectcalico/canal/master/k8s-install/1.7/canal.yaml

部署成功后,可以查看到 Canal 相关组件

Network Policy

首先部署一个httpd应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
type: NodePort
selector:
run: httpd
ports:
- protocol: TCP
nodePort: 30000
port: 8080
targetPort: 80

验证访问

1 启动一个busybox Pod访问

curl和ping

2 集群节点访问

3集群外部访问

创建Network Policy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: access-httpd
spec:
podSelector:
matchLabels:
run: httpd
ingress:
- from:
- podSelector:
matchLabels:
access: "true"
ports:
- protocol: TCP
port: 80

解析:

  • 定义network policy中的规则应用于label为run: httpd的pod
  • ingress中定义了只有label为access: true的Pod才能访问
  • 只能访问80端口,ping也不行

验证Network Policy的有效性

1 busybox Pod访问Service

1
2
kubectl run busybox --rm -it --image=busybox /bin/sh
kubectl run busybox --rm -it --image=busybox --labels="access=true" /bin/sh

2 集群节点访问

无法访问

3 集群外部访问

无法访问

让某个网络能够访问到应用

修改yaml文件,添加ipBlock字段

1
2
3
4
5
6
7
8
9
10
11
12
13
...
...
...
ingress:
- from:
- podSelector:
matchLabels:
access: "true"
- ipBlock:
cidr: 192.168.128.0/24
ports:
- protocol: TCP
port: 80

现在集群节点和集群外已经能够访问应用了

常用

  • ingress限制进入的流量
  • egress限制外出的流量

小结

CNI规范使得kubernetes可以灵活选择多种plugin实现集群网络

Network Policy赋予kubernetes强大的网络访问控制机制