從零開始實現基於calico網絡的k8s集羣部署

以三個節點爲例:
master 10.0.3.241
node01 10.0.3.242
node02 10.0.3.243

先決條件:修改三個節點的hosts

vi /etc/hosts
------
10.0.3.104 test.com # 私有鏡像倉庫的地址
10.0.3.241 master
10.0.3.242 node01
10.0.3.243 node02

一、K8s的安裝

安裝k8s,步驟如下;
(1)etcd/docker安裝,忽略參考地址博客中的fannel部分 參考地址
(2)master組件安裝參考地址
(3)node組件安裝參考地址
Note:記得修改kubelet.config文件,參考地址
當實現了node加載後,即如下圖,可繼續完成對calico的安裝。
在這裏插入圖片描述
小坑彙總:kubelet未成功啓動;kubectl get csr得不到反饋,可能是token失效,可重新生成;別的坑,可參考我的博客,k8s筆記系列,基本能解鎖所有的安裝問題。。。。

二、calico的安裝

calico組件:
整合ks8/calico一共有三個組件:
1.每個節點運行一個calico/node容器;包含了calico路由必須的bgp客戶端
2.calico-cni網絡插件的二進制文件(這是兩個二進制可執行文件和配置文件的組合);直接與kubelet集成,運行在每節點從而發現被創建的容器,添加容器到calico網絡
3.如果想要使用NetworkPolicy,需要安裝Calico policy controller;實現了NetworkPolicy.

calico版本以3.2.6版本爲基礎,原則上現在的安裝不能低於3.1,否則會出現各種問題,已踩過相關的坑。
當出現Kubernetes Calico node ‘XXXXXXXXXXX’ already using IPv4 Address XXXXXXXXX, CrashLoopBackOff錯誤時,可能是calico的版本過低,在此修改爲3.1.1以上版本,以上爲3.2.6版本。解決方案參考地址

下載calicoctl工具

以下操作在三個節點上都需要實現

cd /usr/local/bin/
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.2.6/calicoctl
chmod +x calicoctl
scp calicoctl [email protected](243):/usr/local/bin/

# 下載calico、calico-ipam
wget -N -P /opt/cni/bin/ https://github.com/projectcalico/calico-cni/releases/download/v3.1.6/calico
wget -N -P /opt/cni/bin/ https://github.com/projectcalico/calico-cni/releases/download/v3.1.6/calico-ipam
chmod +x /opt/cni/bin/calico /opt/cni/bin/calico-ipam
下載安裝文件

calico 安裝官方指南:https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/calico

# 下載rbac.yaml,不用修改可直接運行
wget https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/rbac.yaml
kubectl apply -f rbac.yaml
wget https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/calico.yaml
在node上拉取鏡像,並tag爲calico.yaml文件所需鏡像。
# 拉取所需的docker鏡像,
# quay.io/calico/ctl:v3.2.6
docker pull docker.io/calico/ctl:v3.2.6
docker tag docker.io/calico/ctl:v3.2.6 quay.io/calico/ctl:v3.2.6
# quay.io/calico/cni:v3.2.6
docker pull docker.io/calico/cni:v3.2.6
docker tag docker.io/calico/cni:v3.2.6 quay.io/calico/cni:v3.2.6
# quay.io/calico/kube-controllers:v3.2.6
docker pull docker.io/calico/kube-controllers:v3.2.6
docker tag docker.io/calico/kube-controllers:v3.2.6 quay.io/calico/kube-controllers:v3.2.6
# quay.io/calico/node:v3.2.6
docker pull docker.io/calico/node:v3.2.6
docker tag  docker.io/calico/node:v3.2.6  quay.io/calico/node:v3.2.6
在calico.yaml中修改
# calico_backend:Calico的後端,默認爲bird。
# cni_network_config:符合CNI規範的網絡配置,其中type=calico表示,Kubelet從 CNI_PATH(默認爲/opt/cni/bin)找名爲calico的可執行文件,用於容器IP地址的分配。
  #(1)修改etcd_endpoints:Configure this with the location of your etcd cluster。
  # Calico使用etcd來保存網絡拓撲和狀態,該參數指定etcd的地址,可以使用K8S Master所用的etcd,也可以另外搭建
  etcd_endpoints: "https://10.0.3.241:2379,https://10.0.3.242:2379,https://10.0.3.243:2379"

  # If you're using TLS enabled etcd uncomment the following.
  #(2) You must also populate the Secret below with these files.
  etcd_ca: "/calico-secrets/etcd-ca"
  etcd_cert: "/calico-secrets/etcd-cert"
  etcd_key: "/calico-secrets/etcd-key"
  # Configure the Calico backend to use.Calico的後端,默認爲bird。
  calico_backend: "bird"
  # Configure the MTU to use
  veth_mtu: "1440" 
