Last updated: 23 Sep 21 05:25:54
kube upgrade
튜토리얼
k8s를 업그레이드를 합니다. 마스터1, 미니언2 구성입니다. 아주 오래전에 사용했던 k8s 버전이 13이 있었으며, 그것을 20으로 올리면서 겪었던 상황을 공유 합니다. 즉시 최신버전으로 적용할 수 없으며, 각 어플과 k8s의 버전 검증을 거치고 올려야합니다.
그리고 docker버전도 추후에 올렸던 작업도 공유합니다.
환경
centos7 docker 1.13.1 -> 20.10.8 kube 13 -> 20 helm 2.x -> 3.6.3 dashboard 1.10 -> 2.3.1 flannel 0.14 kube-dns 1.14
k8s 업그레이드
- k8s 패키지 최신 찾기
> yum list --showduplicates kubeadm --disableexcludes=kubernetes > yum install -y kubeadm-1.15.12-0 --disableexcludes=kubernetes
> yum list --showduplicates kubeadm --disableexcludes=kubernetes
> yum install -y kubeadm-1.15.12-0 --disableexcludes=kubernetes
- k8s 업그레이드 가능확인
> kubeadm upgrade plan #만약 실패 한다면 삭제해도 운영에 문제없음. > yum remove kubeadm #15->16 k8s 업그레이할 시 참고 > kubeadm upgrade plan --ignore-preflight-errors=CoreDNSUnsupportedPlugins > kubeadm upgrade apply v1.16.15 --ignore-preflight-errors=CoreDNSUnsupportedPlugins #업그레이드 에러 시 에러내용 runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized # 기존 대역을 알고 있어야함. # flannel 확인 방법 및 변경 > ps afx| grep kube | grep cluster-cidr --cluster-cidr=102.31.0.0/16 > vi kube-flannel.yml { "Network": "102.31.0.0/16", "Backend": { "Type": "vxlan" } } > wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml > kubectl apply -f kube-flannel.yml # DNS도 재시작 필요. 재기동 에러 시 # 파일 : kubedns-cm.yaml, kubedns-controller.yaml, kubedns-sa.yaml, kubedns-svc.yaml # Deployment" in version "extensions/v1beta1" > vi kubedns-controller.yaml # 다음 항목 변경 apiVersion: apps/v1 # pod들도 접속이 안될 수 있다. pod들 재시작 필요 > kubectl delete -n default pod users-pod-75f7d765b4-8kp7m #k8s 마스터 업그레이드 > kubeadm upgrade apply v1.15.12 > kubeadm upgrade node > yum install kubelet-1.15.12-0 --disableexcludes=kubernetes > yum install kubectl-1.15.12-0 --disableexcludes=kubernetes # 유지보수로 변경해야함 # 데몬셋은 죽지 않으니. 수동으로 종료 해줘야함. > kubectl drain kubenode1 --ignore-daemonsets > kubectl drain kubenode2 --ignore-daemonsets # 유지보수 시 데몬셋 에러 발생 시 when evicting pod "xxxx-0" (will retry after 5s): Cannot evict pod as it would violate the pods disruption budget. check budgets or kubectl delete -f xxxx.yaml # 20->21 k8s 업그레이할 시 참고 Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget "PodDisruptionBudget" in version "policy/v1beta1" ->> policy/v1 # 16->17 k8s 업그레이할 시 참고 no matches for kind "PodDisruptionBudget" in version "policy/v1" ->> policy/v1beta1 no matches for kind "StatefulSet" in version "apps/v1beta1" ->> v1 # 다음 항목 추가 timeoutSeconds: 5 periodSeconds: 5 initialDelaySeconds: 45 > systemctl daemon-reload > systemctl restart kubelet # 마스터 노드 상태확인 # 진행 1 > kubectl get node NAME STATUS ROLES AGE VERSION kubemaster Ready master 2y250d v1.14.10 kubenode1 Ready,SchedulingDisabled <none> 2y250d v1.14.10 kubenode2 Ready,SchedulingDisabled <none> 2y250d v1.14.10 #19->20 k8s 업그레이할 시 참고 > kubectl get node NAME STATUS ROLES AGE VERSION kubemaster Ready ** control-plane**,master 2y251d v1.20.10 # 마스터 노드 시간을 갖고 기다려야함 # 진행 2 > kubectl get node NAME STATUS ROLES AGE VERSION kubemaster Ready master 2y250d v1.15.12 kubenode1 Ready,SchedulingDisabled <none> 2y250d v1.14.10 kubenode2 Ready,SchedulingDisabled <none> 2y250d v1.14.10 # 진행 4 > kubectl get node NAME STATUS ROLES AGE VERSION kubemaster Ready master 2y250d v1.15.12 kubenode1 Ready,SchedulingDisabled <none> 2y250d v1.15.12 kubenode2 Ready,SchedulingDisabled <none> 2y250d v1.14.10 # 진행 5 > kubectl uncordon kubenode1 # 유지보수 해제 > node/kubenode1 uncordoned > kubectl get node NAME STATUS ROLES AGE VERSION kubemaster Ready master 2y250d v1.15.12 kubenode1 Ready <none> 2y250d v1.15.12 kubenode2 Ready,SchedulingDisabled <none> 2y250d v1.14.10 # 진행 7 > kubectl uncordon kubenode2 # 유지보수 해제 > node/kubenode2 uncordoned > kubectl get node NAME STATUS ROLES AGE VERSION kubemaster Ready master 2y250d v1.15.12 kubenode1 Ready <none> 2y250d v1.15.12 kubenode2 Ready <none> 2y250d v1.15.12 # 진행 3 # 워커 노드 1 업그레이드 진행 > yum install -y kubeadm-1.15.12-0 --disableexcludes=kubernetes > kubeadm upgrade node config --kubelet-version v1.15.12 # 17->18 k8s 업그레이할 시 참고 > kubeadm upgrade node > yum install kubelet-1.15.12-0 --disableexcludes=kubernetes > yum install kubectl-1.15.12-0 --disableexcludes=kubernetes > systemctl daemon-reload > systemctl restart kubelet > systemctl status kubelet # 진행 6 # 워커 노드 2 업그레이드 진행 > yum install -y kubeadm-1.15.12-0 --disableexcludes=kubernetes > kubeadm upgrade node config --kubelet-version v1.15.12 > yum install kubelet-1.15.12-0 --disableexcludes=kubernetes > yum install kubectl-1.15.12-0 --disableexcludes=kubernetes > systemctl daemon-reload > systemctl restart kubelet > systemctl status kubelet
> kubeadm upgrade plan
#만약 실패 한다면 삭제해도 운영에 문제없음.
> yum remove kubeadm
#15->16 k8s 업그레이할 시 참고
> kubeadm upgrade plan --ignore-preflight-errors=CoreDNSUnsupportedPlugins
> kubeadm upgrade apply v1.16.15 --ignore-preflight-errors=CoreDNSUnsupportedPlugins
#업그레이드 에러 시 에러내용
runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
# 기존 대역을 알고 있어야함.
# flannel 확인 방법 및 변경
> ps afx| grep kube | grep cluster-cidr
--cluster-cidr=102.31.0.0/16
> vi kube-flannel.yml
{
"Network": "102.31.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
> wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
> kubectl apply -f kube-flannel.yml
# DNS도 재시작 필요. 재기동 에러 시
# 파일 : kubedns-cm.yaml, kubedns-controller.yaml, kubedns-sa.yaml, kubedns-svc.yaml
# Deployment" in version "extensions/v1beta1"
> vi kubedns-controller.yaml
# 다음 항목 변경
apiVersion: apps/v1
# pod들도 접속이 안될 수 있다. pod들 재시작 필요
> kubectl delete -n default pod users-pod-75f7d765b4-8kp7m
#k8s 마스터 업그레이드
> kubeadm upgrade apply v1.15.12
> kubeadm upgrade node
> yum install kubelet-1.15.12-0 --disableexcludes=kubernetes
> yum install kubectl-1.15.12-0 --disableexcludes=kubernetes
# 유지보수로 변경해야함
# 데몬셋은 죽지 않으니. 수동으로 종료 해줘야함.
> kubectl drain kubenode1 --ignore-daemonsets
> kubectl drain kubenode2 --ignore-daemonsets
# 유지보수 시 데몬셋 에러 발생 시
when evicting pod "xxxx-0" (will retry after 5s): Cannot evict pod as it would violate the pods disruption budget.
check budgets or kubectl delete -f xxxx.yaml
# 20->21 k8s 업그레이할 시 참고
Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
"PodDisruptionBudget" in version "policy/v1beta1" ->> policy/v1
# 16->17 k8s 업그레이할 시 참고
no matches for kind "PodDisruptionBudget" in version "policy/v1" ->> policy/v1beta1
no matches for kind "StatefulSet" in version "apps/v1beta1" ->> v1
# 다음 항목 추가
timeoutSeconds: 5
periodSeconds: 5
initialDelaySeconds: 45
> systemctl daemon-reload
> systemctl restart kubelet
# 마스터 노드 상태확인
# 진행 1
> kubectl get node
NAME STATUS ROLES AGE VERSION
kubemaster Ready master 2y250d v1.14.10
kubenode1 Ready,SchedulingDisabled <none> 2y250d v1.14.10
kubenode2 Ready,SchedulingDisabled <none> 2y250d v1.14.10
#19->20 k8s 업그레이할 시 참고
> kubectl get node
NAME STATUS ROLES AGE VERSION
kubemaster Ready ** control-plane**,master 2y251d v1.20.10
# 마스터 노드 시간을 갖고 기다려야함
# 진행 2
> kubectl get node
NAME STATUS ROLES AGE VERSION
kubemaster Ready master 2y250d v1.15.12
kubenode1 Ready,SchedulingDisabled <none> 2y250d v1.14.10
kubenode2 Ready,SchedulingDisabled <none> 2y250d v1.14.10
# 진행 4
> kubectl get node
NAME STATUS ROLES AGE VERSION
kubemaster Ready master 2y250d v1.15.12
kubenode1 Ready,SchedulingDisabled <none> 2y250d v1.15.12
kubenode2 Ready,SchedulingDisabled <none> 2y250d v1.14.10
# 진행 5
> kubectl uncordon kubenode1
# 유지보수 해제
> node/kubenode1 uncordoned
> kubectl get node
NAME STATUS ROLES AGE VERSION
kubemaster Ready master 2y250d v1.15.12
kubenode1 Ready <none> 2y250d v1.15.12
kubenode2 Ready,SchedulingDisabled <none> 2y250d v1.14.10
# 진행 7
> kubectl uncordon kubenode2
# 유지보수 해제
> node/kubenode2 uncordoned
> kubectl get node
NAME STATUS ROLES AGE VERSION
kubemaster Ready master 2y250d v1.15.12
kubenode1 Ready <none> 2y250d v1.15.12
kubenode2 Ready <none> 2y250d v1.15.12
# 진행 3
# 워커 노드 1 업그레이드 진행
> yum install -y kubeadm-1.15.12-0 --disableexcludes=kubernetes
> kubeadm upgrade node config --kubelet-version v1.15.12
# 17->18 k8s 업그레이할 시 참고
> kubeadm upgrade node
> yum install kubelet-1.15.12-0 --disableexcludes=kubernetes
> yum install kubectl-1.15.12-0 --disableexcludes=kubernetes
> systemctl daemon-reload
> systemctl restart kubelet
> systemctl status kubelet
# 진행 6
# 워커 노드 2 업그레이드 진행
> yum install -y kubeadm-1.15.12-0 --disableexcludes=kubernetes
> kubeadm upgrade node config --kubelet-version v1.15.12
> yum install kubelet-1.15.12-0 --disableexcludes=kubernetes
> yum install kubectl-1.15.12-0 --disableexcludes=kubernetes
> systemctl daemon-reload
> systemctl restart kubelet
> systemctl status kubelet
'IT > kubernetes' 카테고리의 다른 글
ISTIO 이스티오 설치 (0) | 2021.09.23 |
---|---|
쿠버네티스 설치 (0) | 2021.09.23 |
프라이빗 도커 레파지토리 Helm에서 Harbor로 설치 (0) | 2021.09.23 |