天天看點

K8S Calico網絡插件

0.前言

參考文檔:https://github.com/containernetworking/cni

Pod網絡插件,為了實作Pod網絡而需要的插件、元件。由于Kubernetes通過開放的CNI接口來允許插件的接入,是以它又稱之為CNI網絡插件。

為了解決跨主機容器間通信問題,市面上存在很多解決方案,為了相容和規範這些解決方案,Kubernetes僅設計了網絡模型,卻将Pod網絡的實作交給了CNI網絡插件,并允許網絡插件通過标準的CNI(Container Network Interface,容器網絡接口)連接配接到容器管理系統。

CNI網絡插件主要解決的就是容器跨主機通信問題而存在的,并使跨主機間運作的Pod位于同一個網絡平面,其大緻解決步驟通常有兩步:配置設定設定自定義容器網絡(PodIP在叢集中全局唯一性)和實作容器網絡通信(處理方法通常有路由、覆寫網絡{Vxlan、IPIP}等等)。

每個Pod都會建立一個名叫"pause"的根容器,其他運作的業務容器都是複制該容器的網絡,這個容器就是Kubernetes為了自定義網絡等特殊功能而存在的。

CNI網絡插件分為以下四種:

  • MAIN,主要的,建立接口,主要網絡的實作。如:bridge、ipvlan、loopback、macvlan、ptp、vlan、host-device。
  • Windows,特用于Windows的MAIN插件。如:win-bridge、win-overlay。
  • IPAM,僅提供IP位址配置設定功能。如:dhcp、host-local、static。
  • META,其他插件,通過調用第三方插件來實作網絡功能。如:tuning、portmap、bandwidth、sbr、firewall、flannel。

光單獨靠一種CNI網絡插件是無法實作完整的Pod網絡通信和更進階的網絡政策功能的,第三方組織可以靈活的組合這些CNI插件實作基本Pod網絡功能和更進階功能,是以市面上流行出來很多解決方案。

在現今,比較常用的流行的Pod網絡解決方案有Flannel和Calico(支援網絡政策功能)、Canal(由Flannel實作網絡通信+Calico提供網絡政策)。

1.Calico概述

參考文檔:https://projectcalico.docs.tigera.io/

Calico是一款廣泛采用、久經考驗的開源網絡和網絡安全解決方案,适用于Kubernetes、虛拟機和裸機工作負載。與Flannel對比,Calico除了支援基本網絡功能的實作之外,它還支援全套Kubernetes網絡政策功能,以及在其之上擴充網絡政策。

1.1.Calico元件

Calico主要由以下元件組成:

1.1.1.CNI Plugin

CNI網絡插件,Calico通過CNI網絡插件與kubelet關聯,進而實作Pod網絡。

1.1.2.Calico Node

Calico節點代理是運作在每個節點上的代理程式,負責管理節點路由資訊、政策規則和建立Calico虛拟網絡裝置。

Calico Node主要由以下子子產品程式組成:

  • Felix,Calico代理程式。運作在每個節點上的守護程序,它主要負責管理節點上網絡接口、為節點建立路由資訊和ACL規則、以及報告目前節點網絡的健康狀态給控制器等工作。
  • BIRD-BGP用戶端,BIRD是一個項目的簡稱,全稱為BIRD Internet Routing Daemon,BIRD是一個類UNIX系統下旨在開發一個功能齊全的IP路由守護程序,它是一個路由軟體,可以實作多種路由協定,如BGP、OSPF、RIP等。在Calico中,BIRD是一個BGP用戶端,用于使用BGP協定廣播給其他主機動态的學習路由規則。更多了解BIRD可參考:https://bird.network.cz/。
  • BIRD-Route Reflector(可擴充的元件),BGP用戶端在每個節點上運作,其随着節點數量越來越多,一個BGP用戶端需要連接配接更多數量的其他BGP用戶端,其網絡連接配接的數量非常多且網絡會變得複雜。在節點之外,允許将BIRD程式配置成"Route Reflector"路由反射器工作方式,BGP用戶端可以直接連接配接到"Route Reflector"路由反射器,而不是很多數量的其他BGP用戶端,進而減少網絡連接配接的數量,以提高BGP網絡的性能。
    K8S Calico網絡插件

