[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. 버전 체크를 진행한다.