天天看點

kubernetes 更新指南二

書接上文

​​更新文檔一​​

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

  • ​--service-account-issuer​

    ​,可以穩定通路到API server 的URL
  • ​--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      

變更

繼續閱讀