flannel 切換calico網絡


 

一、下載配置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協議,一旦出現問題排查起來也比較困難,上百台的,路由表去排查也是很麻煩,這個具體的需求也是跟自己餓的情況而定。

  

 

 

 

  

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM