iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0

可愛鯨魚

呼叫鯨魚一號,呼叫鯨魚一號,聽到請回答,over

圖片來源:Docker (@Docker) / Twitter

Kubernetes 網路模型

到目前為止的安裝每個 node 都會顯示 NotReady

kubectl get nodes

output...

NAME    STATUS     ROLES           AGE     VERSION
whale1  NotReady   control-plane   3d16h   v1.25.1
whale2  NotReady   <none>          3d10h   v1.25.1
whale3  NotReady   <none>          3d1h    v1.25.1

如果詳細看 node

kubectl describe node whale1

Conditions Ready 會顯示原因,需要安裝 network plugin

container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

因為網路架構太多樣,Kubernetes 使用了 CNI (Container Network Interface) 讓使用者自己挑選適合的 Plugin

Kubernetes 對 Plugin 提出兩項要求:

  1. Pod 可以在沒有 NAT (網絡地址轉譯) 的情況下與任何 node 上的所有 Pod 通訊 (Pod-to-Pod)
  2. node 上的 agent(e.g. system daemon, kubelet)可以與該 node 上的所有 Pod 通訊 (Node-into-Pod)

CNI

底下列出兩個常見的 CNI plugin

Flannel

Flannel 算是入門的 CNI plugin

對於 Kubernetes 的要求,Flannel 透過 layer 3 實現

  • 在 cluster 內建立一個 IPv4 overlay network
  • 分配每個 node 一個 subnet (預設 /24),提供每個 Pod 一個 unique ip
  • 對於不同 node 使用 VXLAN 串接

flannel network

圖片來源:Kubernetes Journey — Up and running out of the cloud — flannel | by Marcos Vallim | ITNEXT

Calico

Calico 較為彈性,提供更多網路策略功能,能與 Kubernetes Network Policy 整合使用

對於 Kubernetes 的要求,Flannel 透過 layer 3 實現

  • 各個 node 配置自己的 ip
  • 不同 node 間使用 GBP 協定同步 route
  • 使用 BGP 協定在不同主機間不必多封裝 route 位置

calico network

圖片來源:Flannel vs Calico : A battle of L2 vs L3 based networking | by shashank Jain | Medium


安裝方式

兩種都裝過... 就簡單的列出安裝方式~

先回頭看看之前 kubeadm init 的參數 pod-network-cidr

kubectl cluster-info dump | grep -m 1 cluster-cidr

output... 我的設定為 192.168.0.0/16

  "--cluster-cidr=192.168.0.0/16",

如果設定的跟你選用的 plugin 預設的不同的話需要自行更改


Flannel

wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
  • Flannel 預設的 pod-network-cidr10.244.0.0/16,如果不同須改 kube-flannel.yml

  • 找到 ConfigMap(kube-flannel-cfg) > data > net-conf.json

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: kube-flannel-cfg
      ...
    data:
      ...
      net-conf.json: |
        {
          "Network": "192.168.0.0/16",
          "Backend": {
            "Type": "vxlan"
          }
        }
    

改完後部署

kubectl apply -f kube-flannel.yml

Calico

wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
  • Calico 預設的 pod-network-cidr192.168.0.0/16,如果不同也無需做更改,Calico 會自動偵測~ /images/emoticon/emoticon34.gif
kubectl apply -f calico.yaml

使用 watch 等待安裝完成,會顯示 Pod RUNNING,Calico 會裝比較久~

watch kubectl get pods -n calico-system

註記:解除安裝 Flannel

要解除安裝要清除的相關設定:

kubectl delete -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
sudo ip link del cni0
sudo ip link del flannel.1
sudo rm /etc/cni/net.d/10-flannel.conflist

註記:解除安裝 Calico

我的 Calico 是使用 iptables 紀錄,對於不太懂指令的我要清乾淨還真的有點難...

kubectl delete -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
sudo rm /etc/cni/net.d/10-calico.conflist /etc/cni/net.d/calico-kubeconfig

sudo reboot

檢查 iptables

sudo iptables -S | grep -oP '(?<!^:)cali-[^ ]+' | wc -l

若未清除 iptables 繼續...

kubectl label nodes --all projectcalico.org/ds-ready-

等 Calico Pod 都暫停

使用官方提供的移除腳本

curl https://raw.githubusercontent.com/projectcalico/calico/master/calico/hack/remove-calico-policy/remove-calico-policy.sh -o remove-calico-policy.sh
kubectl create configmap remove-calico-policy-config -n=kube-system --from-file=./remove-calico-policy.sh
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/master/calico/hack/remove-calico-policy/iptables-remover-ds.yaml
kubectl delete -f https://raw.githubusercontent.com/projectcalico/calico/master/calico/hack/remove-calico-policy/iptables-remover-ds.yaml
kubectl delete configmap remove-calico-policy-config -n=kube-system

calico/calico/hack/remove-calico-policy at master · projectcalico/calico

若還不行...

sudo iptables-save | grep -i cali | sudo iptables -F
sudo iptables-save | grep -i cali | sudo iptables -X

sudo reboot

Ref


關於網路的部分還是新手,只有在 cisco/juniper 模擬器裡配過,連 BGP 的概念也是前幾個月才學到
如果有錯誤的地方歡迎指正~ /images/emoticon/emoticon13.gif


上一篇
Day 7 — 回頭!快回頭阿!我還沒上船阿~:重設 kubeadm init 參數、重置 Kubernetes、升級 Kubernetes
下一篇
Day 9 — 遠端操控面板:vscode 實用延伸模組 (一)
系列文
前端轉生~到了實驗室就要養幾隻可愛鯨魚:自架 Kubernetes 迷航日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言