1.1.3.Calico Controller

Calico網絡政策控制器。允許建立"NetworkPolicy"資源對象,并根據資源對象裡面對網絡政策定義,在對應節點主機上建立針對于Pod流出或流入流量的IPtables規則。

1.1.4.Calico Typha(可選的擴充元件)

Typha是Calico的一個擴充元件,用于Calico通過Typha直接與Etcd通信,而不是通過kube-apiserver。通常當K8S的規模超過50個節點的時候推薦啟用它,以降低kube-apiserver的負載。每個Pod/calico-typha可承載100~200個Calico節點的連接配接請求,最多不要超過200個。

1.2.Calico網絡實作

Calico支援兩種類型網絡工作模式(後端機制):

如果實體主機在同一2層網絡中,則建議采用使用BGP動态路由通信方式;如果實體主機是跨子網通信的話,可能由于到達目标主機的跳數太多導緻性能下降,是以建議使用覆寫網絡模式。

1.2.1.動态路由模式(dynamic routing)

采用BGP動态路由協定自動學習來自其他AS自治系統上的路由條目,即其他節點主機上的路由條目。

類似于Flannel的Host-GW模式,不過它沒有不能跨子網的限制。

想要更多了解BGP動态路由技術,可以參考其他網絡資料,這裡就不過多的闡述了。

1.2.2.覆寫網絡模式(overlay network)

采用IPIP或VXLAN協定封裝底層網絡,然後通過上層實體覆寫網絡通信。

将底層的Pod網絡源目IP+資料封裝到上層實體網絡源目IP的資料包中,由同一個網絡的實體主機通過直連路由完成資料包的傳輸和解封裝,以實作底層Pod網絡通信。

Calico對于覆寫網絡的工作模式有:

  • IPIP,使用IPIP封裝協定。當IPIP啟用的時候不允許啟用VXLAN。
  • VXLAN,使用VXLAN封裝協定。當VXLAN啟用的時候不允許啟用IPIP。
  • IPIPCrossSubnet,當實體主機是跨子網的情況下才使用IPIP覆寫網絡通信方式,正常情況下使用BGP路由模式。
  • VXLANCrossSubnet,當實體主機是跨子網的情況下才使用VXLAN覆寫網絡通信方式,正常情況下使用BGP路由模式。
  • None,不使用IPIP或VXLAN覆寫網絡模式。

IPIP比VxLAN的資料標頭更小,但安全性較差。

虛接口:IPIP預設建立的三層虛接口通常叫"tunl0",而VXLAN預設建立的三層虛接口叫"vxlan.calico"。三層虛接口通常負責資料包的封裝和解封裝工作。

K8S Calico網絡插件

1.3.了解Calico對CIDR子網的劃分(blockSize)

CIDR,Classless Inter-Domain Routing,無類别域間路由,在Kubernetes中指基于CIDR的網絡劃分方案,為Pod配置設定的子網範圍(如:10.244.0.0/12)。

通常預設情況下,PodIP位址範圍(--pod-network-cidr)為10.244.0.0/16,它擁有16^2=256*256=65536個位址(包括網絡位址+廣播位址)可拆分成獨立子網。

Calico為每個節點都會建立一個獨立子網,即從CIDR大的位址池中劃分較小範圍的位址池給到每個節點。

Calico可以通過修改配置blockSize塊大小來設定每個節點配置設定的獨立子網的範圍池大小。這邊預設值IPV4=26,IPV6=122。

二進制掩碼26(11111111 11111111 11111111 11000000)轉換成十進制掩碼即=255.255.255.192,即每個節點的子網可以有64個IP位址,減去廣播位址和網絡位址,可為Pod配置設定的有效IP位址有62個。

1.4.Calico網絡政策

Calico使用IPtables實作網絡政策功能,在Kubernetes中可以建立"NetworkPolicy"資源對象傳給Calico的控制器,由Calico Node根據NetworkPolicy定義的規則在相關節點上建立對應的IPtables規則,以實作對Pod出入口網絡流量的安全政策限制。

2.安裝Calico

