k8s與各網路外掛整合

suliver發表於2021-09-09

通用說明

  • 如果多次換不同網路外掛實驗,每次實驗前先把/etc/cni/net.d/目錄下檔案清空

    rm -rf /etc/cni/net.d/*

flannel

# 建立flannel目錄下載相關檔案mkdir flannel && cd flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 修改配置# 此處的ip配置要與kubeadm的pod-network引數配置的一致
  net-conf.json: |
    {      "Network": "192.168.0.0/16",      "Backend": {        "Type": "vxlan"
      }
    }# 修改映象image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64# 如果Node有多個網路卡的話,參考flannel issues 39701,#  目前需要在kube-flannel.yml中使用--iface引數指定叢集主機內網網路卡的名稱,# 否則可能會出現dns無法解析。容器無法通訊的情況,需要將kube-flannel.yml下載到本地,# flanneld啟動引數加上--iface=<iface-name>
    containers:
      - name: kube-flannel
        image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=eth1# 啟動kubectl apply -f kube-flannel.yml# 檢視kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

calico

1.配置啟動etcd叢集

# 本次實驗使用與k8s一個etcd叢集# 生境環境建議使用單獨的一套叢集

2.配置啟動calico

# 建立calico目錄下載相關檔案mkdir calico && cd calico
wget   如果啟用了RBAC(預設k8s叢集啟用),配置RBACkubectl apply -f rbac.yaml# 修改calico.yaml檔案中名為calico-config的ConfigMap中的etcd_endpoints引數為自己的etcd叢集etcd_endpoints: ""# 修改映象為國內映象sed -i 's@image: quay.io/calico/@image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/calico-@g' calico.yaml# 啟動kubectl apply -f calico.yaml# 檢視kubectl get pods --namespace kube-systemkubectl get svc --namespace kube-system

3.參考文件

canal

# 建立flannel目錄下載相關檔案mkdir canal && cd canal
wget   修改配置# 此處的ip配置要與kubeadm的pod-network引數配置的一致
  net-conf.json: |
    {      "Network": "192.168.0.0/16",      "Backend": {        "Type": "vxlan"
      }
    }# 修改calico映象sed -i 's@image: quay.io/calico/@image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/calico-@g' canal.yaml# 修改flannel映象image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64# 如果Node有多個網路卡的話,參考flannel issues 39701,#  目前需要在kube-flannel.yml中使用--iface引數指定叢集主機內網網路卡的名稱,# 否則可能會出現dns無法解析。容器無法通訊的情況,需要將kube-flannel.yml下載到本地,# flanneld啟動引數加上--iface=<iface-name>
    containers:
      - name: kube-flannel
        image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
        command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth1" ]# 啟動kubectl apply -f rbac.yaml
kubectl apply -f canal.yaml# 檢視kubectl get pods --namespace kube-systemkubectl get svc --namespace kube-system

kube-router

# 本次實驗重新建立了叢集,使用之前測試其他網路外掛的叢集環境沒有成功# 可能是由於環境干擾,實驗時需要注意# 建立kube-router目錄下載相關檔案mkdir kube-router && cd kube-router
wget 
wget  以下兩種部署方式任選其一# 1. 只啟用 pod網路通訊,網路隔離策略 功能kubectl apply -f kubeadm-kuberouter.yaml# 2. 啟用 pod網路通訊,網路隔離策略,服務代理 所有功能# 刪除kube-proxy和其之前配置的服務代理kubectl apply -f kubeadm-kuberouter-all-features.yaml
kubectl -n kube-system delete ds kube-proxy# 在每個節點上執行docker run --privileged --net=host registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:v1.10.2 kube-proxy --cleanup# 檢視kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

romana

# 建立flannel目錄下載相關檔案mkdir romana && cd romana
wget  修改映象sed -i 's@gcr.io/@registry.cn-hangzhou.aliyuncs.com/@g' romana-kubeadm.yml
sed -i 's@quay.io/romana/@registry.cn-shanghai.aliyuncs.com/gcr-k8s/romana-@g' romana-kubeadm.yml# 啟動kubectl apply -f romana-kubeadm.yml# 檢視kubectl get pods --namespace kube-systemkubectl get svc --namespace kube-system

CNI-Genie

# CNI-Genie是華為開源的網路元件,可以使k8s同時部署多個網路外掛# 在k8s叢集中安裝calico元件# 在k8s叢集中安裝flannel元件# 在k8s叢集中安裝Genie元件mkdir CNI-Genie && cd CNI-Genie
wget  
sed -i 's@image: quay.io/cnigenie/v1.5:latest@image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/cnigenie-v1.5:latest@g' genie.yaml
kubectl apply -f genie.yaml# 檢視kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system# 測試cat >nginx-calico.yml<<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-calico
  labels:
    app: web
  annotations:
    cni: "calico"spec:
  containers:
    - name: nginx
      image: nginx:alpine
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
EOF
cat >nginx-flannel.yml<<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-flannel
  labels:
    app: web
  annotations:
    cni: "flannel"spec:
  containers:
    - name: nginx
      image: nginx:alpine
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
EOF
kubectl apply -f nginx-calico.yml
kubectl apply -f nginx-flannel.yml# 檢視kubectl get pods -o wide# 測試網路通訊kubectl exec nginx-calico -i -t -- ping -c4 1.1.1.1
kubectl exec nginx-flannel -i -t -- ping -c4 1.1.1.1# 由於先啟動的flannel,然後k8s建立了coredns,所以使用flannel cni的能正常使用dns# 使用calico cni無法使用正常dns# 測試dnskubectl exec nginx-calico -i -t -- ping -c4 
kubectl exec nginx-flannel -i -t -- ping -c4 

總結

kube-router效能損失最小,時延最小,其他網路外掛效能差距不大。除了flannel沒有網路隔離策略,其他均支援網路隔離策略。CNI-Genie是一個可以讓k8s使用多個cni網路外掛的元件,暫時不支援隔離策略。

理論結果: kube-router > calico > canal = flannel = romana



作者:CountingStars_
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2370/viewspace-2820098/,如需轉載,請註明出處,否則將追究法律責任。

相關文章