서론
해당 글은 일프로 님의 인프런 강의 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2의 내용을 정리한 글입니다.
해당 글에 사용된 내용, 사진 및 그림은 모두 강의와 강의 자료에 포함된 내용입니다.
전체 개요
![](https://velog.velcdn.com/images/appti/post/a7bdd76e-d5a8-4eda-b968-4daa7508487e/image.png)
- 노드에 기본적으로 설치되는 컴포넌트
- kubectl, kubeadm, kubelet
- kubeadm을 통해 마스터 노드에 클러스터를 생성하면 추가되는 컴포넌트
- Control Plane Component
- kube-scheduler
- control-mgmt
- etcd
- kube-proxy
- kube-apiserver
- kubeadm을 통해 워커 노드에 클러스터를 생성하면 추가되는 컴포넌트
- Worker Component
- kube-proxy
- 해당 영역에 사용자 애플리케이션이 관리됨
- 이전까지 편의를 위해 마스터 노드에 사용자 애플리케이션을 실행시켰지만 마스터 노드가 사용자 애플리케이션으로 인해 죽어버리면 클러스터 전체가 마비되기 때문에 워커 노드에 올려야 함
- Addon Pod
- 쿠버네티스 기능을 확장하기 위해 사용하는 애플리케이션
- metrics-serever
- corends
- calico
- 마스터 노드에 쿠버네티스 인증서 존재
- kubectl이 kube-apiserver로 api를 호출해 etcd에 데이터를 저장하는 방식
- Object
- 하나의 인프라 개념으로 단독 기능 수행
- 네트워크, 볼륨, 환경 변수 등의 요소를 쿠버네티스가 표현하는 방법
- 종류
- Service
- Configmap
- Secret
- Pod
- PVC
- Controller
- 타 Controller나 Object 제어
- Object 관리를 자동화시키기 위한 목적
- 종류
- HPA
- Deployment
- ReplicaSet
- Resource
- Controller와 Object를 한 번에 칭할 때 표현
- 종류
- namespace level resource
- cluster level resource
각 리소스별 동작
Pod & Probe
- kube-apiserver가 파드 생성 API를 받음
- etcd를 통해 데이터 저장
- Deployment 조회
- kube-controller-manager는 etcd 데이터베이스를 모니터링하다가 Deployment가 조회되면 ReplicaSet 생성 API 호출
- ReplicaSet이 생성되면서 Deployment와 Selector로 연결
- kube-controller-manager가 ReplicaSet에게 파드 생성 API 호출
- ReplicaSet이 파드 데이터 생성
7-1. 해당 과정까지 데이터베이스 데이터만 추가된 상황이며, 실제 리소스를 분배해 파드가 생성된 것은 아님
- kube-scheduler가 노드들에 대한 자원을 kube-apiserver를 통해 모니터링하다가 데이터베이스에 파드 데이터가 있는 것을 확인하면 파드를 띄울 노드 스케줄링
8-1. 파드 안에 사용자가 설정해 놓은 내용도 참고해 kubelet이 kube-apiserver를 통해 자신의 노드 정보가 있는 파드를 모니터링하다가 스케줄링된 내용을 발견하고 container runtime에 컨테이너 생성 요청
- containerd가 컨테이너 생성
- probe 설정으로 인해 kubelet이 컨테이너에게 헬스 체크 API를 주기적으로 호출
Service
- nodePort로 서비스 연결
- kubelet이 kube-proxy에게 네트워크 생성 요청
- kube-proxy가 iptables에 설정 추가
3-1. 지정한 포트에 맞는 서비스 이름을 매핑하는 룰 업데이트
- 사용자 요청이 들어온 경우 서비스 이름가 매핑한 포트로 연결
4-1. 해당 작업을 수행하는 주체는 CNI로 설치한 calico
Secret
- Secret이 제공하는 보안
- 컨테이너 내부 파일은 노드 메모리 영역에 마운팅
- 메모리는 전원이 종료되면 지워지는 자원
- 물리적으로 디스크를 변경할 때 관련 데이터가 남지 않아 복구를 할 수 없음
- Secret 내용 수정 시
- 실시간으로 수정 사항이 반영되지는 않음
- kubelet이 모니터링하다가 변경 사항을 발견하면 업데이트
HPA
- 컨테이너의 자원 상황은 Container runtime인 containerd가 알고 있는 상황
- kublet이 CPU와 Memory 정보를 일정 주기(10초)로 체크
- Addon Pod인 metrics-server를 통해 일정 주기(60초)로 사용량을 체크해 kube-controller-manager가 HPA의 임계값과 메트릭을 일정 주기(15초)로 비교하며 스케일링을 발생시킴
- 수집 구간의 타이밍에 따라 부하 발생 시 즉시 스케일링이 될 수도 있고, 최대 85초까지 걸릴 수도 있음
주요 컴포넌트 로그 확인
kubectl api-resources
![](https://velog.velcdn.com/images/appti/post/5dd13857-b113-4d9c-ad48-fb26b9f2a92d/image.png)
- 리소스 이름, 약어, 버전, namespace 리소스 여부, 종류
kubectl get pods -n kube-system
![](https://velog.velcdn.com/images/appti/post/e6ed58fb-9d5f-4aef-b144-e1e54e970f3a/image.png)
kubectl logs -n kube-system etcd-k8s-master
kubectl logs -n kube-system kube-scheduler-k8s-master
kubectl logs -n kube-system kube-apiserver-k8s-master
![](https://velog.velcdn.com/images/appti/post/597636b2-b220-40eb-9f86-b4e2d789b2bb/image.png)
- 정상적으로 컴포넌트가 설치되었다면 크게 의미 있는 로그는 없음
cd /etc/kubernetes
ls
![](https://velog.velcdn.com/images/appti/post/ea23f59a-b813-47e4-bcc6-792edcef55c1/image.png)
- amdin.conf가 인증서
- 쿠버네티스 설치 시 해당 인증서를 /root/.kube/config에 복사
- kubectl이 이 인증서를 참조해 API 호출
ls /etc/kubernetes/manifests
![](https://velog.velcdn.com/images/appti/post/7a61455c-f2bd-49ce-98f0-18c03315eed1/image.png)
ls /var/log/pods/
![](https://velog.velcdn.com/images/appti/post/12a3e6ea-590d-4300-a186-34c2bfab6d23/image.png)
- 다음과 같은 네이밍 룰에 의해 생성
- 전체 파드 로그
/var/log/pods/<namespace_<pod-name>_<uid>/<number>.log
- 특정 파드 로그
/var/log/containers/<pod-name>_<namespace>_<container-name>_<container-id>.log
- 특정 시간대 로그, 특정 문자열 등으로 로그를 탐색할 때 확인
- Loki, Promtail을 사용하므로 로그 파일을 직접 살펴볼 필요는 없음
에러 발생 시 로그 확인
systemctl status kubelet
![](https://velog.velcdn.com/images/appti/post/b647213b-a767-4ee3-a01d-ffbcd100ec09/image.png)
- Active를 통해 현재 상태 확인 가능
- Running이 아닌 경우 restart 혹은 start를 통해 재실행
journalctl -u kubelet | tail -10
![](https://velog.velcdn.com/images/appti/post/4f8a26ea-2703-4cc2-af33-3f7024848558/image.png)
- 로그에서 문제를 확인하고 검색
- 원인을 찾지 못한 경우 재부팅
- 재부팅을 해도 안되고, 계속 문제가 발생하는 경우 VM 및 쿠버네티스 재설치
- 이를 위해 쿠버네티스 설정을 별도로 관리해야 함
kubectl get nodes -o wide
kubectl describe node k8s-master
![](https://velog.velcdn.com/images/appti/post/0a00edc7-17aa-45ed-93ef-078a4dce61ce/image.png)
![](https://velog.velcdn.com/images/appti/post/5f3c6268-2b81-4549-9fa3-deddc1df9523/image.png)
kubectl get pods -A -o wide
![](https://velog.velcdn.com/images/appti/post/88368a9c-dcf3-4620-94bf-b7474cf6c300/image.png)
- 상태가 running이 아닌 것이 있는지 확인
kubectl get events -A
kubectl events -n anotherclass-123 --types=Normal
![](https://velog.velcdn.com/images/appti/post/dbd1d8f1-d4d5-4f27-8206-8a66b3435d02/image.png)
![](https://velog.velcdn.com/images/appti/post/57746b5d-1255-4ac1-8f3d-ba3653999a0e/image.png)
kubectl logs -n anotherclass-123 api-tester-1231-5f488b45b4-7tchq --tail 10
kubectl logs -n anotherclass-123 api-tester-1231-5f488b45b4-7tchq -f
kubectl logs -n anotherclass-123 api-tester-1231-5f488b45b4-7tchq --since=1m
![](https://velog.velcdn.com/images/appti/post/19f77cf9-2493-45d4-9182-127ebb220cc7/image.png)
Service 설정 확인
iptables -t nat -L KUBE-NODEPORTS -n | column -t
![](https://velog.velcdn.com/images/appti/post/83e65a63-f9f2-472b-a55b-aca057b28cd2/image.png)