IT/kubernetes

쿠버네티스 버전 업그레이드

xzpluszone 2021. 9. 23. 14:28
Joplin Server - Note

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 업그레이드

  1. 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
  1. 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