Calico有兩種安裝方式:

  • 使用calico.yaml清單檔案安裝
  • 使用Tigera Calico Operator安裝Calico(官方最新指導)

    Tigera Calico Operator,Calico操作員是一款用于管理Calico安裝、更新的管理工具,它用于管理Calico的安裝生命周期。從Calico-v3.15版本官方開始使用此工具。

    Calico安裝要求:

  • x86-64, arm64, ppc64le, or s390x processor
  • 2個CPU
  • 2GB運作記憶體
  • 10GB硬碟空間
  • RedHat Enterprise Linux 7.x+, CentOS 7.x+, Ubuntu 16.04+, or Debian 9.x+
  • 確定Calico可以管理主機上的cali和tunl接口。

2.1.使用calico.yaml清單檔案安裝Calico

參考文檔:https://projectcalico.docs.tigera.io/archive/v3.14/getting-started/kubernetes/quickstart

目前主機環境:

  • 主機系統:CentOS Linux release 7.6.1810 (Core)
  • Kubernetes版本:v1.23.0

    Calico版本:v3.23.0

    其他提示:預設的calico.yaml清單檔案無需手動配置Pod子網範圍(如果需要,可通過CALICO_IPV4POOL_CIDR指定),預設使用kube-controller-manager的"--cluster-cidr"啟動項的值,即kubeadm init時指定的"--pod-network-cidr"或清單檔案中使用"podSubnet"的值。

1、配置Docker鏡像加速

鏡像加速由阿裡雲"容器加速器"提供。

由于安裝清單中所使用的鏡像來源于國外站點,是以需要配置為國内鏡像源才能正常下載下傳鏡像到國内主機。

建立配置檔案"/etc/docker/daemon.json",并寫入以下内容:

[root@localhost ~]# mkdir -p /etc/docker 
[root@localhost ~]# cat /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
        "https://7mimmp7p.mirror.aliyuncs.com",
        "https://registry.docker-cn.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
        ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
           

重新開機docker服務即可:

