[CKA] Certified Kubernetes Administrator (CKA) with Practice Tests Notes
시험 준비
객관식이 아니고, 과제를 2시간안에 수행해야 하는 문제
아키텍처
node
- master node : 클러스터 관리 노드
- worker node : 컨테이너 수행 노드
node내 구성요소
- etcd : 데이터 저장소.
- kube-scheduler : 스케줄러
- node-controller : 노드 컨트롤러. 노드 자체 관리
- replicaiton-controller : 컨테이너가 적정수량만큼 돌도록 관리
- kube-apiserver : 오케스트레이션을 위한 통로. 통신을 위한 컨테이너로 이해하면 좋으며, kubernetes를 구성하고 있는 모든 컨테이너들이 api호출로 동작을 수행함
- container runtime : 컨테이너 런타임. dcoker, containerd, rkt 등
- kubelet : 워커 노드에서 실행되는 에이전트. 예를 들어 마스터노드의 scheduler가 컨테이너 배치를 명령하면 워커의 kubelet이 명령을 받아 컨테이너를 돌림
- kube-proxy : 노드 사이 통신을 위한 컨테이너. 워커 노드에 배치됨.
컨테이너 런타임
- 쿠버네티스는 도커로 시작했고, 후에 컨테이너와 런타임 스펙이 적립됨.
- 스펙
- CRI (Container Runtime Interface)
- OCI (Open Container Interactive)
- imagespec
- runtimespec \<- 바로 이 런타임 스펙을 구현하면 된다
- 도커는 스펙 적립전에 나온 물건이므로 쿠버네티스는 dcokershim을 지원함
- 도커에서 다른 기능 외에 CRI를 준수하는 containerd라는 런타임을 런칭
- 쿠버네티스는 1.24버전에서 dockershim을 삭제하고 docker지원 중단(containerd는 cri준수하므로 사용가능)
- 도커로 만든 컨테이너 이미지 자체는 OCI를 준수하므로 사용 가능
containerd and cli
워커에서 이미지를 생성할 일이 없으면 containerd만 써도 된다. 그렇다면 이미지 실행(docker run ...)은 어떻게 하면 될까?
- ctr : containerd용 cli. docker cli의 자리는 ctr이 대체하였다. 근데 ctr이 기능 제한이 많음
- nerdctl : nerdctl도 있다. 기존 docker명령을 거의 쓸 수 있음
- crictl : cri호환 컨테이너 런타임을 조작하기 위한 cli도구. 쿠버네티스 관점에서 컨테이너 런타임을 조작한다. 쿠버네티스에서 개발한 cri 구현이라고 이해하면 좋을 듯. 결론 - docker cli쓰지말고 crictl cli 사용하세요
etcd
개요
분산 키밸류 데이터베이스고 엣시디로 읽는다.
설치 및 사용
깃헙에서 다운로드받고 압축풀어서 바이너리 실행하면 됨.
etcd의 쿠버네티스 클러스터 정보
kubeadm으로 노드를 구성하면 etcd가 같이 배포된다. 여기에 클러스터 정보가 담기며, 정보의 키는 디렉토리 형식으로 저장된다. 다음 명령으로 클러스터 내의 값들을 확인할 수 있다.
kubectl exec etcd-master -n kube-system etcdctl get / --prefix --keys-only
etcdctl사용시 주의점
- 현재 버전 확인. v2와 v3 명령셋이 다르므로 etcdctl 버전 확인을 잘 해야한다.
- 인증서. etcdctl은 etcd api server로 인증한다. 쿠버네티스 pki내에있는 인증서를 같이 쓰자.
이 주의점을 반영하면 위 명령은 아래와 같이 변경하여야 한다.
kubectl exec etcd-master -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl get / --prefix --keys-only --limit=10 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key"
api server
kubectl 혹은 post로 제어할 수 있다
api에 post를 날려 pod 생성하는 시나리오
- 사용자가 post요청을 kube-apiserver로 날림
- api 서버가 post 처리
- 유저 인증
- validate 리퀘스트
- kubernetes 정보를 etcd에서 읽음
- etcd에 적절한 pod을 생성하도록 업데이트
- 사용자에게 pod 생성 완료 응답(http response)
- kube-scheduler가 apiserver를 통해 할 작업이 있는지 모니터링 중 생성할 pod이 있는 것을 발견
- apiserver에 적절한 node에 pod생성 요청
- apiserver가 배치할 node의 kubelet에 pod생성 요청
- kubelet이 컨테이너 런타임에 해당 pod 실행 요청 후 apiserver에 생성 완료 응답
- apiserver가 pod 생성 완료를 etcd에 갱신
kubernetes upgrade using kubeadm
kubeadm을 먼저 업그레이드하고 클러스터를 업그레이드 한다.
1. 컨트롤플레인 업그레이드
$ kubeadm drain <controlplanename> # -1. 컨트롤플레인에서 돌고 있는 파드를 다른 곳으로 옮기고, unscheduling 상태로 만들자. cordon 명령을 포함한다.$ kubeadm upgrade plan # 0. 업그레이드 가능 버전을 체크하여보자. 업그레이드는 플랜대로 수행한다#$ kubeadm upgrade plan 1.26.0 # 0.1. 원하는 타겟 버전이 있으면 그 버전을 명시하여도 좋다.$ apt-get update && apt-get install -y kubeadm=1.26.0-00 # 1. kubeadm 업그레이드$ kubeadm upgrade apply 1.26.0 # 2. 쿠블렛 설정 업그레이드 수행.$ apt-get install -y kubelet=1.26.0-00 kubectl=1.26.0-00 # 3. kubelet과 kubectl을 업그레이드 한다.$ systemctl daemon-reload # 4. 데몬들과 kubelet을 재시작한다.$ systemctl restart kubelet$ kubectl version --short # 5. 작업 완료 후 버전을 체크해보자.
2. 워커노드 업그레이드
$ kubeadm drain <workername> --ignore-daemonsets # 1. 돌고 있는 파드를 다른 곳으로 옮기고, unscheduling 상태로 만들자. cordon 명령을 포함한다.$ kubeadm upgrade node # 2. 로컬 쿠블렛 설정 업그레이드 수행$ ssh <workernodeip> # 3. 실제 업그레이드가 수행될 노드에 접근한다.$ apt-get install -y kubelet=1.26.0-00 kubectl=1.26.0-00 # 4. kubelet과 kubectl을 업그레이드 한다.$ systemctl daemon-reload # 5. 데몬들과 kubelet을 재시작한다.$ systemctl restart kubelet # 6. 재시작$ exit # 7. ssh 접속 종료$ kubectl version --short # 8. 버전 체크를 진행한다.