一、k8s網(wǎng)絡(luò)通信
抽象的接口層,將容器網(wǎng)絡(luò)配置方案與容器平臺方案解耦
CNI(Container Network Interface)就是這樣的一個接口層,它定義了一套接口標(biāo)準(zhǔn),提供了規(guī)范文檔以及一些標(biāo)準(zhǔn)實(shí)現(xiàn)。采用CNI規(guī)范來設(shè)置容器網(wǎng)絡(luò)的容器平臺不需要關(guān)注網(wǎng)絡(luò)的設(shè)置的細(xì)節(jié),只需要按CNI規(guī)范來調(diào)用CNI接口即可實(shí)現(xiàn)網(wǎng)絡(luò)的設(shè)置
k8s通過CNI接口接入其他插件來實(shí)現(xiàn)網(wǎng)絡(luò)通訊。目前比較流行的插件有flannel,calico等。
CNI插件存放位置:# cat /etc/cni/net.d/10-flannel.conflist
插件使用的解決方案如下:
虛擬網(wǎng)橋,虛擬網(wǎng)卡,多個容器共用一個虛擬網(wǎng)卡進(jìn)行通信。
多路復(fù)用:MacVLAN,多個容器共用一個物理網(wǎng)卡進(jìn)行通信。
硬件交換:SR-LOV,一個物理網(wǎng)卡可以虛擬出多個接口,這個性能最好。
容器間通信:同一個pod內(nèi)的多個容器間的通信,通過lo即可實(shí)現(xiàn);
pod之間的通信:
同一節(jié)點(diǎn)的pod之間通過cni網(wǎng)橋轉(zhuǎn)發(fā)數(shù)據(jù)包。(brctl show可以查看)
不同節(jié)點(diǎn)的pod之間的通信需要網(wǎng)絡(luò)插件支持。
pod和service通信: 通過iptables或ipvs實(shí)現(xiàn)通信,ipvs取代不了iptables,因為ipvs只能做負(fù)載均衡,而做不了nat轉(zhuǎn)換。
pod和外網(wǎng)通信:iptables的MASQUERADE。
Service與集群外部客戶端的通信;(ingress、nodeport、loadbalancer)
1.網(wǎng)絡(luò)策略
網(wǎng)絡(luò)策略官網(wǎng):https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
前置條件
網(wǎng)絡(luò)策略通過網(wǎng)絡(luò)插件來實(shí)現(xiàn)。要使用網(wǎng)絡(luò)策略,你必須使用支持 NetworkPolicy 的網(wǎng)絡(luò)解決方案。 創(chuàng)建一個 NetworkPolicy 資源對象而沒有控制器來使它生效的話,是沒有任何作用的。(Flannel不支持 NetworkPolicy,所以使用Flannei網(wǎng)絡(luò)插件是不會隔離pod的)
隔離和非隔離的 Pod
默認(rèn)情況下,Pod 是非隔離的,它們接受任何來源的流量。
Pod 在被某 NetworkPolicy 選中時進(jìn)入被隔離狀態(tài)。 一旦名字空間中有 NetworkPolicy 選擇了特定的 Pod,該 Pod 會拒絕該 NetworkPolicy 所不允許的連接。 (名字空間下其他未被 NetworkPolicy 所選擇的 Pod 會繼續(xù)接受所有的流量)
網(wǎng)絡(luò)策略不會沖突,它們是累積的。 如果任何一個或多個策略選擇了一個 Pod, 則該 Pod 受限于這些策略的 入站(Ingress)/出站(Egress)規(guī)則的并集。因此評估的順序并不會影響策略的結(jié)果。
為了允許兩個 Pods 之間的網(wǎng)絡(luò)數(shù)據(jù)流,源端 Pod 上的出站(Egress)規(guī)則和 目標(biāo)端 Pod 上的入站(Ingress)規(guī)則都需要允許該流量。 如果源端的出站(Egress)規(guī)則或目標(biāo)端的入站(Ingress)規(guī)則拒絕該流量, 則流量將被拒絕。
2.service和iptables的關(guān)系
service 的代理是 kube-proxy
kube-proxy 運(yùn)行在所有節(jié)點(diǎn)上,它監(jiān)聽 apiserver 中 service 和 endpoint 的變化情況,創(chuàng)建路由規(guī)則以提供服務(wù) IP 和負(fù)載均衡功能。簡單理解此進(jìn)程是Service的透明代理兼負(fù)載均衡器,其核心功能是將到某個Service的訪問請求轉(zhuǎn)發(fā)到后端的多個Pod實(shí)例上,而kube-proxy底層又是通過iptables和ipvs實(shí)現(xiàn)的。
iptables原理
Kubernetes從1.2版本開始,將iptables作為kube-proxy的默認(rèn)模式。iptables模式下的kube-proxy不再起到Proxy的作用,其核心功能:通過API Server的Watch接口實(shí)時跟蹤Service與Endpoint的變更信息,并更新對應(yīng)的iptables規(guī)則,Client的請求流量則通過iptables的NAT機(jī)制“直接路由”到目標(biāo)Pod。
ipvs原理
IPVS在Kubernetes1.11中升級為GA穩(wěn)定版。IPVS則專門用于高性能負(fù)載均衡,并使用更高效的數(shù)據(jù)結(jié)構(gòu)(Hash表),允許幾乎無限的規(guī)模擴(kuò)張,因此被kube-proxy采納為最新模式。
在IPVS模式下,使用iptables的擴(kuò)展ipset,而不是直接調(diào)用iptables來生成規(guī)則鏈。iptables規(guī)則鏈?zhǔn)且粋€線性的數(shù)據(jù)結(jié)構(gòu),ipset則引入了帶索引的數(shù)據(jù)結(jié)構(gòu),因此當(dāng)規(guī)則很多時,也可以很高效地查找和匹配。
可以將ipset簡單理解為一個IP(段)的集合,這個集合的內(nèi)容可以是IP地址、IP網(wǎng)段、端口等,iptables可以直接添加規(guī)則對這個“可變的集合”進(jìn)行操作,這樣做的好處在于可以大大減少iptables規(guī)則的數(shù)量,從而減少性能損耗。
kube-proxy ipvs和iptables的異同
iptables與IPVS都是基于Netfilter實(shí)現(xiàn)的,但因為定位不同,二者有著本質(zhì)的差別:iptables是為防火墻而設(shè)計的;IPVS則專門用于高性能負(fù)載均衡,并使用更高效的數(shù)據(jù)結(jié)構(gòu)(Hash表),允許幾乎無限的規(guī)模擴(kuò)張。
與iptables相比,IPVS擁有以下明顯優(yōu)勢:
- 為大型集群提供了更好的可擴(kuò)展性和性能;
- 支持比iptables更復(fù)雜的復(fù)制均衡算法(最小負(fù)載、最少連接、加權(quán)等);
- 支持服務(wù)器健康檢查和連接重試等功能;
- 可以動態(tài)修改ipset的集合,即使iptables的規(guī)則正在使用這個集合。
二、pod間通信
1.同節(jié)點(diǎn)之間的通信
同一節(jié)點(diǎn)的pod之間通過cni網(wǎng)橋轉(zhuǎn)發(fā)數(shù)據(jù)包。(brctl show可以查看)
2.不同節(jié)點(diǎn)的pod之間的通信需要網(wǎng)絡(luò)插件支持(詳解)
(1)Flannel vxlan模式跨主機(jī)通信原理
flannel網(wǎng)絡(luò)
- VXLAN,即Virtual Extensible LAN(虛擬可擴(kuò)展局域網(wǎng)),是Linux本身支持的一網(wǎng)種網(wǎng)絡(luò)虛擬化技術(shù)。VXLAN可以完全在內(nèi)核態(tài)實(shí)現(xiàn)封裝和解封裝工作,從而通過“隧道”機(jī)制,構(gòu)建出覆蓋網(wǎng)絡(luò)(Overlay Network)。
- VTEP:VXLAN Tunnel End Point(虛擬隧道端點(diǎn)),在Flannel中 VNI的默認(rèn)值是1,這也是為什么宿主機(jī)的VTEP設(shè)備都叫flannel.1的原因。
- Cni0: 網(wǎng)橋設(shè)備,每創(chuàng)建一個pod都會創(chuàng)建一對 veth pair。其中一端是pod中的eth0,另一端是Cni0網(wǎng)橋中的端口(網(wǎng)卡)。
- Flannel.1: TUN設(shè)備(虛擬網(wǎng)卡),用來進(jìn)行 vxlan 報文的處理(封包和解包)。不同node之間的pod數(shù)據(jù)流量都從overlay設(shè)備以隧道的形式發(fā)送到對端。
- Flanneld:flannel在每個主機(jī)中運(yùn)行flanneld作為agent,它會為所在主機(jī)從集群的網(wǎng)絡(luò)地址空間中,獲取一個小的網(wǎng)段subnet,本主機(jī)內(nèi)所有容器的IP地址都將從中分配。同時Flanneld監(jiān)聽K8s集群數(shù)據(jù)庫,為flannel.1設(shè)備提供封裝數(shù)據(jù)時必要的mac、ip等網(wǎng)絡(luò)數(shù)據(jù)信息。
flannel網(wǎng)絡(luò)原理
- 當(dāng)容器發(fā)送IP包,通過veth pair 發(fā)往cni網(wǎng)橋,再路由到本機(jī)的flannel.1設(shè)備進(jìn)行處理。
- VTEP設(shè)備之間通過二層數(shù)據(jù)幀進(jìn)行通信,源VTEP設(shè)備收到原始IP包后,在上面加上一個目的MAC地址,封裝成一個內(nèi)部數(shù)據(jù)幀,發(fā)送給目的VTEP設(shè)備。
- 內(nèi)部數(shù)據(jù)楨,并不能在宿主機(jī)的二層網(wǎng)絡(luò)傳輸,Linux內(nèi)核還需要把它進(jìn)一步封裝成為宿主機(jī)的一個普通的數(shù)據(jù)幀,承載著內(nèi)部數(shù)據(jù)幀通過宿主機(jī)的eth0進(jìn)行傳輸。
- Linux會在內(nèi)部數(shù)據(jù)幀前面,加上一個VXLAN頭,VXLAN頭里有一個重要的標(biāo)志叫VNI,它是VTEP識別某個數(shù)據(jù)楨是不是應(yīng)該歸自己處理的重要標(biāo)識。
- flannel.1設(shè)備只知道另一端flannel.1設(shè)備的MAC地址,卻不知道對應(yīng)的宿主機(jī)地址是什么。在linux內(nèi)核里面,網(wǎng)絡(luò)設(shè)備進(jìn)行轉(zhuǎn)發(fā)的依據(jù),來自FDB的轉(zhuǎn)發(fā)數(shù)據(jù)庫,這個flannel.1網(wǎng)橋?qū)?yīng)的FDB信息,是由flanneld進(jìn)程維護(hù)的。
- linux內(nèi)核在IP包前面再加上二層數(shù)據(jù)幀頭,把目標(biāo)節(jié)點(diǎn)的MAC地址填進(jìn)去,MAC地址從宿主機(jī)的ARP表獲取。
- 此時flannel.1設(shè)備就可以把這個數(shù)據(jù)幀從eth0發(fā)出去,再經(jīng)過宿主機(jī)網(wǎng)絡(luò)來到目標(biāo)節(jié)點(diǎn)的eth0設(shè)備。目標(biāo)主機(jī)內(nèi)核網(wǎng)絡(luò)棧會發(fā)現(xiàn)這個數(shù)據(jù)幀有VXLAN Header,并且VNI為1,Linux內(nèi)核會對它進(jìn)行拆包,拿到內(nèi)部數(shù)據(jù)幀,根據(jù)VNI的值,交給本機(jī)flannel.1設(shè)備處理,flannel.1拆包,根據(jù)路由表發(fā)往cni網(wǎng)橋,最后到達(dá)目標(biāo)容器。
flannel支持多種后端:
- Vxlan
vxlan //報文封裝,默認(rèn)
Directrouting //直接路由,跨網(wǎng)段使用vxlan,同網(wǎng)段使用host-gw模式。
- host-gw: //主機(jī)網(wǎng)關(guān),性能好,但只能在二層網(wǎng)絡(luò)中,不支持跨網(wǎng)絡(luò),如果有成千上萬的Pod,容易產(chǎn)生廣播風(fēng)暴,不推薦
- UDP: //性能差,不推薦
- flannel網(wǎng)絡(luò)
VXLAN,即Virtual Extensible LAN(虛擬可擴(kuò)展局域網(wǎng)),是Linux本身支持的一網(wǎng)種網(wǎng)絡(luò)虛擬化技術(shù)。VXLAN可以完全在內(nèi)核態(tài)實(shí)現(xiàn)封裝和解封裝工作,從而通過“隧道”機(jī)制,構(gòu)建出覆蓋網(wǎng)絡(luò)(Overlay Network)。
VTEP:VXLAN Tunnel End Point(虛擬隧道端點(diǎn)),在Flannel中 VNI的默認(rèn)值是1,這也是為什么宿主機(jī)的VTEP設(shè)備都叫flannel.1的原因。
Cni0: 網(wǎng)橋設(shè)備,每創(chuàng)建一個pod都會創(chuàng)建一對 veth pair。其中一端是pod中的eth0,另一端是Cni0網(wǎng)橋中的端口(網(wǎng)卡)。
Flannel.1: TUN設(shè)備(虛擬網(wǎng)卡),用來進(jìn)行 vxlan 報文的處理(封包和解包)。不同node之間的pod數(shù)據(jù)流量都從overlay設(shè)備以隧道的形式發(fā)送到對端。
Flanneld:flannel在每個主機(jī)中運(yùn)行flanneld作為agent,它會為所在主機(jī)從集群的網(wǎng)絡(luò)地址空間中,獲取一個小的網(wǎng)段subnet,本主機(jī)內(nèi)所有容器的IP地址都將從中分配。同時Flanneld監(jiān)聽K8s集群數(shù)據(jù)庫,為flannel.1設(shè)備提供封裝數(shù)據(jù)時必要的mac、ip等網(wǎng)絡(luò)數(shù)據(jù)信息。
- flannel網(wǎng)絡(luò)原理
當(dāng)容器發(fā)送IP包,通過veth pair 發(fā)往cni網(wǎng)橋,再路由到本機(jī)的flannel.1設(shè)備進(jìn)行處理。
VTEP設(shè)備之間通過二層數(shù)據(jù)幀進(jìn)行通信,源VTEP設(shè)備收到原始IP包后,在上面加上一個目的MAC地址,封裝成一個內(nèi)部數(shù)據(jù)幀,發(fā)送給目的VTEP設(shè)備。
內(nèi)部數(shù)據(jù)楨,并不能在宿主機(jī)的二層網(wǎng)絡(luò)傳輸,Linux內(nèi)核還需要把它進(jìn)一步封裝成為宿主機(jī)的一個普通的數(shù)據(jù)幀,承載著內(nèi)部數(shù)據(jù)幀通過宿主機(jī)的eth0進(jìn)行傳輸。
Linux會在內(nèi)部數(shù)據(jù)幀前面,加上一個VXLAN頭,VXLAN頭里有一個重要的標(biāo)志叫VNI,它是VTEP識別某個數(shù)據(jù)楨是不是應(yīng)該歸自己處理的重要標(biāo)識。
flannel.1設(shè)備只知道另一端flannel.1設(shè)備的MAC地址,卻不知道對應(yīng)的宿主機(jī)地址是什么。在linux內(nèi)核里面,網(wǎng)絡(luò)設(shè)備進(jìn)行轉(zhuǎn)發(fā)的依據(jù),來自FDB的轉(zhuǎn)發(fā)數(shù)據(jù)庫,這個flannel.1網(wǎng)橋?qū)?yīng)的FDB信息,是由flanneld進(jìn)程維護(hù)的。
linux內(nèi)核在IP包前面再加上二層數(shù)據(jù)幀頭,把目標(biāo)節(jié)點(diǎn)的MAC地址填進(jìn)去,MAC地址從宿主機(jī)的ARP表獲取。
此時flannel.1設(shè)備就可以把這個數(shù)據(jù)幀從eth0發(fā)出去,再經(jīng)過宿主機(jī)網(wǎng)絡(luò)來到目標(biāo)節(jié)點(diǎn)的eth0設(shè)備。目標(biāo)主機(jī)內(nèi)核網(wǎng)絡(luò)棧會發(fā)現(xiàn)這個數(shù)據(jù)幀有VXLAN Header,并且VNI為1,Linux內(nèi)核會對它進(jìn)行拆包,拿到內(nèi)部數(shù)據(jù)幀,根據(jù)VNI的值,交給本機(jī)flannel.1設(shè)備處理,flannel.1拆包,根據(jù)路由表發(fā)往cni網(wǎng)橋,最后到達(dá)目標(biāo)容器。
- flannel支持多種后端:
1. Vxlan
vxlan //報文封裝,默認(rèn)
Directrouting //直接路由,跨網(wǎng)段使用vxlan,同網(wǎng)段使用host-gw模式。
2. host-gw: //主機(jī)網(wǎng)關(guān),性能好,但只能在二層網(wǎng)絡(luò)中,不支持跨網(wǎng)絡(luò),如果有成千上萬的Pod,容易產(chǎn)生廣播風(fēng)暴,不推薦
3. UDP: //性能差,不推薦
(2)vxlan模式(默認(rèn)模式)
[root@server2 ~]# vim damo.yml
[root@server2 ~]# cat damo.yml
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
#clusterIP: None
#type: NodePort
#type: LoadBalancer
externalIPs:
- 172.25.13.100
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo2
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2
[root@server2 ~]# kubectl apply -f damo.yml
[root@server2 ~]# kubectl get pod -o wide ##查看詳細(xì)信息
##下面的命令每一個節(jié)點(diǎn)都可以用
[root@server2 ~]# cat /run/flannel/subnet.env
[root@server2 ~]# ip n ##獲取對應(yīng)mac地址
[root@server2 ~]# ip addr ##查看flannel.1對應(yīng)的mac地址
[root@server4 ~]# bridge fdb
[root@server2 ~]# kubectl attach demo -it
/ # ping 10.244.2.44
[root@server3 ~]# tcpdump -i eth0 -nn host 172.25.70.4
(3)host-gw模式:主機(jī)網(wǎng)關(guān)
[root@server2 ~]# kubectl -n kube-system edit cm kube-flannel-cfg
Type: ##修改模式為host-gw
[root@server2 ~]# kubectl get pod -n kube-system |grep flannel | awk '{system("kubectl delete pod "$1" -n kube-system")}'
##類似于之前,重啟生效,是一個刪除在生成的過程
[root@server3 ~]# ip route ##每個節(jié)點(diǎn)都可以通過這條命令查看route,也可以用route -n
(4)Directrouting:直接路由
[root@server2 ~]# kubectl -n kube-system edit cm kube-flannel-cfg ##修改模式
[root@server2 ~]# kubectl get pod -n kube-system |grep flannel | awk '{system("kubectl delete pod "$1" -n kube-system")}' ##重新生效
三、flannel網(wǎng)絡(luò)插件
使用host-gw模式:每個網(wǎng)段加了靜態(tài)路由,就不需要封裝后走隧道(隧道接口還在,虛擬機(jī)重啟后,接口消失)(上面也有此部分演示)
[root@k8s2 ~]# kubectl -n kube-flannel edit cm kube-flannel-cfg
重啟pod生效
[root@k8s2 ~]# kubectl -n kube-flannel delete pod --all
加了靜態(tài)路由 ,訪問10.244.1.0,通過eth0訪問192.168.56.13即可
訪問10.244.2.0,通過eth0訪問192.168.56.14即可
四、calico網(wǎng)絡(luò)插件
官方網(wǎng)址:https://docs.tigera.io/
對比flannel,calico支持網(wǎng)絡(luò)策略
1.部署:
刪除flannel插件
[root@k8s2 ~]# kubectl delete -f kube-flannel.yml
刪除所有節(jié)點(diǎn)上flannel配置文件,避免沖突,部署完后,會生成calico文件
[root@k8s2 ~]# rm -f /etc/cni/net.d/10-flannel.conflist
[root@k8s3 ~]# rm -f /etc/cni/net.d/10-flannel.conflist
[root@k8s4 ~]# rm -f /etc/cni/net.d/10-flannel.conflist
下載部署文件
[root@k8s2 calico]# wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
修改鏡像路徑
[root@k8s2 calico]# vim calico.yaml
下載鏡像
[root@k8s1 ~]# docker pull docker.io/calico/cni:v3.25.0
[root@k8s1 ~]# docker pull docker.io/calico/node:v3.25.0
[root@k8s1 ~]# docker pull docker.io/calico/kube-controllers:v3.25.0
上傳鏡像到harbor
部署calico
[root@k8s2 calico]# kubectl apply -f calico.yaml
重啟所有集群節(jié)點(diǎn),讓pod重新分配IP
[root@server3 ~]# systemctl daemon-reload
[root@server3 ~]# systemctl restart kubelet
等待集群重啟正常后測試網(wǎng)絡(luò)
[root@k8s1 ~]# curl myapp.westos.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
2.網(wǎng)絡(luò)策略
(1)限制pod流量
[root@k8s2 calico]# vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: myapp-v1
policyTypes:
- Ingress ##控制入站
ingress:
- from: ##什么樣的數(shù)據(jù)包能進(jìn)來訪問myapp-v1的pod,標(biāo)簽是myapp-v1,就會控制流量
- podSelector:
matchLabels:
role: test ##角色
ports:
- protocol: TCP
port: 80
[root@k8s2 calico]# kubectl apply -f networkpolicy.yaml
構(gòu)建的策略顯示如下圖中部分:
控制的對象是具有app=myapp-v1標(biāo)簽的pod
此時訪問svc是不通的,得符合網(wǎng)絡(luò)策略的流量才可以訪問
[root@k8s2 calico]# kubectl run demo --image busyboxplus -it --rm
If you don't see a command prompt, try pressing enter.
/ # curl 10.108.1.129 ##不通
給測試pod添加指定標(biāo)簽后,可以訪問
[root@k8s2 calico]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
demo 1/1 Running 0 61s run=demo
root@k8s2 calico]# kubectl label pod demo role=test ##加標(biāo)簽和角色
加角色和標(biāo)簽后,在demo,可以訪問:
(2)限制namespace流量
[root@k8s2 calico]# vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: myapp-v1
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: ## 新建test 中namespace
matchLabels:
project: test
- podSelector: ##和namespace 二選一
matchLabels:
role: test
ports:
- protocol: TCP
port: 80
[root@k8s2 calico]# kubectl apply -f networkpolicy.yaml
from后顯示兩個策略:
[root@k8s2 ~]# kubectl create namespace test
給namespace添加指定標(biāo)簽:
[root@k8s2 calico]# kubectl label ns test project=test
[root@k8s2 calico]# kubectl -n test run demo --image busyboxplus -it --rm
If you don’t see a command prompt, try pressing enter.
/ # curl 10.108.1.129
Hello MyApp | Version: v1 | Pod Name
(3)同時限制namespace和pod
[root@k8s2 calico]# vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: myapp-v1
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: test
podSelector: ##相比上面實(shí)驗,去掉“-”;表示同時限制namespace和pod
matchLabels:
role: test
ports:
- protocol: TCP
port: 80
[root@k8s2 calico]# kubectl apply -f networkpolicy.yaml
給test命令空間中的pod添加指定標(biāo)簽后才能訪問
[root@k8s2 calico]# kubectl -n test label pod demo role=test
pod/demo labeled
[root@k8s2 calico]# kubectl -n test get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
demo 1/1 Running 0 5m33s role=test,run=demo
(4)限制集群外部流量
文章來源:http://www.zghlxwxcb.cn/news/detail-732598.html
[root@k8s2 calico]# vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: myapp-v1
policyTypes:
- Ingress
ingress:
- from:
- ipBlock: ##限制網(wǎng)段,允許192.168.56.0/24進(jìn)來
cidr: 192.168.56.0/24
- namespaceSelector: ##“-”表示或者符合下面的條件
matchLabels:
project: myproject
podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
[root@k8s2 calico]# kubectl apply -f networkpolicy.yaml
[root@k8s1 ~]# curl 192.168.56.101
Hello MyApp | Version: v1 | Pod Name文章來源地址http://www.zghlxwxcb.cn/news/detail-732598.html
到了這里,關(guān)于k8s-kubernetes--網(wǎng)絡(luò)策略、flannel網(wǎng)絡(luò)插件和calico網(wǎng)絡(luò)插件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!