前言
下面 “坑” 都是作者升級 Kubernetes 遇到的問題並給出解決方法,目的就是避免讀者不要在掉進同樣的坑中。
第一個坑
升級 Calico 網絡組件
要求
Calico v3.2.3
升級到 v3.14.0
遇到的問題
Readiness probe failed: caliconode is not ready: BIRD is not ready: BGP not established with 172.18.0.1
問題原因
通過 calicoctl node status
命令排查,能看到 Calico 自動發現網卡出錯。Calico 默認自動會識別第一個網卡,但是后面因為在宿主機使用 docker-compose
創建新的服務並且也會創建一個新的網卡,Calico 重啟后自動識別 docker-compose
創建的網卡。導致集群 node 節點不能相互通信,就會報上面錯誤。
解決方法
臨時解決方法
:
把 docker-compose
創建的服務直接使用 docker run
來創建,這樣就不會創建一個新的網卡。
最終解決方法
:
Calico 是通過 Kubernetes yaml 文件部署的,所以直接在 yaml 文件中添加下面配置,在 calico-node
DaemonSet env
中添加環境變量,定義網卡發現規則。
# 定義ipv4自動發現網卡規則
- name: IP_AUTODETECTION_METHOD
value: "interface=eth.*"
# 定義ipv6自動發現網卡規則
- name: IP6_AUTODETECTION_METHOD
value: "interface=eth.*"
第二個坑
Calico 組件配置
環境
Kubernetes master 與 node 節點分別在不同雲廠商
遇到的問題
[ERROR][8] startup/startup.go 146: failed to query kubeadm’s config map error=Get https://10.10.0.1:443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=2s: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
問題原因
Node工作節點連接不到 apiserver
地址,檢查一下calico配置文件,要把apiserver的IP和端口配置上,如果不配置的話,calico默認將設置默認的calico網段和443端口。字段名:KUBERNETES_SERVICE_HOST
、KUBERNETES_SERVICE_PORT
、KUBERNETES_SERVICE_PORT_HTTPS
。
解決方法
Calico 是通過 Kubernetes yaml 文件部署的,所以直接在 yaml 文件中添加下面配置,在 calico-node
DaemonSet env
中添加環境變量。
- name: KUBERNETES_SERVICE_HOST
value: "kube-apiserver" # master apiserver 地址
- name: KUBERNETES_SERVICE_PORT
value: "6443"
- name: KUBERNETES_SERVICE_PORT_HTTPS
value: "6443"
第三個坑
Etcd v3.3.9 升級到 v3.4.7
環境
flannel 使用 v0.10.0 版本
遇到的問題
Etcd
需要升級到 v3.4.7
版本,從 v3.3.9
直接升級到 v3.4.7
是沒有問題的。但升級完成后,在查看 flannel
日志時,發現日志不斷報 E0714 14:49:48.309007 2887 main.go:349] Couldn't fetch network config: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint.
錯誤。剛才開始以為是 flannel 版本過低導致,后面把 flannel 升級到最新版本 v0.12.0
,但是問題還是一樣。
問題原因
后面仔細通過排查,發現是連接不上 Etcd
,當時很疑惑 Etce 連接不上,可 kube-apiserver
連接是正常的,后面才想起來,kube-apiserver
使用 Etcd v3接口
,而 flannel
使用 v2接口
。懷疑在升級 Etcd 時默認沒有開啟 v2接口
。最后查閱官方 Etcd v3.4 發布說明,從 3.4 版本開始,默認已經關閉 v2 接口協議,才導致上面報錯。
解決方法
直接在 Etcd 啟動參數添加 --enable-v2 'true'
預告
明天分享下作者近期 Kubernetes 從 v1.15.3
升級到 v1.18.5
心得。大家可以關注我的公眾號。即時收到明天的 Kubernetes 升級心得哈 ^v^。
熱門文章推薦
- 根據 PID 獲取 K8S Pod名稱 - 反之 POD名稱 獲取 PID
- Docker 網絡配置那些事
- Kubernetes容器節點漏洞(CVE-2020-8558)繞過本地主機邊界通告
- Kubernetes Node節點主機名 修改
- 微軟出品 - Kubernetes 學習指南
- Calico 介紹、原理與使用