19.網絡插件calico
官網: https://docs.projectcalico.org/v3.8/introduction/
calico默認工作在192.168.0.0/16 的網絡
calico還不支持ipvs
====
Egres 出站
Ingress 入站
networkpolicy 網絡策略,簡寫 netpol
查看網絡策略幫助:
kubectl explain networkpolicy
查看某名稱空間的網絡策略:
[root@k8s-master networkpoliy]# kubectl get netpol -n dev
NAME POD-SELECTOR AGE
deny-all-ingress
====
calico有多種部署方法,我們這里介紹的是使用flannel和calico混用的方法。這里也比較推薦這種方法。
flannel負責網絡部分的功能,而calico我們只使用它的網絡策略的功能。
calico部署:
1. 另外單獨部署一個etcd
官方文檔:
https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/flannel
2. 公用集群的etcd
wget https://docs.projectcalico.org/v3.8/manifests/canal.yaml
kubectl apply -f canal.yaml
[root@k8s-master networkpoliy]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
canal-j9mlh 2/2 Running 0 97m
canal-jgj2j 2/2 Running 0 97m
=====================
calico實例:
[root@k8s-master networkpoliy]# kubectl create namespace dev
namespace/dev created
[root@k8s-master networkpoliy]# kubectl create namespace prod
namespace/prod created
[root@k8s-master networkpoliy]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: dev
spec:
podSelector: {} #空表示選擇該名稱空間的所有pod
policyTypes: #當這里寫了Ingress,則Ingress中定義的規則生效,如果規則為空則為全部拒絕。這里沒有寫Egres,則表示Egres規則不生效,默認全開。
- Ingress
[root@k8s-master networkpoliy]# cat pod-a.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
[root@k8s-master networkpoliy]# kubectl apply -f pod-a.yaml -n dev
pod/pod1 created
[root@k8s-master networkpoliy]# kubectl apply -f pod-a.yaml -n prod
pod/pod1 created
[root@k8s-master networkpoliy]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod1 1/1 Running 0 31s 10.244.1.2 k8s-node1 <none> <none>
[root@k8s-master networkpoliy]# kubectl get pods -n prod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod1 1/1 Running 0 11s 10.244.1.3 k8s-node1 <none> <none>
[root@k8s-master networkpoliy]# curl 10.244.1.2
^C
[root@k8s-master networkpoliy]# curl 10.244.1.3
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
dev的ns我們應用了策略,所以通過curl請求不到數據,prod的ns中我們沒有應用網絡策略,所以我們可以通過curl正常請求到。
添加入站規則
ingress:
- {} #這個{}寫法表示允許所有的入站,allow all
[root@k8s-master networkpoliy]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: dev
spec:
podSelector: {} #空表示選擇該名稱空間的所有pod
ingress:
- {} #這個{}寫法表示允許所有的入站,allow all
policyTypes: #當這里寫了Ingress,則Ingress中定義的規則生效,如果規則為空則為全部拒絕。這里沒有寫Egres,則表示Egres規則不生效,默認全開。
[root@k8s-master networkpoliy]# kubectl apply -f ingress.yaml -n dev
networkpolicy.networking.k8s.io/deny-all-ingress configured
[root@k8s-master networkpoliy]# curl 10.244.1.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
當我們修改策略允許dev上所有可以入站后可以正常請求到10.244.1.2了。
添加一個入站規則,允許10.244.0.0/16這個網段的除了10.244.1.3這個ip,都可以訪問pod的80端口,使用podSelector來匹配pod
[root@k8s-master networkpoliy]# cat allow-netpol.demo.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-myapp-ingress
spec:
podSelector:
matchLabels:
app: myapp
ingress:
- from: #這里不寫from則允許所有可以訪問
- ipBlock:
cidr: 10.244.0.0/16 #指定網段
except:
- 10.244.1.3/32 #除開這個ip
ports:
- protocol: TCP
port: 80
[root@k8s-master networkpoliy]# kubectl apply -f allow-netpol.demo.yaml -n dev
[root@k8s-master networkpoliy]# telnet 10.244.1.2 80
Trying 10.244.1.2...
Connected to 10.244.1.2.
Escape character is '^]'.
在本地測試,可以正常連接
[root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # telnet 10.244.1.2 80
登錄到10.244.1.3這個pod上,則測試telnet 80端口不通,說明策略生效。
添加一個出站策略:
拒絕所有出站策略:
[root@k8s-master networkpoliy]# cat egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: prod
spec:
podSelector: {} #空表示選擇該名稱空間的所有pod
policyTypes: #當這里寫了Ingress,則Ingress中定義的規則生效,如果規則為空則為全部拒絕。這里沒有寫Egres,則表示Egres規則不生效,默認全開。
- Egress
[root@k8s-master networkpoliy]# kubectl apply -f egress.yaml -n prod
[root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.250.0.89
PING 10.250.0.89 (10.250.0.89): 56 data bytes
ping k8s-master上的kube-scheduler-k8s-master 的ip發現ping不通,策略生效。
允許所有出去的策略:
[root@k8s-master networkpoliy]# cat egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: prod
spec:
podSelector: {} #空表示選擇該名稱空間的所有pod
egress:
- {}
policyTypes: #當這里寫了Ingress,則Ingress中定義的規則生效,如果規則為空則為全部拒絕。這里沒有寫Egres,則表示Egres規則不生效,默認全開。
- Egress
[root@k8s-master networkpoliy]# kubectl apply -f egress.yaml -n prod
networkpolicy.networking.k8s.io/deny-all-egress configured
[root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.250.0.89
PING 10.250.0.89 (10.250.0.89): 56 data bytes
64 bytes from 10.250.0.89: seq=119 ttl=63 time=0.384 ms
64 bytes from 10.250.0.89: seq=120 ttl=63 time=0.505 ms
64 bytes from 10.250.0.89: seq=121 ttl=63 time=0.373 ms
64 bytes from 10.250.0.89: seq=122 ttl=63 time=0.360 ms
64 bytes from 10.250.0.89: seq=123 ttl=63 time=0.504 ms
ping通了,策略生效。
一般對於網絡策略設置的規范:
對於網絡策略來講:
名稱空間:
拒絕所有出站,入站規則
方形所有出站目標名稱空間內的所有Pod