[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
           

2、配置NetworkManager

如果主機系統使用NetworkManager來管理網絡的話,則需要配置NetworkManager,以允許Calico管理接口。

NetworkManger操作預設網絡命名空間接口的路由表,這可能會幹擾Calico代理正确路由的能力。

在所有主機上操作:

[root@k8s-master01 ~]# cat > /etc/NetworkManager/conf.d/calico.conf <<EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:wireguard.cali
EOF
           

3、下載下傳calico.yaml

[root@k8s-master01 ~]# wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml --no-check-certificate
           

4、修改calico.yaml

由于預設的Calico清單檔案中所使用的鏡像來源于docker.io國外鏡像源,上面我們配置了Docker鏡像加速,應删除docker.io字首以使鏡像從國内鏡像加速站點下載下傳。

[root@k8s-master01 ~]# cat calico.yaml |grep 'image:'
          image: docker.io/calico/cni:v3.23.0
          image: docker.io/calico/cni:v3.23.0
          image: docker.io/calico/node:v3.23.0
          image: docker.io/calico/kube-controllers:v3.23.0
[root@k8s-master01 ~]# sed -i 's#docker.io/##g' calico.yaml
[root@k8s-master01 ~]# cat calico.yaml |grep 'image:'
          image: calico/cni:v3.23.0
          image: calico/cni:v3.23.0
          image: calico/node:v3.23.0
          image: calico/kube-controllers:v3.23.0
           

5、應用calico.yaml

[root@k8s-master01 ~]# kubectl apply -f calico.yaml
           

Pod-Calico在"kube-system"名稱空間下建立并運作起來:

[root@k8s-master01 ~]# kubectl get pod -n kube-system |grep calico
calico-kube-controllers-77d9858799-c267f   1/1     Running   0              92s
calico-node-6jw5q                          1/1     Running   0              92s
calico-node-krrn6                          1/1     Running   0              92s
calico-node-mgk2g                          1/1     Running   0              92s
calico-node-wr2pv                          1/1     Running   0              92s
           

2.2.使用Tigera Calico Operator安裝Calico

這種是官方文檔最新指導的安裝方式。

Tigera Calico Operator通常會安裝最新版本的Calico版本,并使用最新的功能。

1、配置NetworkManager

如果主機系統使用NetworkManager來管理網絡的話,則需要配置NetworkManager,以允許Calico管理接口。

NetworkManger操作預設網絡命名空間接口的路由表,這可能會幹擾Calico代理正确路由的能力。

在所有主機上操作:

[root@k8s-master01 ~]# cat > /etc/NetworkManager/conf.d/calico.conf <<EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:wireguard.cali
EOF
           

2、使用tigera-operator.yaml清單檔案安裝Tigera Calico operator

參考文檔:https://github.com/tigera/operator

tigera-operator.yaml清單檔案用于安裝Tigera Calico operator。

operator的鏡像來源于quay.io。

[root@k8s-master01 ~]# wget https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml -O calico-tigera-operator.yaml --no-check-certificate
[root@k8s-master01 ~]# cat calico-tigera-operator.yaml |grep 'image:'
          image: quay.io/tigera/operator:v1.27.0
[root@k8s-master01 ~]# kubectl apply -f calico-tigera-operator.yaml 
[root@k8s-master01 ~]# kubectl get pod -n tigera-operator -o wide
NAME                               READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE   READINESS GATES
tigera-operator-566769dc67-mrnhs   1/1     Running   0          5m39s   192.168.124.132   k8s-node01   <none>           <none>
           

3、下載下傳并配置custom-resources.yaml清單檔案

custom-resources.yaml用于自定義通過Tigera Calico operator安裝和配置Calico,它會建立由operator實作的Installation資源對象。

在自定義Calico之前可以通過"https://projectcalico.docs.tigera.io/reference/installation/api#operator.tigera.io/v1.Installation"先了解安裝配置。

注:這邊需要修改一下Pod配置設定子網範圍(CIDR),該位址需要與kubeadm初始化叢集時的"podSubnet"字段或"--pod-network-cidr"參數中填寫的值相同。

[root@k8s-master01 ~]# wget https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml -O calico-custom-resources.yaml --no-check-certificate
[root@k8s-master01 ~]# vim calico-custom-resources.yaml
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 10.244.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()
           

4、應用custom-resources.yaml清單檔案

[root@k8s-master01 ~]# kubectl apply -f calico-custom-resources.yaml 
           

5、檢視Calico是否運作

Tigera Calico Operator會自動建立一個名叫"calico-system"的名稱空間來運作Calico。

[root@k8s-master01 ~]# kubectl get namespace 
NAME              STATUS   AGE
calico-system     Active   3m10s
default           Active   5m55s
kube-node-lease   Active   5m57s
kube-public       Active   5m57s
kube-system       Active   5m57s
tigera-operator   Active   3m20s
[root@k8s-master01 ~]# kubectl get pod -n calico-system
NAME                                      READY   STATUS                  RESTARTS   AGE
calico-kube-controllers-7dfc6fb85-ktww2   0/1     Pending                 0          8m33s
calico-node-2t4dp                         0/1     Init:ImagePullBackOff   0          8m34s
calico-node-mmflx                         0/1     Init:ImagePullBackOff   0          8m34s
calico-node-r94tt                         0/1     Init:ImagePullBackOff   0          8m34s
calico-node-w7plh                         0/1     Init:ImagePullBackOff   0          7m36s
calico-typha-5fb57458cc-g89qp             0/1     ImagePullBackOff        0          8m34s
calico-typha-5fb57458cc-t5xcm             0/1     ImagePullBackOff        0          8m28s
[root@k8s-master01 ~]# kubectl describe pod calico-kube-controllers-7dfc6fb85-ktww2 -n calico-system
  Normal   BackOff    69s (x2 over 3m41s)    kubelet            Back-off pulling image "docker.io/calico/pod2daemon-flexvol:v3.23.0"
  Warning  Failed     69s (x2 over 3m41s)    kubelet            Error: ImagePullBackOff
           

可以看到所有Calico相關的Pod由于在國内環境下都無法正常下載下傳由docker.io提供的鏡像:

[root@k8s-master01 ~]# kubectl describe pod -n calico-system |grep 'Events' -A 10 |grep -Eo '"docker.io/calico/.*"' |sort |uniq
"docker.io/calico/cni:v3.23.0"
"docker.io/calico/kube-controllers:v3.23.0"
"docker.io/calico/node:v3.23.0"
"docker.io/calico/pod2daemon-flexvol:v3.23.0"
"docker.io/calico/typha:v3.23.0"
           

嘗試手動從quay.io下載下傳鏡像。quay.io是一個公共鏡像倉庫。

所有主機上操作:

[root@k8s-master01 ~]# docker pull quay.io/calico/cni:v3.23.0
[root@k8s-master01 ~]# docker pull quay.io/calico/kube-controllers:v3.23.0
[root@k8s-master01 ~]# docker pull quay.io/calico/node:v3.23.0
[root@k8s-master01 ~]# docker pull quay.io/calico/pod2daemon-flexvol:v3.23.0
[root@k8s-master01 ~]# docker pull quay.io/calico/typha:v3.23.0
           

這個時候發現Calico相關Pod都已正常運作了:

[root@k8s-master01 ~]# kubectl get pod -n calico-system
NAME                                      READY   STATUS    RESTARTS      AGE
calico-kube-controllers-7dfc6fb85-vbn6q   1/1     Running   0             64m
calico-node-29h89                         1/1     Running   0             64m
calico-node-9c54r                         1/1     Running   1 (10m ago)   64m
calico-node-ntzvt                         1/1     Running   0             64m
calico-node-s5bz9                         1/1     Running   0             64m
calico-typha-5dd57768f4-79clk             1/1     Running   1 (10m ago)   27m
calico-typha-5dd57768f4-dk9ph             1/1     Running   0             64m
           

3.Calico清單詳解-calico.yaml(使用calico.yaml清單檔案安裝Calico安裝方式必讀)

參考文檔:https://docs.projectcalico.org/archive/v3.14/getting-started/kubernetes/installation/config-options#other-configuration-options

calico.yaml清單檔案主要用于運作calico-node和calico-kube-controllers服務,其清單安裝以下Kubernetes資源:

  • 使用DaemonSet在每個主機上安裝calico/node容器;
  • 使用DaemonSet在每個主機上安裝Calico CNI二進制檔案和網絡配置;
  • 使用Deployment運作calico/kube-controller;
  • Secert/calico-etcd-secrets提供可選的Calico連接配接到etcd的TLS密鑰資訊;
  • ConfigMap/calico-config提供安裝Calico時的配置參數。

在calico.yaml清單檔案中,Calico預設的工作模式是IPIP。

在安裝Calico之前配置Calico通常有以下項:

3.1.配置PodIP範圍(PodCIDR)

要更改用于Pod的預設IP範圍,請修改calico.yaml清單檔案中"CALICO_IPV4POOL_CIDR"部分。

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: calico-node
  namespace: kube-system
  labels:
    k8s-app: calico-node
spec:
  template:
    spec:
      containers:
        - name: calico-node
          image: calico/node:v3.14.2
          env:
            ...
            # - name: CALICO_IPV4POOL_CIDR
            #    value: "192.168.0.0/16"
            ...
           

CALICO_IPV4POOL_CIDR

設定PodIP範圍。

此項用于設定安裝Calico時要建立的預設IPv4池,PodIP将從該範圍中選擇。

Calico安裝完成後修改此值将再無效。

預設情況下calico.yaml中"CALICO_IPV4POOL_CIDR"是注釋的,如果kube-controller-manager的"--cluster-cidr"不存在任何值的話,則通常取預設值"192.168.0.0/16,172.16.0.0/16,..,172.31.0.0/16"。

當使用kubeadm時,PodIP的範圍應該與kubeadm init的清單檔案中的"podSubnet"字段或者"--pod-network-cidr"選項填寫的值相同。

3.2.配置IPIP(預設)

預設情況下,清單啟用跨子網所使用的封裝協定是IPIP。

當叢集的節點都處于同一個2層網絡中時,我們期望修改Calico的工作模式為BGP或其他時,可以設定"CALICO_IPV4POOL_IPIP"的"value: Never"以禁用IPIP。預設IPIP是啟用的"value: Always"。

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: calico-node
  namespace: kube-system
  labels:
    k8s-app: calico-node
spec:
  template:
    spec:
      containers:
        - name: calico-node
          image: calico/node:v3.14.2
          env:
            ...
            # Enable IPIP
            - name: CALICO_IPV4POOL_IPIP
              value: "Always"
            ...
           

CALICO_IPV4POOL_IPIP

設定Calico覆寫網絡IPV4池所要使用的封裝協定為IPIP。

可設定的值:

Always,永久啟用。

CrossSubnet,當實體主機是跨子網通信的話才啟用,如果實體主機在同一2層網絡中則使用BGP動态路由通信方式。

Never,從不啟用,即禁用。

如果該項的值設定為"Never"以外的值,則不應設定"CALICO_IPV4POOL_VXLAN"。

Calico覆寫網絡支援IPIP、VXLAN兩種協定,僅能啟用其中一種。

VXLAN協定禁止啟用由"CALICO_IPV4POOL_VXLAN"項控制。

3.3.切換IPIP為VXLAN

預設情況下,Calico清單啟用IPIP封裝。如果你期望Calico使用VXLAN封裝模式,則需要在安裝時候做以下操作:

1、将"CALICO_IPV4POOL_IPIP "設定為"Never",将"CALICO_IPV4POOL_VXLAN"設定為"Always".

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: calico-node
  namespace: kube-system
  labels:
    k8s-app: calico-node
spec:
  template:
    spec:
      containers:
        - name: calico-node
          image: calico/node:v3.14.2
          env:
            ...
            # Enable IPIP
            - name: CALICO_IPV4POOL_IPIP
              value: "Never"
            - name: CALICO_IPV4POOL_VXLAN
              value: "Always"
            ...
           

2、如果你隻想叢集僅使用基于VXLAN協定的覆寫網絡模式,用不到BGP動态路由模式的話,即為了節省一點資源,可以選擇完全禁用Calico基于BGP的網絡:

  • 将"calico_backend: "bird""修改為"calico_backend: "vxlan"",這将禁用BIRD。
  • 從calico/node的readiness/liveness檢查中去掉"- -bird-ready"和"- -bird-live"。
livenessProbe:
            exec:
              command:
              - /bin/calico-node
              - -felix-live
             # - -bird-live
          readinessProbe:
            exec:
              command:
              - /bin/calico-node
              # - -bird-ready
              - -felix-ready
           

CALICO_IPV4POOL_VXLAN

設定Calico覆寫網絡IPV4池所要使用的封裝協定為VXLAN。

可設定的值:

  • Always,永久啟用。
  • CrossSubnet,當實體主機是跨子網通信的話才啟用,如果實體主機在同一2層網絡中則使用BGP動态路由通信方式。
  • Never,從不啟用,即禁用。

    如果該項的值設定為"Never"以外的值,則不應設定"CALICO_IPV4POOL_VXLAN"。

    Calico覆寫網絡支援IPIP、VXLAN兩種協定,僅能啟用其中一種。

    VXLAN協定禁止啟用由"CALICO_IPV4POOL_VXLAN"項控制。

3.4.其他配置項

在清單檔案的開始有ConfigMap描述Calico的配置内容,其重要的配置項解讀如下:

kind: ConfigMap
apiVersion: v1
metadata:
  name: calico-config
  namespace: kube-system
data:
  typha_service_name: "none"
  calico_backend: "bird"
  veth_mtu: "1440"
  cni_network_config: |-
    {
      "name": "k8s-pod-network",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "calico",
          "log_level": "info",
          "datastore_type": "kubernetes",
          "nodename": "__KUBERNETES_NODE_NAME__",
          "mtu": __CNI_MTU__,
          "ipam": {
              "type": "calico-ipam"
          },
          "policy": {
              "type": "k8s"
          },
          "kubernetes": {
              "kubeconfig": "__KUBECONFIG_FILEPATH__"
          }
        },
        {
          "type": "portmap",
          "snat": true,
          "capabilities": {"portMappings": true}
        },
        {
          "type": "bandwidth",
          "capabilities": {"bandwidth": true}
        }
      ]
    }
           