#(3)etcd如果配置了TLS安全認證,則還需要指定相應的ca、cert、key等文件,即修改TLS認證祕鑰(此步驟與(4/5)兩種方式二選一)
data:  
  etcd-ca: (cat /opt/etcd/ssl/ca.pem | base64 | tr -d '\n') #將輸出結果填寫在這裏
  etcd-key: (cat /opt/etcd/ssl/server-key.pem | base64 | tr -d '\n') #將輸出結果填寫在這裏
  etcd-cert: (cat opt/etcd/ssl/server.pem  | base64 | tr -d '\n') #將輸出結果填寫在這裏
# (4)部署calico-node設置hostpath的方式來掛載TLS文件
        - name: etcd-certs
        # 添加hostPath
          hostPath:
            path: /etc/calico/calicoTLS
          # 該文件可在/calico-secrets.bak/文件中搜索到
          # 註釋掉一下secret
          #secret:
            #secretName: calico-etcd-secrets
            #defaultMode: 0400
        
# (5)部署calico-kube-controllers設置hostpath掛載TLS文件
        - name: etcd-certs
        # 添加hostPath
          hostPath:
            path: v
          # 註釋掉一下secret
          #secret:
            #secretName: calico-etcd-secrets
            #defaultMode: 0400

# (6)必須要修改,根據實際需求,與集羣內部ip range保持一致
      - name: CALICO_IPV4POOL_CIDR
        value: "10.0.0.0/24"

在這裏插入圖片描述

注:
a) calico.yaml修改

(6)的修改,可參見官方文檔解釋ipPool設置標準,這裏將一部分重點進行轉譯。
例如,在Kubernetes中,以下所有三個參數必須等於或包含Calico IP池CIDR(爲保證萬無一失,最好設置等於):

  • kube-apiserver: --pod-network-cidr (vi /opt/kubernetes/cfg/kube-apiserver,我的是–service-cluster-ip-range=10.0.0.0/24 )
  • kube-proxy: --cluster-cidr (vi /opt/kubernetes/cfg/kube-proxy,我的是–cluster-cidr=10.0.0.0/24)
  • kube-controller-manager: --cluster-cidr (vi /opt/kubernetes/cfg/kube-controller-manager,我的是–service-cluster-ip-range=10.0.0.0/24 )
  • “- name: CALICO_IPV4POOL_CIDR”。要求,cluster-cidr儘量大一些,才能使用到儘可能多的wordload。
  • 部署建議,全部設爲172.16.0.0/16,基本滿足現有需求。

(7)master節點配置時,除相關配置文件不可少之外,要關注在master節點,calico/node是否跑起來

docker pull calico/node:v3.2.6
calicoctl node run --node-image=calico/node:v3.2.6
a) 如何管理ippool
# 獲取當前的ippool
calicoctl get ippool -o wide

# 查看當前ippool獲取的pod ip情況
calicoctl get wep --all-namespaces

# 備份當前的ippool
calicoctl get ippool -o yaml > pool_bak.yaml

# 添加新的ippool,並應用
calicoctl apply -f new-pool.yaml
#---------------------
calicoctl create -f -<<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: new-pool
spec:
# 修改cidr,當前的ippool範圍設置
  cidr: 10.0.0.0/24
  #  ipipMode模式選擇always、cross-subnet
  ipipMode: Always
  natOutgoing: true
  # disabled: false 默認是false,如何爲true,則表示關閉改ippool
EOF
#----------------------

# 修改生成的pool_bak.yaml,將待刪除的ippool添加disabled: false,進行關閉
# 並進行apply應用
calicoctl apply -f pool.yaml

# 刪除ippool
calicoctl delete pool default-ipv4-ippool
# 或者刪除ip
calicoctl delete pool 10.1.1.0/24

相關配置解釋:

在calico.yaml文件中,配置DaemonSet的calico-node服務。
該POD中主要包括如下兩個容器:

  • calico-node:calico服務程序,用於設置Pod的網絡資源,保證pod的網絡與各Node互聯互通,它還需要以HostNetwork模式運行,直接使用宿主機網絡。
  • install-cni:在各Node上安裝CNI二進制文件到/opt/cni/bin目錄下,並安裝相應的網絡配置文件到/etc/cni/net.d目錄下。

