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 datastore
。github
<!--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模式
- IPtables(默認支持)
- ipvs 經過這裏 Enabling IPVS in Kubernetes 查看更多細節
清楚舊的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 有如下三種使用場景: 數據庫
- 安裝Calico做爲策略(policy)和網絡(networking)(推薦用法)
- 安裝Calico做爲策略(policy)和flannel做爲網絡(networking)
- 安裝Calico做爲策略(policy)(進階用法)
注意: 策略是指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
$ 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