typha_service_name: "none"

Typha是Calico的一個擴充元件,用于Calico通過Typha直接與Etcd通信,而不是通過kube-apiserver。通常當K8S的規模超過50個節點的時候推薦啟用它,以降低kube-apiserver的負載。

支援值:

  • none,關閉Typha功能。
  • calico_typha,啟用Typha功能。

calico_backend: "bird"

設定Calico使用的後端機制。支援值:

bird,開啟BIRD功能,根據Calico-Node的配置來決定主機的網絡實作是采用BGP路由模式還是IPIP、VXLAN覆寫網絡模式。

vxlan,純VXLAN模式,僅能夠使用VXLAN協定的覆寫網絡模式。

veth_mtu: "0"

設定虛拟接口"calicoxxxxx"的MTU值,預設情況下MTU是自動檢測的,不需要顯示的設定此字段。

可以通過提供一個非零值來設定它。

MTU,Maximum Transmission Unit,最大傳輸單元,網絡裝置一次發送資料包大小,機關為Byte,MTU值約小則傳輸速率約高,此值應由系統設定的最合理的值,通常不需要我們手動設定,最大值為1500。

cni_network_config:

在每個節點上都要安裝的CNI網絡插件配置。保持預設就好。

4.Calico清單詳解-custom-resources.yaml(使用Tigera Calico Operator安裝Calico安裝方式必讀)

