개요
본 post는 실무에 급히 k8s를 배워서 써먹기 위한 사람을 위한 post 입니다.
k8s 뭔가
container를 여러 node(컴퓨터)배포하여 맘대로 관리 하기 위한 도구 입니다.
전문용어로 k8s를 container ochestration(=container 지휘자) 도구 라고 합니다.
* container : 특정 program를 실행 하기 위해 program과 실행 환경 까지 함께 묶어 놓은 패키지
* node : 개별 컴퓨터 (있어보이게 "개별 서버")
k8s 목적
- 무중단 service
- 빠른 sevice 배포
- 장애 최소화
k8s의 동작 핵심
- 끊임 없는 설정의 동기화
- k8s는 system에 배포된 object를 이용하여 k8s system 자체를 배포된 object의 상태에 맞게 계속 동기화 합니다.
k8s의 구성
알아야 하는 이유?
모르면 troubleshooting이 안됨.
실제로 제가 급해서 설정 파일만 보고 썼다가 개고생함.
k8s component
* 출처 : https://kubernetes.io/docs/concepts/overview/components/
Control Plane Components
Controle Plan의 주요 모듈에 대하여 알아보겠습니다.
API Server
정의
- k8s의 모든 동작은 API Server에 요청하여 처리 합니다.
- API Server만이 유일하게 Etcd에 접근 가능 합니다.
역활
(1) authenticate user
(2) Validate Request
(3) Retrieve data
(4) Update ETCD
(5) kube-controller-manager, scheduler, kublet uses the api server to perform updates in the cluster
in their respective areas
yaml 위치
/etc/kubernetes/manifests/kube-apiserver.yaml
etcd
역활
- key-vaule 형태로 데이터를 저장하는 database입니다.
- k8s에서는 cluster내의 모든 데이터를 key-vaule 형식태로 저장하는데 사용 됩니다.
개별 설치
https://etcd.io/docs/v3.2/install/
key-point
- etc의 2개의 버전이 존재합니다.
(1) etcd를 제어하는 etcctl 의 버전
(2) etcd의 API 버전
kube-controller manager
역활
- k8s의 세부 동작에 필요한 모든것을 처리합니다.
- 참고로, kube-controller manager는 한개의 파일로 되어 있습니다.
Controller 설정 파일
cat /etc/kubernetes/manifests/kube-controller-manager.yaml
Controller 종류
종류 | 역활 |
Node controller |
- node를 상태를 모니터링하고 필요한 조치를 합니다. - kube-apiserver를 통해서 5초에 한번씩 node의 상태를 확인합니다. - node로 부터 heart beat를 못받으면 1. 40초간 대기, 그후에 unreachablel로 변경 2. 5분간 대기후에 할항된 Pod를 모두 제거 3. Pod가 replicaset일 경우 정상적인 node에 다시 할당 합니다. |
Replication Controller | - pod에대해서 replicaset에 정의된 개수 만큼 node에 실행되는 것을 보장 합니다. |
Job controller | - 일회성 작업을 실행하는 Pod를 관리(실행 ~ 종료)합니다. |
EndpointSlice controller | - Services와 Pods의 연결을 담당하는 EndpointSlice 오브젝트를 공급함 - Kubernetes의 EndpointSlice API는 Kubernetes 클러스터 내에서 네트워크 끝점을 추적하는 방법을 제공합니다. EndpointSlices는 Endpoints에 대한 보다 확장 가능하고 확장 가능한 대안을 제공합니다. |
ServiceAccount controller | - 새 네임스페이스에 대한 기본 ServiceAccounts를 만듭니다. |
Scheduler
역활
- Pod를 어느 node에 위차 할것 인지 결정만을 합니다.
실제 해당 node에 pod를 생성하지 않습니다.
- 셀제 pod를 생성하는 것은 kubelet이 합니다.
동작 방식
- 특정한 기준에 따라 pod를 node에 할당 합니다
예를들면 resource requirements, limits, taints and tolerations, node selectors, affinity rules 등이 있습니다.
cloud-controller-manager
역활
- cloud 별 컨트롤 로직을 포함하는 쿠버네티스 컨트롤 플레인 컴포넌트이다.
- clound-controller-manager를 통해 cluster를 cloud provier의 API에 연결하고, 해당 cloud platform과 상호 작용하는 compoment 와 k8s cluster만 상호 작용하는 component를 구분할 수 있게 해 준다.
controller 종류
종류 | 역활 |
Node controller | - 노드가 응답을 멈춘 후 클라우드 상에서 삭제되었는지 판별하기 위해 클라우드 제공 사업자에게 확인하는 것 |
Route controller | - 기본 클라우드 인프라에 경로를 구성하는 것 |
Service controller | - cloud provider가 제공하는 load balancer를 생성, 업데이트 그리고 삭제하는 것 |
Node Components
kubelet
역활
- node를 k8s cluster에 등록 합니다.
- node에 pod가 실행 되는 것을 보증 합니다,.
- kubelet은 다양한 메커니즘을 통해 제공되는 PodSpec 세트를 가져오고 해당 PodSpec에 설명된 컨테이너가 실행되고 정상 상태인지 확인합니다.
동작 방식
- kube-scheduler가 kube-apiserver를 통해서 kubelet에 pod를 생성하라고 명령을 하면 kubelet은 container runtime을 이용해서 pod를 생성 합니다.
- kubelet은 Pod와 그 안에 있는 컨테이너의 상태를 계속 모니터링하고 적시에 kube-apiserver에 보고합니다.
유의 사항
- kubelet은 Kubernetes에서 생성되지 않은 컨테이너를 관리하지 않습니다.
- kubelet은 kubeadm을 통해서 설치 되지 않고 따로 설치해 주어야 합니다.
kube-proxy
역활
- kube-proxy는 Pod간의 Networking을 iptables나 ipvs를 사용하여 구현 합니다.
- 이렇게 networking을 구현한 것을 Kubernetes Service 라고 합니다.
- 그래서 kube-proxy는 노드에서 네트워크 규칙을 관리합니다.
container runtime
- Pod내에서 동작하는 container를 구동시키는 런타임 입니다.
- 현재는 Dockershim(1.24 부터 미지원) , containerd, CRI-O, Mirantis Container Runtime
Pod 배포 전체 과정 요약
요청 생성
kublet을 이용하여 Kubernetes API 서버에 Pod 생성 요청이 전달되면, API 서버는 이 요청을 검증하고 요청한 정보를 etcd에 저장합니다.
scheduling
Scheduler는 새 Pod에 대한 정보를 받고, 클러스터의 현재 상태를 고려하여 가장 적합한 노드를 결정합니다. Scheduler는 이 결정을 Kubernetes API 서버를 통해 전달합니다.
Kubelet 동작
각 노드에는 Kubelet이라는 에이전트가 실행되며, Kubelet은 API 서버를 통해 상태를 주기적으로 조회합니다. Kubelet은 새 Pod가 자신의 노드에 scheduling되었다는 정보를 받으면, 해당 Pod의 실행을 시작합니다.
container runtime 동작
Kubelet은 Pod의 컨테이너를 실행하기 위해 컨테이너 런타임(예: Docker, containerd)을 호출합니다. 컨테이너 런타임은 Pod의 각 컨테이너에 대해 이미지를 가져오고(필요한 경우), 컨테이너를 실행하고, 네트워크를 설정하며, 필요한 리소스를 할당합니다.
cAdvisor와 Metrics Server 동작
Kubelet은 cAdvisor를 통해 컨테이너의 리소스 사용량을 모니터링하고, 이 정보를 Metrics Server에 보고합니다. Metrics Server는 이 정보를 API 서버에 제공하여, Kubernetes의 다른 부분이 이 정보를 사용할 수 있도록 합니다.
serivce와 Ingress 동작
service는 Pod에 대한 네트워크 접근을 제어하며, Ingress는 클러스터 외부에서의 접근을 제어합니다. 이들은 각각 kube-proxy와 Ingress 컨트롤러에 의해 관리됩니다. 새 Pod가 생성되면, 이들 컨트롤러는 필요한 네트워크 규칙을 업데이트합니다.
Pod 생명주기 관리
Kubelet은 Pod의 상태를 계속해서 모니터링하고, Pod가 종료되거나 실패할 경우에는 적절한 조치를 취합니다. 예를 들어, 재시작 정책에 따라서 컨테이너를 재시작하거나, Pod를 다른 노드에 스케줄링할 수 있습니다.
설치 가이드
https://doitnow-man.tistory.com/entry/%EA%B8%89%ED%95%9C-k8s-1-k8s-%EC%84%A4%EC%B9%98
명령어 자동 완성
https://www.lesstif.com/container/bash-kubectl-129008715.html
Next Post
'Cloud > k8s-CKA' 카테고리의 다른 글
[CKA] 6. Object를 관리하는 방법 3가지 (0) | 2023.01.29 |
---|---|
[CKA] 5. namespace (0) | 2023.01.24 |
[CKA] 4. Service (0) | 2023.01.20 |
[CKA] 3. ReplicaSet & Deployments (0) | 2023.01.11 |
[CKA] 2. pod 란 (0) | 2022.11.26 |