k8s集羣安裝calico 3.16插件

1、準備工做

Node 環境

  • Linux kernel 3.10 以上
    • CentOS 7
    • Ubuntu 16.04
    • Debian 8
  • 修改NetworkManager服務的配置以容許Calico管理網卡

​ Calico 必須可以在宿主機上管理 cali* 網卡。當 IPIP 被啓用時(默認),Calico 還須要可以管理 tunl* 網卡。node

注意: 許多Linux發行版都安裝了 NetworkManager。默認狀況下 NetworkManager 不容許 Calico 管理網卡。若是你的節點有 NetworkManager,在安裝 Calico 以前,你須要按照這個步驟去防止 NetworkManager 控制 Calico 網卡git

key/value存儲

Calico v3.16 全部組件須要把數據存儲到 kv數據庫,在kubernetes平臺,你能夠配置calico訪問etcdv3 集羣 或者經過kubernetes api datastoregithub

<!--more-->golang

網絡組件和端口分佈

保證主機和防火牆能容許如下端口通訊正則表達式

Configuration Host(s) Connection type Port/protocol
Calico networking (BGP) All Bidirectional TCP 179
Calico networking with IP-in-IP enabled (default) All Bidirectional IP-in-IP, often represented by its protocol number 4
Calico networking with VXLAN enabled All Bidirectional UDP 4789
Calico networking with Typha enabled Typha agent hosts Incoming TCP 5473 (default)
flannel networking (VXLAN) All Bidirectional UDP 4789
All kube-apiserver host Incoming Often TCP 443 or 6443*
etcd datastore etcd hosts Incoming Officially TCP 2379 but can vary

kubernetes 版本要求

  • 1.16
  • 1.17
  • 1.18

開啓CNI plug-in

kubelet 配置添加--network-plugin=cni參數docker

支持的kube-proxy模式

清楚舊的cni 插件配置

若是集羣以前有flannel,執行如下命令清除乾淨shell

ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

運行Calico的方式

Calico 有如下三種使用場景: 數據庫

注意: 策略是指Kubernetes的網絡策略(network policy)api

安裝calico的3種環境

Calico的數據存儲(datastore)有2種方式,一個是使用 Kubernetes API;一個是使用etcd。 在使用不一樣數據存儲和集羣規模不一樣的狀況下,安裝配置的過程會有所不一樣網絡

本文檔基於使用k8s自帶etcd集羣

2、安裝calico

2.1 下載yaml

curl https://docs.projectcalico.org/manifests/calico-etcd.yaml -o calico.yaml

2.2 修改etcd集羣地址

kind: ConfigMap
apiVersion: v1
metadata:
  name: calico-config
  namespace: kube-system
data:
  # 這裏的etcd地址是k8s 使用的etcd集羣.
  etcd_endpoints: "http://172.16.0.12:2379,http://172.16.0.16:2379,http://172.16.0.44:2379"

2.3 修改集羣網段

默認是192.168.0.0/16網段,注意不要和k8s集羣網絡衝突。

注意,這個網段應該與kubeapi定義--service-cluster-ip-range的網段同樣

# The default IPv4 pool to create on startup if none exists. Pod IPs will be
            # chosen from this range. Changing this value after installation will have
            # no effect. This should fall within `--cluster-cidr`.
            - name: CALICO_IPV4POOL_CIDR
              value: "10.96.0.0/12"

2.4 修改ip 發現方式

當 Calico 被用做路由,每一個 node 必須配置一個 IPv4 地址 和/或者 一個 IPv6 地址,用做 node 間的路由。爲了排除節點特定的 IP 地址的配置,calico/node 這個容器能夠被配置爲自動檢測 IP 地址配置。在許多系統中,一個主機上或許會有多個物理網卡,或者可能有多個 IP 地址配置到一個物理網卡。在這些狀況下,自動檢測模式下會有多個地址可選,因此難以確認正確的地址。

官方文檔

爲了改善選擇正確地址的過程,Calico 提供了 IP 自動檢測的方法,這些方法基於合適的條件給這個選擇定義一些限制。

  • first-found
    first-found 方法列舉全部網卡 IP 地址而後返回第一個有效網卡上的第一個有效的 IP 地址(基於IP版本和地址的類型)。確切已知的 "local" 網卡會被忽略,例如 docker 網橋。網卡和 IP 地址的順序根據不一樣系統會有差別。
    這個是默認的檢測方法。然而,因爲這個方法只會做很是簡單的假設,強烈推薦要麼給節點配置一個特定的 IP 地址(應該是經過給 kubelet 指定參數),要麼使用另一種檢測方法。
    e.g.


    `IP_AUTODETECTION_METHOD=first-found IP6_AUTODETECTION_METHOD=first-found`
  • can-reach=DESTINATION
    can-reach 方法使用你的本地路由來決定使用哪一個 IP 地址來到達提供的目的地。可使用 IP 地址或者域名。
    使用 IP 地址的例子:

    IP_AUTODETECTION_METHOD=can-reach=8.8.8.8 IP6_AUTODETECTION_METHOD=can-reach=2001:4860:4860::8888

    使用域名的例子:

    IP_AUTODETECTION_METHOD=can-reach=www.google.com IP6_AUTODETECTION_METHOD=can-reach=www.google.com
  • interface=INTERFACE-REGEX
    interface 方法使用提供的網卡正則表達式(golang語法)去列舉匹配到的網卡而後返回在第一個匹配到的網卡上的第一個 IP 地址。網卡和 IP 地址的順序根據不一樣系統會有差別。
    網卡 eth0, eth1, eth2 etc. 的有效 IP 地址的例子:
    IP_AUTODETECTION_METHOD=interface=eth.* IP6_AUTODETECTION_METHOD=interface=eth.*


  • cidr=CIDR

    指定cidr段做爲地址

    - name: IP_AUTODETECTION_METHOD
                value: "cidr=172.16.0.0/24"

2.5 配置kube-api 環境變量

添加環境變量,覆蓋kubernetes svc, 保證node安裝成功

- name: calico-node
          image: harbor.foxchan.com/calico/node:v3.16.1
          #envFrom:
          #- configMapRef:
          #    # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.
          #    name: kubernetes-services-endpoint
          #    optional: true
          env:
            # apiserver emargongsi
            - name: KUBERNETES_SERVICE_HOST
              value: "172.16.0.20"
            - name: KUBERNETES_SERVICE_PORT_HTTPS
              value: "8443"
            - name: KUBERNETES_SERVICE_PORT
              value: "8443"

三 、安裝配置calicoctl

3.1 下載binary 文件

curl -O -L  https://github.com/projectcalico/calicoctl/releases/download/v3.16.1/calicoctl

3.2 賦予權限

chmod +x calicoctl

3.3 使用環境變量訪問

ETCD_ENDPOINTS=http://etcd:2379 calicoctl get bgppeers

4、 配置calico cross-subnet

ipip雖然實現了 calico 跨網段通訊,但對於相同網段間的主機通訊來講,IP-in-IP 就有點多餘了,由於兩者宿主機處於同一廣播域,2層互通,直接走主機路由便可。此時須要藉助calico cross-subnet

IPIP配置文檔

$ calicoctl apply -f - << EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  blockSize: 26
  cidr: 10.96.0.0/12
  ipipMode: CrossSubnet
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never
EOF

參考文檔

calico官方地址:

https://docs.projectcalico.org/getting-started

自定義安裝說明頁面

https://docs.projectcalico.org/getting-started/kubernetes/installation/config-options

相關文章
相關標籤/搜索