custom-resources.yaml清單檔案通過Tigera Calico Operator安裝Calico的自定義清單檔案。

在安裝Calico之前,我們可以通過修改該清單的内容自定義配置Calico。

參考文檔:https://projectcalico.docs.tigera.io/reference/installation/api

# This section includes base Calico installation configuration.
# For more information, see: https://projectcalico.docs.tigera.io/v3.23/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 10.244.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()

---

# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/v3.23/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
spec: {}
           

spec.calicoNetwork

配置Calico網絡。

spec.calicoNetwork.bgp

開啟或禁用BGP路由功能。支援值:Enabled, Disabled。

spec.calicoNetwork.ipPools

IPPool,為由節點篩選器指定節點上建立Pod配置設定的單個或多個位址池,以及要使用的Pod網絡的實作方法。

spec.calicoNetwork.ipPools.blockSize(int32)

塊大小,子網劃分技術,指從CIDR(如:10.244.0.0/16)裡面為每個節點拆分一個獨立的子網塊範圍大小(如:10.244.32.128/26)。預設IPV4=26,IPV6=122。二進制掩碼26轉換成十進制掩碼即=255.255.255.192,即每個節點的子網可以有64個IP位址,減去廣播位址和網絡位址,可為Pod配置設定的有效IP位址有62個。

