概述
容器網絡是容器選擇連接到其他容器、主機和外部網絡的機制。容器的 runtime 提供了各種網絡模式,每種模式都會產生不同的體驗。例如,Docker 默認情況下可以爲容器配置以下網絡:
- none: 將容器添加到一個容器專門的網絡堆棧中,沒有對外連接。
- host: 將容器添加到主機的網絡堆棧中,沒有隔離。
- default bridge: 默認網絡模式。每個容器可以通過 IP 地址相互連接。
- 自定義網橋: 用戶定義的網橋,具有更多的靈活性、隔離性和其他便利功能。
什麼是 CNI
CNI(Container Network Interface) 是一個標準的,通用的接口。在容器平臺,Docker,Kubernetes,Mesos 容器網絡解決方案 flannel,calico,weave。只要提供一個標準的接口,就能爲同樣滿足該協議的所有容器平臺提供網絡功能,而 CNI 正是這樣的一個標準接口協議。
Kubernetes 中的 CNI 插件
CNI 的初衷是創建一個框架,用於在配置或銷燬容器時動態配置適當的網絡配置和資源。插件負責爲接口配置和管理 IP 地址,並且通常提供與 IP 管理、每個容器的 IP 分配、以及多主機連接相關的功能。容器運行時會調用網絡插件,從而在容器啓動時分配 IP 地址並配置網絡,並在刪除容器時再次調用它以清理這些資源。
運行時或協調器決定了容器應該加入哪個網絡以及它需要調用哪個插件。然後,插件會將接口添加到容器網絡命名空間中,作爲一個 veth 對的一側。接着,它會在主機上進行更改,包括將 veth 的其他部分連接到網橋。再之後,它會通過調用單獨的 IPAM(IP地址管理)插件來分配 IP 地址並設置路由。
在 Kubernetes 中,kubelet 可以在適當的時間調用它找到的插件,爲通過 kubelet 啓動的 pod進行自動的網絡配置。
Kubernetes 中可選的 CNI 插件如下:
- Flannel
- Calico
- Canal
- Weave
什麼是 Calico
Calico 爲容器和虛擬機提供了安全的網絡連接解決方案,並經過了大規模生產驗證(在公有云和跨數千個集羣節點中),可與 Kubernetes,OpenShift,Docker,Mesos,DC / OS 和 OpenStack 集成。
Calico 還提供網絡安全規則的動態實施。使用 Calico 的簡單策略語言,您可以實現對容器,虛擬機工作負載和裸機主機端點之間通信的細粒度控制。
下載 Calico 配置文件並修改
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
vi calico.yaml
修改第 611 行,將 192.168.0.0/16
修改爲 10.244.0.0/16
,可以通過如下命令快速查找
- 顯示行號:
:set number
- 查找字符:
/要查找的字符
,輸入小寫n
下一個匹配項,輸入大寫N
上一個匹配項 /CALICO_IPV4POOL_CIDR
安裝網絡插件 Calico
注意: 截止到文章發表日期 2019 年 07 月 20 日,Calico 官方版本爲 3.8
參考官方文檔安裝:https://docs.projectcalico.org/v3.8/getting-started/kubernetes/
kubectl apply -f calico.yaml
# 輸出如下
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.extensions/calico-node created
serviceaccount/calico-node created
deployment.extensions/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
驗證安裝是否成功
- 查看 Calico 網絡插件處於 Running 狀態即表示安裝成功
watch kubectl get pods --all-namespaces
# 輸出如下
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-658558ddf8-9zzjg 1/1 Running 0 90s
kube-system calico-node-9cr5f 1/1 Running 0 91s
kube-system calico-node-n99mz 1/1 Running 0 91s
kube-system calico-node-nl67v 1/1 Running 0 91s
kube-system coredns-bccdc95cf-9s4bm 1/1 Running 0 56m
kube-system coredns-bccdc95cf-s8ggd 1/1 Running 0 56m
kube-system etcd-kubernetes-master 1/1 Running 0 55m
kube-system kube-apiserver-kubernetes-master 1/1 Running 0 55m
kube-system kube-controller-manager-kubernetes-master 1/1 Running 0 55m
kube-system kube-proxy-8s87d 1/1 Running 0 36m
kube-system kube-proxy-cbnlb 1/1 Running 0 36m
kube-system kube-proxy-vwhxj 1/1 Running 0 56m
kube-system kube-scheduler-kubernetes-master 1/1 Running 0 55m
- 查看節點狀態處於 Ready 即表示安裝成功
kubectl get node
# 輸出如下
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready master 57m v1.15.0
kubernetes-node-01 Ready <none> 37m v1.15.0
kubernetes-node-02 Ready <none> 36m v1.15.0
故障排查
kube-system calico-node-vcx9h 0/1 Init:ImagePullBackOff 1 25m
進入對應機器手動下載鏡像
docker pull calico/node:v3.8.6
docker pull calico/pod2daemon-flexvol:v3.8.6
docker pull calico/cni:v3.8.6
docker pull calico/kube-controllers:v3.8.6