Docker Calico Profiles Labels Policy
calico 版本号:v2.6
参考文献:
https://docs.projectcalico.org/v2.6/getting-started/docker/tutorials/security-using-calico-profiles-and-policy
一、 Security using Calico Profiles
1. 创建网络
在一台服务器上(如master节点),创建net1,net2,net3
docker network create --driver calico --ipam-driver calico-ipam net1
docker network create --driver calico --ipam-driver calico-ipam net2
docker network create --driver calico --ipam-driver calico-ipam net3
2. 创建容器
在master节点上:
docker run --net net1 --name workload-A -tid busybox
docker run --net net2 --name workload-B -tid busybox
docker run --net net1 --name workload-C -tid busybox
在node2节点上:
docker run --net net3 --name workload-D -tid busybox
docker run --net net1 --name workload-E -tid busybox
说明:
A,C,E 都在同一个网络应该可以彼此互ping的
B和D都在各自的网络不能ping通任何其他节点
3. 测试容器间的连通性
在master上
docker exec workload-A ping -c 4 workload-C.net1
docker exec workload-A ping -c 4 workload-E.net1
测试workload-A容器ping workload-B容器
在node2上
获取workload-D的IP地址
docker inspect --format "{{ .NetworkSettings.Networks.net3.IPAddress }}" workload-D
在master节点上
总结:
calico网络,默认情况下,只有同一个网络内的容器是互通
二、 Security using Calico Profiles and Policy
2.1、Policy applied directly by the profile
- create the docker networks
docker network create --driver calico --ipam-driver calico-ipam database docker network create --driver calico --ipam-driver calico-ipam frontend
- create the profiles
vim frontend-database.yaml- apiVersion: v1 kind: profile metadata: name: database labels: role: database spec: ingress: - action: allow protocol: tcp source: selector: role == 'frontend' destination: ports: - 2181 - action: allow source: selector: role == 'database' egress: - action: allow destination: selector: role == 'database' - apiVersion: v1 kind: profile metadata: name: frontend labels: role: frontend spec: egress: - action: allow protocol: tcp destination: selector: role == 'database' ports: - 2181
说明:
A、使用database网络的容器,都带有标签role=database
B、使用frontend网络的容器,都带有标签role=frontend
C、database 策略中:
a. ingress入规则定义了两个,只要满足一条规则即可访问
规则一:(针对的是不同calico网络,访问database网络的规则)
1. 源网络带有标签role=frontend,
2. 访问的端口号是2181
3. 使用tcp协议
规则二:(针对的是同一个网络内,容器之间的访问)
1. 带有标签role=database 也可以访问
b.egress出规则:
只能访问同一个网络database内的容器,其他网络里的容器不能访问
配置文件database的整体意思,就是:
A、使用同一个database网络的容器可以互相访问
B、针对外部网络,只允许frontend网络里的容器访问2181端口
- apply profile
calicoctl apply -f frontend-database.yaml
2.2、test profile
-
在master节点上创建一个zk容器 zk.sh
docker stop xej-zk docker rm xej-zk docker run --network=database --name xej-zk -p 2181:2181 --restart always -d zookeeper:3.5
-
在node2节点上创建一个test-tools容器,test-tools.sh
#!/bin/bash docker stop test-tools docker rm test-tools docker run --network=frontend --name test-tools -itd --restart always busybox
在master节点上,查看xej-zk容器的IP地址:
docker inspect --format "{{ .NetworkSettings.Networks.database.IPAddress }}" xej-zk
172.20.219.118在node2节点上,查看test-tools 容器的IP地址:
docker inspect --format "{{ .NetworkSettings.Networks.frontend.IPAddress }}" test-tools
172.20.104.5-
在node2节点上 进入test-tools容器,测试是否能ping通master节点上的zk容器,
image -
在node2节点上,直接ping master节点上xej-zk容器,是否能ping 通?
image -
在master节点上,直接ping master节点上xej-zk容器,是否能ping 通?
image -
在node2节点上,进入test-tools容器,访问master节点上的2181端口,是否可以?
image
三、 Global policy applied through label selection
3.1、 Create the Docker networks
docker network create --driver calico --ipam-driver calico-ipam db
docker network create --driver calico --ipam-driver calico-ipam ft
3.2、Create the profiles
为db,ft网络自定义profile,创建各自标签
pdbft.yaml
不定义规则
- apiVersion: v1
kind: profile
metadata:
name: db
labels:
role: db
- apiVersion: v1
kind: profile
metadata:
name: ft
labels:
role: ft
calicoctl apply -f pdbft.yaml
3.3、Create policy
通过创建全局策略,实现网络隔离
Policy资源是全局性的, 同样包括一些列的ingress和egress规则 ,
每条规则根据source和destination定义的属性进行数据包的过滤
dbft.yaml
- apiVersion: v1
kind: policy
metadata:
name: db
spec:
order: 0
selector: role == 'db'
ingress:
- action: allow
protocol: tcp
source:
selector: role == 'ft'
destination:
ports:
- 2181
- action: allow
source:
selector: role == 'db'
egress:
- action: allow
destination:
selector: role == 'db'
- apiVersion: v1
kind: policy
metadata:
name: ft
spec:
order: 0
selector: role == 'ft'
egress:
- action: allow
protocol: tcp
destination:
selector: role == 'db'
ports:
- 2181
3.4、apply policy
calicoctl apply -f dbft.yaml
3.5、test policy
实现的效果跟上面的测试用例是一样的
四、遗留问题?
profile资源 与 policy资源 不知何时使用?
什么场景下使用profile资源 ?
什么场景下使用policy资源
policy资源对象中的order 到底有什么用 ?