티스토리 뷰
◼ 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상 태기 때문에 해제시켜줘야 한다.
- kubectl drain node01
- 5분 안에 node를 살린다면 pod가 실행되지만 5분이 지나면 pod가 제거(terminated)된다.
◼ 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
- master node upgrade
- control plane 컴포넌트들이 작동이 불가능해진다.
- 실행되고 있는 application에는 영향이 없다.
- worker node upgrade
- strategy 1: 모든 노드 한 번에 업그레이드 → application이 down 되며 서비스 불가
- strategy 2: 하나의 노드씩 업그레이드→ pod를 다른 노드로 옮겨 놓음
- strategy 3: 새로운 노드를 추가하고 기존 노드 삭제 → cloud 환경에서 용이
kubeadm upgrade 방법
master node
- upgrade 정보 확인: kubeadm upgrade plan
- 현재 버전, upgrade 가능한 버전
- 수동으로 업그레이드해야 하는 것(kubelet)
- 업그레이드를 수행하기 위해 필요한 것
- upgrade 할 kubeadm 설치
- apt update && apt-get upgrade -y kubeadm=1.12.0-00
- 새로운 버전의 kubeadm 적용
- kubeadm upgrade apply v.12.0
- upgrade 할 kubelet 설치
- apt-get upgrade -y kubelet=1.12.0-00
- systemctl restart kubelet
worker node
- pod 안전하게 이동
- kubectl drain node01
- kubeadm, kubelet upgrade
- apt-get upgrade -y kubeadm-1.12.0-00 kubelet=1.12.0-00
- restart kubelet service
- systemctl daemon-reload && systemctl restart kubelet
- 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
- snapshot
- ETCDCTL_API=3 etcdctl snapshot save snapshot.db
- 상태 확인
- ETCDCTL_API=3 etcdctl snapshot status snapshot.db
ETCD Restore
- kube-apiserver 중지: kubeapi는 etcd에 디펜던시가 있기 때문에 중지시켜줘야 한다.
- service kube-apiserver stop
- 기존 etcd와 충돌 방지를 위해 새로운 저장 경로와 함께 restore
- ETCDCTL_API=3 etcdctl snapshot restore snapshot.db --data-dir /var/lib/etcd-from-backup
- service 재시작
- systemctl daemon-reload && service etcd restart
- 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
링크
TAG
- 위코드
- 덕타이핑
- user-agent
- http
- HTTP/2
- database
- thetextbook
- cka
- Network
- 창업
- docker-compose
- no-op
- 프리온보딩
- pytest
- go
- GitHub
- QUIC
- 원티드
- Complier
- Python
- k8s
- HTTP/3
- buildkit
- web_server
- gitignore
- direnv
- MSA
- Isolate level
- Git
- inflearn
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함