Docker Calico Profiles Labels Policy
calico 版本號:v2.6
參考文獻(xiàn):
https://docs.projectcalico.org/v2.6/getting-started/docker/tutorials/security-using-calico-profiles-and-policy
一、 Security using Calico Profiles
1. 創(chuàng)建網(wǎng)絡(luò)
在一臺服務(wù)器上(如master節(jié)點)壁却,創(chuàng)建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. 創(chuàng)建容器
在master節(jié)點上:
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節(jié)點上:
docker run --net net3 --name workload-D -tid busybox
docker run --net net1 --name workload-E -tid busybox
說明:
A,C,E 都在同一個網(wǎng)絡(luò)應(yīng)該可以彼此互ping的
B和D都在各自的網(wǎng)絡(luò)不能ping通任何其他節(jié)點
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節(jié)點上
總結(jié):
calico網(wǎng)絡(luò)椎工,默認(rèn)情況下钧栖,只有同一個網(wǎng)絡(luò)內(nèi)的容器是互通
?
?
?
?
?
?
二熏瞄、 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網(wǎng)絡(luò)的容器,都帶有標(biāo)簽role=database
?B驶俊、使用frontend網(wǎng)絡(luò)的容器娶耍,都帶有標(biāo)簽role=frontend
?C、database 策略中:
?????a. ingress入規(guī)則定義了兩個饼酿,只要滿足一條規(guī)則即可訪問
???????規(guī)則一:(針對的是不同calico網(wǎng)絡(luò)榕酒,訪問database網(wǎng)絡(luò)的規(guī)則)
???????????1. 源網(wǎng)絡(luò)帶有標(biāo)簽role=frontend,
???????????2. 訪問的端口號是2181
???????????3. 使用tcp協(xié)議
???????規(guī)則二:(針對的是同一個網(wǎng)絡(luò)內(nèi),容器之間的訪問)
???????????1. 帶有標(biāo)簽role=database 也可以訪問
?????b.egress出規(guī)則:
?????????只能訪問同一個網(wǎng)絡(luò)database內(nèi)的容器故俐,其他網(wǎng)絡(luò)里的容器不能訪問
配置文件database的整體意思想鹰,就是:
A、使用同一個database網(wǎng)絡(luò)的容器可以互相訪問
B药版、針對外部網(wǎng)絡(luò)杖挣,只允許frontend網(wǎng)絡(luò)里的容器訪問2181端口
- apply profile
calicoctl apply -f frontend-database.yaml
2.2、test profile
-
在master節(jié)點上創(chuàng)建一個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節(jié)點上創(chuàng)建一個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節(jié)點上惩妇,查看xej-zk容器的IP地址:
docker inspect --format "{{ .NetworkSettings.Networks.database.IPAddress }}" xej-zk
172.20.219.118在node2節(jié)點上,查看test-tools 容器的IP地址:
docker inspect --format "{{ .NetworkSettings.Networks.frontend.IPAddress }}" test-tools
172.20.104.5-
在node2節(jié)點上 進(jìn)入test-tools容器筐乳,測試是否能ping通master節(jié)點上的zk容器歌殃,
image -
在node2節(jié)點上,直接ping master節(jié)點上xej-zk容器蝙云,是否能ping 通氓皱?
??
image -
在master節(jié)點上,直接ping master節(jié)點上xej-zk容器,是否能ping 通波材?
image -
在node2節(jié)點上股淡,進(jìn)入test-tools容器,訪問master節(jié)點上的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網(wǎng)絡(luò)自定義profile,創(chuàng)建各自標(biāo)簽
pdbft.yaml
不定義規(guī)則
- 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
通過創(chuàng)建全局策略敛瓷,實現(xiàn)網(wǎng)絡(luò)隔離
Policy資源是全局性的, 同樣包括一些列的ingress和egress規(guī)則 斑匪,
每條規(guī)則根據(jù)source和destination定義的屬性進(jìn)行數(shù)據(jù)包的過濾
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
實現(xiàn)的效果跟上面的測試用例是一樣的
四蚀瘸、遺留問題狡蝶?
profile資源 與 policy資源 不知何時使用?
什么場景下使用profile資源 ?
什么場景下使用policy資源
policy資源對象中的order 到底有什么用 苍姜?