티스토리 뷰

DevOps

[CKA] Cluster Maintenance

신잼 2022. 3. 8. 23:40

◼ OS Upgrade

  • 유지보수(security patch 등)의 이유로 cluster에서 node를 안정적으로 내리려면 어떻게 해야 하는가?
    • 5분 안에 node를 살린다면 pod가 실행되지만 5분이 지나면 pod가 제거(terminated)된다.
      • kube-controller-manager --pod-eviction-timeout (Default: 5m)
    • replicaSet으로 관리되고 있던 pod라면 다른 node에 배지가 되지만 그렇지 않으면 사라진다.
    • 안전한 방법은 아래와 같다.
      • kubectl drain node01
        • node01안에 있는 pod들이 축출 되면서 다른 node로 스케줄링된다.
        • node01에 cordon이 되면서 스케줄링이 안되게 된다.
      • kubectl uncordon node01
        • node01을 복구했더라도 cordon상 태기 때문에 해제시켜줘야 한다.

◼ versions

  • k8s의 버전이 1.20.0이라면 kube-apiserver, controller mansger, scheduler, kubelet, proxy 은 동일한 버전을 갖지만 ETCD와 CoreDNS는 별도의 프로젝트로 관리되고 있기 때문에 버전이 다르다.
  • kube api는 primary 한 컴포넌트기 때문에 특정 컴포넌포넌트들(kube-apiserver, controller mansger, scheduler, kubelet, proxy )이 더 버전이 높을 수 없다. 특정 컴포넌트들 외에는 버전이 더 높을 수도 있다.
  • 컴포넌트 간에 버전 차이가 날 수 도 있지만 아래와 같이 정해진 규칙이 있다.
  • 언제 얼마나 업그레이드 하면 좋을까? → 새로운 minor버전이 나왔을 때 하나의 minor 버전 업그레이드가 추천된다.
    • k8s는 최신의 3개의 minor 버전까지만 support 하기 때문이다.

◼ Cluster upgrade process

  1. master node upgrade
    • control plane 컴포넌트들이 작동이 불가능해진다.
    • 실행되고 있는 application에는 영향이 없다.
  2. worker node upgrade
    1. strategy 1: 모든 노드 한 번에 업그레이드 → application이 down 되며 서비스 불가
    2. strategy 2: 하나의 노드씩 업그레이드→ pod를 다른 노드로 옮겨 놓음
    3. strategy 3: 새로운 노드를 추가하고 기존 노드 삭제 → cloud 환경에서 용이

kubeadm upgrade 방법

master node

  1. upgrade 정보 확인: kubeadm upgrade plan
    • 현재 버전, upgrade 가능한 버전
    • 수동으로 업그레이드해야 하는 것(kubelet)
    • 업그레이드를 수행하기 위해 필요한 것
  2. upgrade 할 kubeadm 설치
    • apt update && apt-get upgrade -y kubeadm=1.12.0-00
  3. 새로운 버전의 kubeadm 적용
    • kubeadm upgrade apply v.12.0
  4. upgrade 할 kubelet 설치
    1. apt-get upgrade -y kubelet=1.12.0-00
    2. systemctl restart kubelet

worker node

  1. pod 안전하게 이동
    • kubectl drain node01
  2. kubeadm, kubelet upgrade
    • apt-get upgrade -y kubeadm-1.12.0-00 kubelet=1.12.0-00
  3. restart kubelet service
    1. systemctl daemon-reload && systemctl restart kubelet
  4. kubectl uncordon node01

 

◼ Backup and Restore

크게 두 가지 방법이 있다. resource configuration과 etcd

Resource Configuration

  • 모든 resource를 yaml로 저장
    • kubectl get all --all-namespaces -o yaml > all-deploy-services.yaml
  • 외부 솔류션(VELERO 등)을 사용할 수 도 있다. 

ETCD

  • 클러스터의 모든 정보를 갖고 있기 때문에 ETCD 자체를 백업하는 방법
  • --data-dir에 데이터가 저장되는 경로를 갖고 있다.

ETCD Snapshot

현재 db 상태를 snapshot으로 복사해주는 built in solution

  1. snapshot
    • ETCDCTL_API=3 etcdctl snapshot save snapshot.db
  2. 상태 확인
    • ETCDCTL_API=3 etcdctl snapshot status snapshot.db

ETCD Restore

  1. kube-apiserver 중지: kubeapi는 etcd에 디펜던시가 있기 때문에 중지시켜줘야 한다.
    • service kube-apiserver stop
  2. 기존 etcd와 충돌 방지를 위해 새로운 저장 경로와 함께 restore
    • ETCDCTL_API=3 etcdctl snapshot restore snapshot.db --data-dir /var/lib/etcd-from-backup
  3. service 재시작
    • systemctl daemon-reload && service etcd restart
  4. kube-apiserver 실행
    • service kube-apiserver start

 

 

반응형

'DevOps' 카테고리의 다른 글

[CKA] Application Lifecycle Management  (0) 2022.03.07
[CKA] logging & monitoring  (0) 2022.03.05
[CKA] Scheduling  (0) 2022.03.04
[CKA] Core Concepts  (0) 2022.03.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함