一、下載配置calico yaml文件
curl https://docs.projectcalico.org/manifests/calico-etcd.yaml -o calico.yaml
二、修改文件
1、修改etcd的證書
[root@k8s-master ~]# cat /opt/etcd/ssl/ca.pem |base64 -w 0 [root@k8s-master ~]# cat /opt/etcd/ssl/server.pem |base64 -w 0 [root@k8s-master ~]# cat /opt/etcd/ssl/server-key.pem |base64 -w 0 將對應的都添進去,將注釋去掉: # etcd-key: null 將對應ssl下的證書轉換成base64編碼放進來,並去掉注釋 # etcd-cert: null # etcd-ca: null
2、要讀取secret落地到容器中位置,直接將注釋去掉就可以了
etcd_ca: "/calico-secrets/etcd-ca" etcd_cert: "/calico-secrets/etcd-cert" etcd_key: "/calico-secrets/etcd-key"
3、連接etcd的字符串,這與k8s連接API的字符串是一樣的
這個是在[root@k8s-master1 ~]# cat /opt/kubernetes/cfg/kube-apiserver.conf 這個目錄下,因為每個集群都是自己部署的,位置可能不一樣
etcd_endpoints: "https://192.168.124.61:2379,https://192.168.124.62:2379,https://192.168.124.63:2379"
將這個證書放進放進calico配置中
4、根據實際網絡規划修改Pod CIDR
默認的地址,需要改成自己的 - name: CALICO_IPV4POOL_CIDR value: "192.168.0.0/16"
[root@k8s-master ~]# cat /opt/kubernetes/cfg/kube-controller-manager.conf --cluster-cidr=10.244.0.0/16 \ 在配置中改成這個 - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16"
5、選擇工作模式
IPIP # Enable IPIP - name: CALICO_IPV4POOL_IPIP value: "Always"
這個變量問你要不要開啟IPIP,因為有兩種模式,第一種就是IPIP,第二種就是BGP
其實它應用最多就是BGP,將這個Always改成Never,就是將它關閉的意思
二、刪除flannel網絡
1、刪除yaml文件
[root@k8s-master k8s]# kubectl delete -f kube-flannel.yaml
2、刪除路由
每個節點都要刪除路由表和網橋,這是之前部署flannel留下的,也是避免和calico沖突。
[root@k8s-node1 ~]# ip route #查看路由 [root@k8s-node1 ~]# ip link delete cni0 [root@k8s-node1 ~]# ip link delete flannel.1 [root@k8s-node1 ~]# ip route delete 10.244.0.0/24 via 192.168.124.61 dev eth0 [root@k8s-node1 ~]# ip route delete 10.244.1.0/24 via 192.168.124.61 dev eth0
三、部署calico網絡
[root@k8s-master calico]# kubectl create -f calico.yaml [root@master metrics_server]# kubectl get pod -o wide -n kube-system NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES calico-kube-controllers-d58dbc6bd-nczw8 1/1 Running 0 16h 192.168.124.61 k8s-master1 <none> <none> calico-node-fqdvd 1/1 Running 0 16h 192.168.124.63 k8s-node2 <none> <none> calico-node-kzwwf 1/1 Running 0 16h 192.168.124.61 k8s-master1 <none> <none> calico-node-s5cf8 1/1 Running 0 16h 192.168.124.62 k8s-node1 <none> <none> coredns-5ffbfd976d-9gb8c 1/1 Running 0 55m 10.244.36.64 k8s-node1 <none> <none> metrics-server-6dd556ccd4-57zdw 1/1 Running 0 54m 10.244.36.65 k8s-node1 <none> <none>
目前為止去查看網絡,會發現不到calico的路由表,因為目前的pod沒有使用當前的calico的網絡,需要重建才會應用到,所以這也是會受到一些影響的,這個需要提前做好准備
重建這些pod之后,網絡就會根據calico的規則生成路由表,你會發現之前的pod,使用flannel部署的pod已經無法互通了,所以切換網絡也是一個比較大的事情,需要注意安排時間去做這件事
測試一下:
[root@master ~]# kubectl create deployment web --image=nginx [root@master ~]# kubectl scale deployment web --replicas=3 [root@master ~]# ip route default via 192.168.124.1 dev ens33 proto static metric 100 10.244.36.64/26 via 192.168.124.62 dev ens33 proto bird 10.244.169.128/26 via 192.168.124.63 dev ens33 proto bird blackhole 10.244.219.64/26 proto bird 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 192.168.124.0/24 dev ens33 proto kernel scope link src 192.168.124.61 metric 100
四、calico 管理工具
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.16.4/calicoctl mv calicoctl /usr/local/bin/ chmod +x /usr/local/bin/calicoctl
安裝好這個管理工具之后就可以查看當前節點BGP的節點狀態
[root@master ~]# calicoctl node status Calico process is running. IPv4 BGP status +----------------+-------------------+-------+----------+-------------+ | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO | +----------------+-------------------+-------+----------+-------------+ | 192.168.124.62 | node-to-node mesh | up | 01:35:46 | Established | | 192.168.124.63 | node-to-node mesh | up | 01:35:46 | Established | +----------------+-------------------+-------+----------+-------------+ IPv6 BGP status No IPv6 peers found.
這個工具主要也是往etcd里去操作,主要再etcd去獲得,這個表只不過是幫你從etcd中拿出來格式化輸出
可以通過這個命令可以看出,進行長鏈接輸出出來
[root@master ~]# netstat -anpt |grep bird tcp 0 0 0.0.0.0:179 0.0.0.0:* LISTEN 79898/bird tcp 0 0 192.168.124.61:179 192.168.124.63:50255 ESTABLISHED 79898/bird tcp 0 0 192.168.124.61:179 192.168.124.62:60507 ESTABLISHED 79898/bird
如果想使用calicoctl get node,就需要指定配置文件了,默認在/etc/calico/calicoctl.cfg下
主要修改etcd的路徑,還有它連接的證書,它主要操作etcd
mkdir /etc/calico vim /etc/calico/calicoctl.cfg apiVersion: projectcalico.org/v3 kind: CalicoAPIConfig metadata: spec: datastoreType: "etcdv3" etcdEndpoints: "https://192.168.124.61:2379,https://192.168.124.62:2379,https://192.168.124.63:2379" etcdKeyFile: "/opt/etcd/ssl/server-key.pem" etcdCertFile: "/opt/etcd/ssl/server.pem" etcdCACertFile: "/opt/etcd/ssl/ca.pem"
這樣的話就能使用calicocatl get node了,這樣的話就是在etcd中去拿的數據了
[root@master ~]# calicoctl get nodes NAME k8s-node1 k8s-node2 master
查看 IPAM的IP地址池:
[root@master ~]# calicoctl get ippool -o wide NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR default-ipv4-ippool 10.244.0.0/16 true Never Never false all()
Route Reflector 模式(RR)(路由反射)
https://docs.projectcalico.org/master/networking/bgp
1、關閉 node-to-node BGP網格
添加 default BGP配置,調整 nodeToNodeMeshEnabled和asNumber:
[root@k8s-master1 calico]# cat bgp.yaml apiVersion: projectcalico.org/v3 kind: BGPConfiguration metadata: name: default spec: logSeverityScreen: Info nodeToNodeMeshEnabled: false asNumber: 63400
直接應用一下,當我們禁用node-to-node mesh的時候,網絡立馬就會斷,所以斷的話要提前做好影響的范圍,也就是切換這個網絡是需要斷網的,使用node-to-node BGP這種也是建議100個節點以下,當超過100台節點一定要使用路由反射RR模式
[root@k8s-master1 calico]# calicoctl apply -f bgp.yaml Successfully applied 1 'BGPConfiguration' resource(s)
查看bgp網絡配置情況,false為關閉
[root@k8s-master1 calico]# calicoctl get bgpconfig NAME LOGSEVERITY MESHENABLED ASNUMBER default Info false 63400
去查看pod的網絡測試已經斷開了,這里是因為我們使用caclico的配置禁用了node-to-node mesh了
[root@k8s-master1 calico]# ping 10.244.245.2 PING 10.244.245.2 (10.244.245.2) 56(84) bytes of data
ASN號可以通過獲取 # calicoctl get nodes --output=wide
這里有個編號,ASN64300,一個編號就是一個自治系統
[root@k8s-master1 calico]# calicoctl get nodes --output=wide NAME ASN IPV4 IPV6 k8s-master1 (63400) 10.4.7.11/24 k8s-node1 (63400) 10.4.7.12/24 k8s-node2 (63400) 10.4.7.21/24
2、配置指定節點充當路由反射器
為方便讓BGPPeer輕松選擇節點,通過標簽選擇器匹配,也就是可以去調用k8s里面的標簽進行關聯,我們可以給哪個節點作為路由發射器打個標簽
給路由器反射器節點打標簽,我這將node1打上標簽
[root@k8s-master1 calico]# kubectl label node k8s-node1 route-reflector=true
查看node BJP的節點狀態,因為禁用了網格,所以這里都關閉了,所以也就不通了。
[root@k8s-master1 calico]# calicoctl node status Calico process is running. IPv4 BGP status No IPv4 peers found. IPv6 BGP status No IPv6 peers found.
然后配置路由器反射器節點routeReflectorClusterID,增加一個集群節點的ID
下面的可以通過-o yaml輸出出來
[root@k8s-master1 calico]# calicoctl get node k8s-node2 -o yaml > node.yaml apiVersion: projectcalico.org/v3 kind: Node metadata: annotations: projectcalico.org/kube-labels: '{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"k8s-node2","kubernetes.io/os":"linux"}' creationTimestamp: "2020-11-05T01:34:20Z" labels: beta.kubernetes.io/arch: amd64 beta.kubernetes.io/os: linux kubernetes.io/arch: amd64 kubernetes.io/hostname: k8s-node2 kubernetes.io/os: linux name: k8s-node2 resourceVersion: "208633" uid: 82582f30-602c-452c-b3ed-6e77d72200d7 spec: bgp: ipv4Address: 192.168.124.63/24 routeReflectorClusterID: 244.0.0.1 orchRefs: - nodeName: k8s-node2 orchestrator: k8s status: {}
routeReflectorClusterID: 244.0.0.1 唯一網絡
執行:
[root@k8s-master1 calico]# calicoctl apply -f node.yaml
將其他的節點去連接這個k8s-node1打標簽的路由發射器
[root@k8s-master1 calico]# cat bgp1.yaml apiVersion: projectcalico.org/v3 kind: BGPPeer metadata: name: peer-with-route-reflectors spec: nodeSelector: all() #所有的節點 peerSelector: route-reflector == 'true'
查看節點的BGP規則與連接狀態,這樣的話就顯示一個路由反射器的節點
[root@k8s-master1 calico]# calicoctl apply -f bgp1.yaml Successfully applied 1 'BGPPeer' resource(s) [root@k8s-master1 calico]# calicoctl get bgppeer NAME PEERIP NODE ASN peer-with-route-reflectors all() 0 [root@k8s-master1 calico]# calicoctl node status Calico process is running. IPv4 BGP status +--------------+---------------+-------+----------+-------------+ | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO | +--------------+---------------+-------+----------+-------------+ | 192.168.124.63 | node specific | up | 08:22:22 | Established | +--------------+---------------+-------+----------+-------------+ IPv6 BGP status No IPv6 peers found.
測試與容器連接
添加多個路由反射器
現在進行對路由反射器添加多個,100個節點以內建議2-3個路由反射器
1、進行對集群節點打標簽
[root@k8s-master1 calico]# kubectl label node k8s-node2 route-reflector=true node/k8s-node2 labeled
2、對k8s-node2添加然后配置路由器反射器節點
[root@k8s-master1 calico]# calicoctl get node k8s-node2 -o yaml > node2.yaml [root@k8s-master1 calico]# vim node2.yaml 增加 routeReflectorClusterID: 244.0.0.1 [root@k8s-master1 calico]# calicoctl apply -f node2.yaml
3、查看節點狀態
[root@k8s-master1 calico]# calicoctl node status Calico process is running. IPv4 BGP status +--------------+---------------+-------+----------+-------------+ | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO | +--------------+---------------+-------+----------+-------------+ | 192.168.124.62 | node specific | up | 08:22:22 | Established | | 192.168.124.63 | node specific | up | 08:44:44 | Established | +--------------+---------------+-------+----------+-------------+
4、試網絡連通性
IPIP模式
ipip模式與flannel的vxlan模式類似,這個也是對數據包的一個封裝
Flannel host-gw 模式最主要的限制,就是要求集群宿主機之間是二層連通的。而這個限制對於 Calico 來說,也同樣存在,也是不能跨vlan的,主要局限就是數據包主要封裝的是容器,源IP和目的IP,因為它們工作都是使用的二層,所以二層它不會考慮容器之間進行數據包轉發的,但如果添加路由表,將目的的IP通過靜態路由的方式也能實現,不同vlan的數據的通信,不過這種方式目前沒有測試。
另外還有一個弊端,會發現calico的路由表比flannel的多一些,因為它里面還要加一些傳入過來的到設備的路由表信息,就是每個pod都加一個路由表,所以它的路由表的量也比flannel大不少。
1、修改為IPIP模式:
[root@master ~]# calicoctl get ippool -o yaml > ipip.yaml [root@master ~]# vi ipip.yaml apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: blockSize: 26 cidr: 10.244.0.0/16 ipipMode: Always natOutgoing: true [root@master ~]# calicoctl apply -f ipip.yaml
2、創建好之后查看詳細信息,已經開啟ippool
[root@k8s-master ~]# calicoctl get ippool -o wide NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR default-ipv4-ippool 10.244.0.0/16 true Always Never false all()
3、查看網絡設備會增加一個tunl0,增加了一個隧道的網卡
tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN group default qlen 1000 link/ipip 0.0.0.0 brd 0.0.0.0 inet 10.244.113.131/32 brd 10.244.113.131 scope global tunl0 valid_lft forever preferred_lft forever
4、測試網絡
CNI 網絡方案優缺點及最終選擇
先考慮幾個問題:
需要細粒度網絡訪問控制?這個flannel是不支持的,calico支持,所以做多租戶網絡方面的控制ACL,那么要選擇calico
追求網絡性能?這兩個方案無疑是flannel和calico的路由方案是最高的,也就是flannel的host-gw和calico的BGP。
服務器之前是否可以跑BGP協議?很多的公有雲是不支持跑BGP協議的,那么使用calico的BGP模式自然是不行的。
集群規模多大?如果規模不大,100節點以下維護起來比較方面之間可以使用flannel就可以
是否有維護能力?calico的路由表很多,而且走BGP協議,一旦出現問題排查起來也比較困難,上百台的,路由表去排查也是很麻煩,這個具體的需求也是跟自己餓的情況而定。