[CKA] Kubernetes Certificate Administrator(CKA) with Tests 학습노트(1/)

json으로 값을 출력하여 특정 값을 찾기

ex) 노드의 osimage를 가지고 오려면 다음과 같은 길을 찾아간다.

kubectl get nodes -o json | jq -r '.items[].status.nodeInfo.osImage'

static pod 생성

https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/

static pod는 apiserver가 관리하지 않고 특정 노드의 kubelet이 직접 관리하는 pod를 의미한다. 생성을 위하여 manifest경로에 pod의 yaml을 넣어두면 kubelet이 시작(재시작)되는 타이밍에 생성된다.

etcd 백업

현재 etcd 클러스터에 대한 스냅은 어떻게 만들 수 있을까? 기본 형은 아래와 같다.

ETCDCTL_API=3 etcdctl snapshot save <fileppath>

하지만 etcd에 접근하려면 pod 혹은 서비스에 대한 접근이 필요하고 https 2379포트로 접근하여야 한다. 이를 위하여 endpoint, cacert, cert, key 정보를 함께 포함한 명령은 다음과 같다.

ETCDCTL_API=3 etcdctl --endpoints=https://<etcdendpointip>:2379 \
--cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
snapshot save <backup-file-location>

etcd에 대한 인증서는 kubenetes 폴더의 pki/etcd/ 안에 기본적으로 탑재되므로 인증서 및 비밀키를 반영한 구성은 다음과 같다.

ETCDCTL_API=3 etcdctl --endpoints https://<etcdendpointip>:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key /etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save ./snapshot.db

상세한 인증서 정보는 etcd의 매니페스트 파일을 참고하자 /etc/kubernetes/manifests/etcd.yaml

etcd 복구

백업데이터가 있다면 복구는 다음과 같은 순서로 수행한다.

  1. 백업한 스냅샷을 기존 데이터 디렉토리와 다른 곳에 복구. controlplane에서 수행하는 명령이므로, hostpath(=controlplane이 수행되는 호스트)에 값을 쓰는 행위니 인증서가 필요가 없다. 백업한 스냅샷 파일만 있으면 됨.
$ etcdctl snapshot restore --data-dir /var/lib/etcd-from-backup /opt/snapshot-pre-boot.db
  1. 엣시디의 야플 파일 중 데이터 디렉토리를 신규 경로로 수정
$ vim /etc/kubernetes/manifest/etcd.yaml
호스트패스 볼륨 중 데이터 디렉토리의 경로를 신규 경로(/var/lib/etcd-from-backup)로 수정
  1. 엣시디가 다시 뜨는 것을 확인
$ kubectl get pod -n kube-system

익스터널 서버에서 etcd를 수행할 경우...

  1. ETCD가 별도의 서버로 빠져있는 경우 systemd가 관리한다. /etc/systemd/system/etcd.service의 data-dir를 수정한다.

  2. etcd를 재시작하고 상태를 확인한다.

systemctl deamon-reload
systemctl restart etcd
systemctl status etcd
ps -ef | grep etcd
  1. controller, scheduller를 재시작하고, kubelet도 재시작한다.
kubectl delete pods -n kube-system kube-controller-manager kube-scheduler
systemctl restart kubelet
systemctl status kubelet

잘 뜨면 이것 저것 돌려보면 된다.