書接上文
更新文檔一
1.19 更新到 1.20.15
docker相容性
docker 版本 | 備注 |
18.09.9 | 已驗證 |
19.03.15 | 已驗證 |
作業系統相容性
CentOS 版本 | 備注 |
7.9 | 已驗證 |
7.8 | 已驗證 |
元件變更說明
addons
- Calico v3.15.2
- etcd v3.4.13
- kubeadm
控制元件的node label
node-role.kubernetes.io/master
已經被舍棄,更改為
node-role.kubernetes.io/control-plane
kubeadm alpha certs
變更為
kubeadm certs
- kube-apiserver
以下參數會在v1.24移除
--address
and
--insecure-bind-address
--port
and
--insecure-port
解決ServiceAccount 的安全問題
TokenRequest and TokenRequestProjection
已經GA,以下參數必須添加到API server
-
,可以穩定通路到API server 的URL--service-account-issuer
-
--service-account-key-file
-
--service-account-signing-key-file
示例如下
--service-account-issuer=https://kubernetes.default.svc.cluster.local
--service-account-key-file=/etc/kubernetes/pki/sa.pub
--service-account-signing-key-file=/etc/kubernetes/pki/sa.key
相關issue
https://github.com/kelseyhightower/kubernetes-the-hard-way/issues/626
阿裡文檔說明
https://help.aliyun.com/document_detail/160384.html
其實kubernetes産品成熟,更新步驟基本一緻了
更新master
yum install -y kubeadm-1.20.15 kubelet-1.20.15 kubectl-1.20.15 --disableexcludes=kubernetes
kubeadm upgrade plan
kubeadm upgrade apply v1.20.15
systemctl daemon-reload
systemctl restart kubelet
如果不想更換證書和配置檔案
kubeadm upgrade apply v1.20.15 --certificate-renewal=false
更新其他master
yum install -y kubeadm-1.20.15 kubelet-1.20.15 kubectl-1.20.15 --disableexcludes=kubernetes
kubeadm upgrade node
systemctl daemon-reload
systemctl restart kubelet
如果不想更換證書和配置檔案
kubeadm upgrade node --certificate-renewal=false
更新worker nodes
我沒有騰空節點,看個人需求
yum install -y kubeadm-1.20.15 kubelet-1.20.15 kubectl-1.20.15 --disableexcludes=kubernetes
kubeadm upgrade node
systemctl daemon-reload
systemctl restart kubelet
1.18.20 更新到1.19.16
docker相容性
docker 版本 | 備注 |
18.09.9 | 已驗證 |
19.03.15 | 已驗證 |
作業系統相容性
CentOS 版本 | 備注 |
7.9 | 已驗證 |
7.8 | 已驗證 |
其實kubernetes産品成熟,更新步驟基本一緻了
更新master
yum install -y kubeadm-1.19.16 kubelet-1.19.16 kubectl-1.19.16 --disableexcludes=kubernetes
kubeadm upgrade plan
kubeadm upgrade apply v1.19.16
systemctl daemon-reload
systemctl restart kubelet
如果不想更換證書和配置檔案
kubeadm upgrade apply v1.19.16 --certificate-renewal=false
更新其他master
yum install -y kubeadm-1.19.16 kubelet-1.19.16 kubectl-1.19.16 --disableexcludes=kubernetes
kubeadm upgrade node
systemctl daemon-reload
systemctl restart kubelet
如果不想更換證書和配置檔案
kubeadm upgrade node --certificate-renewal=false
更新worker nodes
我沒有騰空節點,看個人需求
yum install -y kubeadm-1.18.20 kubelet-1.18.20 kubectl-1.18.20 --disableexcludes=kubernetes
kubeadm upgrade node
systemctl daemon-reload
systemctl restart kubelet
注意事項
- /var/lib/kubelet/kubeadm-flags.env 取消 --cgroup-driver,改成kubelet的 config.yaml
- 取消 kubeadm config view,改成 kubectl get cm -o yaml -n kube-system kubeadm-config
issue
kube-proxy ipvs報錯,導緻ipvs 不可用。1.19版本更改代碼邏輯
如果核心不大于4.1 就刷日志,如果大于4.1 會更新參數
https://github.com/kubernetes/kubernetes/pull/88541
如果核心低于4.1 ,kube-proxy日志報錯
# 需要更新核心到4.1以上
can't set sysctl net/ipv4/vs/conn_reuse_mode, kernel version must be at least 4.1
普通核心設定如下
net.ipv4.vs.conntrack=1
net.ipv4.vs.conn_reuse_mode=0
net.ipv4.vs.expire_nodest_conn=1
5.9 以上核心修改如下
https://github.com/kubernetes/kubernetes/issues/93297
net.ipv4.vs.conntrack = 1
net.ipv4.vs.conn_reuse_mode = 1 (previously 0)
net.ipv4.vs.expire_nodest_conn = 1 (unchanged)
net.ipv4.vs.expire_quiescent_template = 1 (unchanged)
1.17.17 更新到1.18.20
docker相容性
docker 版本 | 備注 |
18.09.9 | 已驗證 |
19.03.15 | 已驗證 |
作業系統相容性
CentOS 版本 | 備注 |
7.9 | 已驗證 |
7.8 | 已驗證 |
7.7 | 已驗證 |
更新master
yum install -y kubeadm-1.18.20 kubelet-1.18.20 kubectl-1.18.20 --disableexcludes=kubernetes
kubeadm upgrade plan
kubeadm upgrade apply v1.18.20
systemctl daemon-reload
systemctl restart kubelet
如果不想更換證書和配置檔案
kubeadm upgrade apply v1.18.20 --certificate-renewal=false
更新其他master
yum install -y kubeadm-1.18.20 kubelet-1.18.20 kubectl-1.18.20 --disableexcludes=kubernetes
kubeadm upgrade node
systemctl daemon-reload
systemctl restart kubelet
如果不想更換證書和配置檔案
kubeadm upgrade node --certificate-renewal=false
更新worker nodes
yum install -y kubeadm-1.18.20 kubelet-1.18.20 kubectl-1.18.20 --disableexcludes=kubernetes
kubeadm upgrade node
systemctl daemon-reload
systemctl restart kubelet
注意事項
issue:
1、利用 cni 漏A洞A攻A擊 https://github.com/kubernetes/kubernetes/issues/91507
以下版本已經修複
- kubelet v1.19.0+ (master branch #91370)
- kubelet v1.18.4+ (#91387)
- kubelet v1.17.7+ (#91386)
- kubelet v1.16.11+ (#91388)
最終修複版本是1.19
2、1.18開始kubernetes 使用的ipvs 子產品 較新,導緻叢集kube-proxy ipvs模式異常
https://github.com/kubernetes/kubernetes/issues/89520
https://github.com/kubernetes/kubernetes/issues/82065
解決方式:
- 需要更新核心 大于3.18
- 更新k8s 1.18.2 https://github.com/kubernetes/kubernetes/pull/90555
- 更新到1.18.9後發現 pod 網絡是host,"dnsPolicy": "ClusterFirstWithHostNet", 仍然觸發bug,如果要用3.10 核心,需要更新k8s 到1.19
原因是高版本k8s 調用了新版本的ipvs 子產品,就核心不支援。導緻 svc 的endpoint 無法轉發
managedFields 顯示在yaml 裡面,如何屏蔽或者自定義顯示
官方blog 說明
kubectl_yaml() {
kubectl -o yaml "$@" \
| yq d - 'items[*].metadata.managedFields' \
| yq d - '.metadata.managedFields' \
| yq d - 'items[*].metadata.ownerReferences' \
| yq d - 'metadata.ownerReferences' \
| yq d - 'items[*].status' \
| yq d - 'status'
}
kubectl_json() {
kubectl -o json "$@" \
| jq 'del(.items[]?.metadata.managedFields)' \
| jq 'del(.metadata.managedFields)' \
| jq 'del(.items[]?.metadata.ownerReferences)' \
| jq 'del(.metadata.ownerReferences)' \
| jq 'del(.items[]?.status)' \
| jq 'del(.status)'
}
kubectl_yaml get pods
kubectl_json get service my-service