spec.calicoNetwork.ipPools.cidr(string)

Pod網絡IP範圍。

spec.calicoNetwork.ipPools.encapsulation

設定Pod網絡要使用的封裝協定類型,支援:

  • IPIP,使用IPIP封裝協定。
  • VXLAN,使用VXLAN封裝協定。
  • IPIPCrossSubnet,當實體主機是跨子網的情況下才使用IPIP覆寫網絡通信方式,正常情況下使用BGP路由模式。
  • VXLANCrossSubnet,當實體主機是跨子網的情況下才使用VXLAN覆寫網絡通信方式,正常情況下使用BGP路由模式。
  • None,不使用IPIP或VXLAN封裝。

spec.calicoNetwork.ipPools.natOutgoing

NAT傳出,對傳出的流量啟用或禁用NAT功能。支援值:Enabled, Disabled。

spec.calicoNetwork.ipPools.nodeSelector(string)

節點選擇器,使用它選擇該IPPool池會影響那些節點的Pod。預設值為"all()",保持預設就好。

5.完全解除安裝Calico網絡插件

1、删除安裝清單中的所有資源對象

任一台Master上操作:

[root@k8s-master01 ~]# kubectl delete -f calico.yaml
           

2、删除tunl0虛拟網卡

如果使用了IPIP覆寫網絡模式,則Calico會在每台主機上建立一塊名叫tunl0的虛拟網卡裝置。

在所有主機上操作:

[root@k8s-master01 ~]# modprobe -r ipip
           

3、删除Calico相關CNI配置檔案

在所有主機上操作:

[root@k8s-master01 ~]# rm -rf /var/lib/cni/ && rm -rf /etc/cni/net.d/*
           

4、重新開機kubelet服務

在所有主機上操作:

[root@k8s-master01 ~]# systemctl restart kubelet
           

樂在分享!~~