calico-node服務的主要參數:

  • CALICO_IPV4POOL_CIDR: Calico IPAM的IP地址池,Pod的IP地址將從該池中進行分配。

  • CALICO_IPV4POOL_IPIP:是否啓用IPIP模式,啓用IPIP模式時,Calico將在node上創建一個tunl0的虛擬隧道。

  • FELIX_LOGSEVERITYSCREEN: 日誌級別。

  • FELIX_IPV6SUPPORT : 是否啓用IPV6。

  • IP Pool可以使用兩種模式:BGP或IPIP。
    (1)使用IPIP模式時,設置 CALICO_IPV4POOL_IPIP=“always”,不使用IPIP模式時,設置爲"off",此時將使用BGP模式。

      BGP模式下,不會在服務器上創建tun10
      路由轉發功能是通過服務器的物理機網卡作爲路由器對流量進行轉發的
      路由即純bgp模式,理論上ipip模式的網絡傳輸性能低於純bgp模式
    

(2)IPIP是一種將各Node的路由之間做一個tunnel,再把兩個網絡連接起來的模式,啓用IPIP模式時,Calico將在各Node上創建一個名爲"tunl0"的虛擬網絡接口。

一種妥協的overlay機制,在宿主機創建1個”tunl0”虛擬端口
通過tun10作爲路由轉發
分爲兩種模式:
	ipip always模式(純ipip模式)
	ipip cross-subnet模式(ipip-bgp混合模式):
		指“同子網內路由採用bgp,跨子網路由採用ipip”
  • 部署calico-node設置hostpath的方式來掛載TLS文件
修改kubelet、kube-proxy啓動文件

修改kubelet文件

# vi /opt/kubernetes/cfg/kubelet

KUBELET_OPTS="--logtostderr=true \
--v=4 \
--address=10.0.3.242 \
--hostname-override=10.0.3.242 \
# 添加以下四項
# ---------------
--allow-privileged=true \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/cni/bin \
# ---------------
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--experimental-bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet.config \
--cert-dir=/opt/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"

修改kube-proxy文件

vi /opt/kubernetes/cfg/kube-proxy

KUBE_PROXY_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=10.0.3.242 \
--cluster-cidr=10.0.0.0/24 \
--proxy-mode=iptables \ # 修改ipvs爲iptables
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"

重新啓動kubelet、kube-proxy

systemctl restart kubelet
systemctl restart kube-proxy
配置calicoctl啓動

(1)calico環境文件

# vi /etc/calico/calico.env
ETCD_ENDPOINTS=https://10.0.3.241:2379,https://10.0.3.242:2379,https://10.0.3.243:2379  #每個節點上修改此處
ETCD_CA_FILE=""
ETCD_CERT_FILE=""
ETCD_KEY_FILE=""
CALICO_NODENAME=""
CALICO_NO_DEFAULT_POOLS=""
#CALICO_IP=""
CALICO_IP=""
CALICO_IP6=""
CALICO_AS=""
CALICO_LIBNETWORK_ENABLED=true
CALICO_NETWORKING_BACKEND=bird

(2)calicoctl配置文件,每個節點上都相同

# vi /etc/calico/calicoctl.cfg
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "etcdv3"
  etcdEndpoints: "https://10.0.3.241:2379,https://10.0.3.242:2379,https://10.0.3.243:2379"
  etcdKeyFile: /opt/etcd/ssl/server-key.pem
  etcdCertFile: /opt/etcd/ssl/server.pem
  etcdCACertFile: /opt/etcd/ssl/ca.pem
systemctl start calico-node
systemctl enable calico-node

在各個node節點上查看calico的運行情況,如在node01:242上

calicoctl node status

在這裏插入圖片描述
在master上查看可互通的節點

calicoctl get nodes

在這裏插入圖片描述

參考:
(1)https://blog.51cto.com/newfly/2062210
(2)https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/calico
(3)當出現Kubernetes Calico node ‘XXXXXXXXXXX’ already using IPv4 Address XXXXXXXXX, CrashLoopBackOff錯誤時,可能是calico的版本過低,在此修改爲3.1.1以上版本,以上爲3.2.6版本。
參考 https://stackoverflow.com/questions/52390481/kubernetes-calico-node-xxxxxxxxxxx-already-using-ipv4-address-xxxxxxxxx-crash

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章