본문 바로가기

Develop/DevOps

[MLOps] Kubernetes CKA자격증 공부 - Maintenance

반응형

Drain & Cordon

node01을 업그레이드 하기위해서는 먼저 일시정지를 시켜줘야한다. 그럴땐 다음과같은 drain 명령어로 처리.

kubectl drain node01 --ignore-daemonsets

다시 활성화를 시켜주려면 uncordon 명령어로 처리

kubectl uncordon node01

기존에 node01에서 돌던 pod들은 다른 활성화(taint가 되지않은)된 node로 넘어가게되고, node01을 다시 활성화 시켜준다해도 복귀하지않는다.

 

만약에 다른 활성화된 node로도 못옮기는상태에서 첫번째 명령어를 실행시키게된다면

error: unable to drain node "node01", aborting command...
There are pending nodes to be drained:
 node01
error: cannot delete Pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet (use --force to override): default/hr-app

 

위와같은 에러문이 뜨게된다. 즉 node01에 있는 hr-app이라는 pod때문에 비활성화(drain)를 못시켜준다는 의미다. 이럴경우엔 맨뒤에

--force 명령어를 넣어서 무시하고 drain시켜줄수가있다.

kubectl drain node01 --ignore-daemonsets --force

주의해야할점은, 이렇게 --force명령어를 실행하게될경우 hr-app은 영원히 날라가게된다.

 

만일, hr-app을 절대 없애지 말아야하는 pod이라고 가정할때, 다음과 같은 명령어로 해당 pod이 삭제되는걸 방지할수있다.

cordon은 drain과 유사하지만, drain은 기존 Node에 있던 Pod이 다른 node로 옮겨지는반면에, cordon은 노드안에 있는 pod들도 잠시 멈추는 효과를 갖고있다.

kubectl cordon node01

kubernetes 버전 관리

kube-apiserver기준으로 이외 쿠버네티스 부분의 버전이 정해짐

  • controller-manager, kube-scheduler버전은 kube-apiserver보다 한단계 아래까지만 허용함
  • kubelet, kube-proxy버전은 Kube-apiserver보단 두단계 아래까지만 허용함
  • kubectl은 위아래로 한단계까지 허용

kubeadm

kubernetes에 관련된 라이브러리를 업그레이드 할수있게 도와주는 명령어.

현재 최신버전이 어떻게되어있는지 확인하려면 다음과 같은 명령어를 사용한다. 그러면 현재 업그레이드 할수있는 버전이 나오게된다.

* GCP(Google Cloud Platform)에서는 버튼 한번이면 알아서 업데이트를 해준다고한다.

 

다음과 같은 명령어로 업데이트를 진행한다

# 먼저 모든 라이브러리에 대해 업데이트 진행
(sudo) apt update

# 그다음에 kubeadm 다운로드
(sudo) apt install (or upgrade) kubeadm=1.12.0

# 쿠버네티스의 controlplane에 대해서 버전 업데이트 적용
kubeadm upgrade apply v1.12.0

# kubelet에 대해서 1.12.0버전을 적용
(sudo) apt install kubelet=1.12.0

# 위의 작업이후에는 아직 1.12.0버전이 적용되어있지않음, 다시 재시작을 해줘야지 새로운버전이 적용됨
systemctl restart kubelet

특정 Node로 넘어가서 업데이트를 하려면 ssh로 해당 노드로 접속해야한다

ssh [target Node]

Backup

백업을 할때는 다음 두개 요소를 백업해줘야한다

1. 현재 띄워져있는 모든 리소스에 대해서 yaml파일로 추출하여 저장

kubectl get all --all-namespaces -o yaml > all-deploy-services.yaml

2. ETCD 백업 & Restore

- 제일 마지막 명령어가 끝나고 etcd.service에서 data-dir경로를 백업한 위치경로로 수정해줘야한다

# ETCD Snapshot save
ETCDCTL_API=3 etcdctl snapshot save snapshot.db

# Snapshot status확인
ETCDCTL_API=3 etcdctl snapshot status snapshot.db

# Restore할때
# 먼저 kube-apiserver를중지
service kube-apiserver stop

# etcd restore
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db --data-dir /var/lib/etcd-from-backup

# etcd.service 또는 etcd.yaml파일을 위 백업 경로로 바꿔준다음 재시작 필요
# etcd.yaml파일에는 volumes구조체에 Name이 etcd-data부분에서 path를 수정해줘야함


systemctl daemon-reload
service etcd restart
service kube-apiserver start

- 연습문제에서 써야했던 snapshot 커맨드(저장용)

ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /opt/snapshot-pre-boot.db

 

반응형