2 本地部署安裝Calico網絡
(1) 官方文檔: https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
(2) 我這里集群使用的calico版本為v3.20.1。
(3) Kubernetes API datastore是Kubernetes工作負載推薦的數據存儲。不建議將etcd數據庫用於新安裝。
但是,如果您將Calico 作為 OpenStack 和 Kubernetes 的網絡插件運行,則它是一個選項。
在172.16.1.81(k8s-master1)節點上操作
2.1 文件配置
1 方式一: 使用Kubernetes API datastore安裝Calico,50個或更少節點
(1) 下載
# wget https://docs.projectcalico.org/manifests/calico.yaml
(2) 修改配置文件
# vim calico.yaml
1) 修改pod CIDR,與集群配置保持一致
2) 配置calico選擇某網卡進行通信
- name: IP_AUTODETECTION_METHOD
value: "interface=eth1"
注: eth1為指定的通信網卡
3) 備注: CALICO_IPV4POOL_IPIP
Always # 為IPIP模式(默認)
Never # 為BGP模式
(3) 初始化calico網絡
# kubectl apply -f calico.yaml
2 方式二: 使用Kubernetes API datastore安裝Calico,超過50個節點
(1) 下載
# wget https://docs.projectcalico.org/manifests/calico-typha.yaml
(2) 修改配置文件
# vim calico-typha.yaml
1) 修改pod CIDR,與集群配置保持一致
2) 配置calico選擇某網卡進行通信
- name: IP_AUTODETECTION_METHOD
value: "interface=eth1"
注: eth1為指定的通信網卡
3) 修改Deployment命名為calico-typha的副本數
我們建議每200個節點至少有一個副本,並且不超過20個副本。在生產中,我們建議至少3個副本,以減少
滾動升級和故障的影響。副本數應始終小於節點數,否則滾動升級將停滯。
4) 備注: CALICO_IPV4POOL_IPIP
Always # 為IPIP模式(默認)
Never # 為BGP模式
(3) 初始化calico網絡
# kubectl apply -f calico-typha.yaml
3 方式三: 使用etcd datastore安裝Calico
Calico使用etcd來保存網絡拓撲和狀態
(1) 下載
# wget https://docs.projectcalico.org/manifests/calico-etcd.yaml
(2) 修改配置文件
# vim calico-etcd.yaml
1) 填入etcd證書
# cat /usr/local/etcd/ssl/etcd-key.pem | base64 -w 0 > ETCD-KEY
# cat /usr/local/etcd/ssl/ca.pem | base64 -w 0 > ETCD-CA
# cat /usr/local/etcd/ssl/etcd.pem | base64 -w 0 > ETCD-CERT
# sed -i "s?# etcd-key: null?etcd-key: $(cat ETCD-KEY)?" calico-etcd.yaml
# sed -i "s?# etcd-ca: null?etcd-ca: $(cat ETCD-CA)?" calico-etcd.yaml
# sed -i "s?# etcd-cert: null?etcd-cert: $(cat ETCD-CERT)?" calico-etcd.yaml
2) 填入etcd的地址
# sed -i \
's?http://<ETCD_IP>:<ETCD_PORT>?https://172.16.1.81:2379,https://172.16.1.82:2379,https://172.16.1.83:2379?' \
calico-etcd.yaml
3) 開啟etcd證書路徑
# sed -i 's?etcd_ca: ""?etcd_ca: "/calico-secrets/etcd-ca"?' calico-etcd.yaml
# sed -i 's?etcd_cert: ""?etcd_cert: "/calico-secrets/etcd-cert"?' calico-etcd.yaml
# sed -i 's?etcd_key: ""?etcd_key: "/calico-secrets/etcd-key"?' calico-etcd.yaml
4) 修改pod CIDR,與集群配置保持一致
5) 配置calico選擇某網卡進行通信
- name: IP_AUTODETECTION_METHOD
value: "interface=eth1"
注: eth1為指定的通信網卡
6) 備注: CALICO_IPV4POOL_IPIP
Always # 為IPIP模式(默認)
Never # 為BGP模式
(3) 初始化calico網絡
# kubectl apply -f calico-etcd.yaml
4 查看網絡(方式三環境)
(1) 查看所有pod的狀態
(2) calico本地文件存儲(每個安裝kubelet的節點上都有)
/opt/cni/bin/、/etc/cni/net.d/、/var/lib/cni/
(3) calico-kubeconfig認證文件
2.2 將calicoctl作為二進制文件安裝在單個主機上
calicoctl用於管理Calico策略和配置,以及查看詳細的集群狀態,比如查看IP池利用率和BGP狀態。
保始終安裝calicoctl與集群上運行的 Calico 版本匹配的版本。
官方文檔: https://docs.projectcalico.org/getting-started/clis/calicoctl/install
1 下載插件
# wget https://github.com/projectcalico/calicoctl/releases/download/v3.20.1/calicoctl-linux-amd64
# mv calicoctl-linux-amd64 /usr/bin/calicoctl
# chmod +x /usr/bin/calicoctl
2 驗證
默認通過/root/.kube/config訪問api-server
(1) 獲取calico節點
# calicoctl get node
(2) 獲取calico節點狀態
# calicoctl node status
提示:
在節點上查看calico狀態時,不顯示當前節點的calico狀態。
比如在172.16.1.82(k8s-master2)節點上查看calico的狀態如下:
(3) 查看工作中的負載節點
# calicoctl get workloadendpoints
(4) 查看當前集群狀態
# kubectl get nodes
# kubectl get pod -A -o wide
2.3 下線節點
1 驅除異常節點上的服務
# kubectl drain <異常節點的nodename> --delete-local-data --force --ignore-daemonsets
# kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
# 驅除后查看Pod是否成功遷移到其他節點
2 刪除node
# kubectl delete node <異常節點的nodename>
# kubectl delete node k8s-node1
# 刪除后查看該node是否去除
3 清除節點信息(防止重新加入集群報錯)
在172.16.1.83(k8s-node1)節點上操作
# iptables -nL
# iptables -F
# iptables -X
# iptables -Z
注: kubeadm還需要使用如下步驟
# kubeadm reset
4 刪除多余網卡(正常網卡和docker0橋除外)
在172.16.1.83(k8s-node1)節點上操作
# systemctl restart docker
# ifconfig <網卡名> down <=> ip link set <網卡名> down
# ip link delete <網卡名>
# rm -rf /opt/cni/bin/*
# rm -rf /etc/cni/net.d/*
# rm -rf /var/lib/cni/*
5 重新加入集群
(1) 二進制
# 重啟kubelet服務
[root@k8s-node1 ~]# systemctl restart kubelet.service
(2) kubeadm方式
# 重新生成node加入集群的token,有效時間24小時
[root@k8s-master1 ~]# kubeadm token create --print-join-command