=================
== The Archive ==
=================

[그림과 실습으로 배우는 쿠버네티스 입문] 9장. 쿠버네티스의 구조와 아키텍처 이해하기

|

cover.jpg

9.1 쿠버네티스의 아키텍처에 대하여

9.2 아키텍처 개요

flowchart LR
    subgraph ControlPlane[컨트롤 플레인]
        APIServer[kube-apiserver]
        Scheduler[kube-scheduler]
        ControllerManager[kube-controller-manager]
        ETCD[(etcd)]
        ETCD --> APIServer
        Scheduler --> APIServer
        ControllerManager --> APIServer
    end

subgraph WorkerNode[워커 노드]
Kubelet[kubelet]
KubeProxy[kube-proxy]
Runtime[컨테이너 런타임]

Kubelet --> Runtime
Runtime --> C1[컨테이너 😊]
Runtime --> C2[컨테이너 😊]
end

kubectlClient[kubectl 클라이언트 😺] --> APIServer
APIServer --> Kubelet
APIServer --> KubeProxy

9.3 쿠버네티스 클러스터의 핵심인 컨트롤 플레인

flowchart LR
    subgraph ControlPlane[컨트롤 플레인]
        APIServer[kube-apiserver]
        Scheduler[kube-scheduler]
        ControllerManager[kube-controller-manager]
        ETCD[(etcd)]
        ETCD --> APIServer
        Scheduler <--> APIServer
        ControllerManager <--> APIServer
    end

    kubectlClient[kubectl 클라이언트 😺] --> APIServer
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
~
❯ k get pod --namespace kube-system                                       
NAME                                         READY   STATUS    RESTARTS      AGE
coredns-66bc5c9577-48nh6                     1/1     Running   1 (24m ago)   22h
coredns-66bc5c9577-vl988                     1/1     Running   1 (24m ago)   22h
etcd-kind-control-plane                      1/1     Running   2 (24m ago)   22h
kindnet-gltkb                                1/1     Running   1 (24m ago)   22h
kube-apiserver-kind-control-plane            1/1     Running   2 (24m ago)   22h
kube-controller-manager-kind-control-plane   1/1     Running   2 (24m ago)   22h
kube-proxy-g5wfv                             1/1     Running   1 (24m ago)   22h
kube-scheduler-kind-control-plane            1/1     Running   2 (24m ago)   22h
metrics-server-6c69b9fbc4-bts9x              1/1     Running   2 (23m ago)   22h
flowchart TB
    K["kubectl 클라이언트 😺"]
    APISERVER["API 서버 (kube-apiserver)"]
    ETCD[("데이터베이스 (etcd)")]
    K -->|" REST "| APISERVER
    APISERVER --> ETCD
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
~
❯ k get pod --v=7 --namespace kube-system 
I1219 03:11:42.026445   11544 loader.go:405] Config loaded from file:  /Users/bossm0n5t3r/.kube/config
I1219 03:11:42.026825   11544 envvar.go:172] "Feature gate default state" feature="InformerResourceVersion" enabled=true
I1219 03:11:42.026835   11544 envvar.go:172] "Feature gate default state" feature="WatchListClient" enabled=true
I1219 03:11:42.026838   11544 envvar.go:172] "Feature gate default state" feature="ClientsAllowCBOR" enabled=false
I1219 03:11:42.026840   11544 envvar.go:172] "Feature gate default state" feature="ClientsPreferCBOR" enabled=false
I1219 03:11:42.026843   11544 envvar.go:172] "Feature gate default state" feature="InOrderInformers" enabled=true
I1219 03:11:42.026846   11544 envvar.go:172] "Feature gate default state" feature="InOrderInformersBatchProcess" enabled=true
I1219 03:11:42.029103   11544 round_trippers.go:527] "Request" verb="GET" url="https://127.0.0.1:50573/api/v1/namespaces/kube-system/pods?limit=500" headers=<
	Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json
	User-Agent: kubectl/v1.35.0 (darwin/arm64) kubernetes/6645204
 >
I1219 03:11:42.055056   11544 round_trippers.go:632] "Response" status="200 OK" milliseconds=25
NAME                                         READY   STATUS    RESTARTS      AGE
coredns-66bc5c9577-48nh6                     1/1     Running   1 (29m ago)   23h
coredns-66bc5c9577-vl988                     1/1     Running   1 (29m ago)   23h
etcd-kind-control-plane                      1/1     Running   2 (29m ago)   23h
kindnet-gltkb                                1/1     Running   1 (29m ago)   23h
kube-apiserver-kind-control-plane            1/1     Running   2 (29m ago)   23h
kube-controller-manager-kind-control-plane   1/1     Running   2 (29m ago)   23h
kube-proxy-g5wfv                             1/1     Running   1 (29m ago)   23h
kube-scheduler-kind-control-plane            1/1     Running   2 (29m ago)   23h
metrics-server-6c69b9fbc4-bts9x              1/1     Running   2 (29m ago)   22h
1
2
3
4
5
I1219 03:11:42.029103   11544 round_trippers.go:527] "Request" verb="GET" url="https://127.0.0.1:50573/api/v1/namespaces/kube-system/pods?limit=500" headers=<
	Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json
	User-Agent: kubectl/v1.35.0 (darwin/arm64) kubernetes/6645204
 >
I1219 03:11:42.055056   11544 round_trippers.go:632] "Response" status="200 OK" milliseconds=25

9.4 애플리케이션 실행을 담당하는 워커 노드

flowchart LR
%% -----------------------------
%% Control Plane
%% -----------------------------
    subgraph CP["컨트롤 플레인"]
        APISERVER["kube-apiserver"]
    end

%% -----------------------------
%% Worker Node
%% -----------------------------
    subgraph WN["워커 노드"]
        direction TB
        KUBELET["kubelet"]
        KUBEPROXY["kube-proxy"]
        RUNTIME["컨테이너 런타임"]
        C1["컨테이너"]
        C2["컨테이너"]
    end

%% 통신/관계
    EXTERNAL --> APISERVER
    KUBELET --> APISERVER
    KUBELET --> RUNTIME
    RUNTIME --> C1
    RUNTIME --> C2
    KUBEPROXY --> APISERVER

9.5 쿠버네티스 클러스터에 접근하기 위한 CLI: kubectl

flowchart LR
    U["사용자"]
    KC["kubectl"]
    APISERVER["kube-apiserver"]
    U -->|" YAML 매니페스트 "| KC
    KC -->|" 요청 (body에 JSON) "| APISERVER
    KC -->|" JSON으로 변환 "| KC

9.6 kubectl apply 이후 컨테이너가 실행될 때까지의 흐름

flowchart LR
    U["사용자"] -->|" 1. kubectl apply -f pod.yaml "| APISERVER["kube-apiserver"]
%% apiserver <-> etcd
    APISERVER <--> ETCD[("etcd")]
%% scheduler watches apiserver and binds node
    SCHED["kube-scheduler"] -->|" 2. Node A에 스케줄링해 줘 "| SCHED
    APISERVER <--> SCHED
%% worker node A
    subgraph NA["Node A"]
        direction TB
        KUBELET["kubelet"]
        RUNTIME["컨테이너 런타임"]
        POD["컨테이너(들) (Pod)"]
        KUBELET -->|" 4. 컨테이너 실행 의뢰 "| RUNTIME --> POD
    end

%% kubelet watches apiserver and creates containers
    APISERVER --> KUBELET
    KUBELET -->|" 3. 오, 우리구나 "| KUBELET

9.7 [만들고, 망가뜨리기] 쿠버네티스는 부서지지 않는다?

9.7.1 준비: 클러스터 구축하기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ kind delete cluster                                   
Deleting cluster "kind" ...
Deleted nodes: ["kind-control-plane"]

~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ kind create cluster -n multinode-nodeport --config kind/multinode-nodeport.yaml --image=kindest/node:v1.29.0
Creating cluster "multinode-nodeport" ...
 ✓ Ensuring node image (kindest/node:v1.29.0) 🖼 
 ✓ Preparing nodes 📦 📦 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
 ✓ Joining worker nodes 🚜 
Set kubectl context to "kind-multinode-nodeport"
You can now use your cluster with:

kubectl cluster-info --context kind-multinode-nodeport

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

~/gitFolders/build-breaking-fixing-kubernetes master ⇡ 1m 12s
❯ k get node
NAME                               STATUS   ROLES           AGE     VERSION
multinode-nodeport-control-plane   Ready    control-plane   2m33s   v1.29.0
multinode-nodeport-worker          Ready    <none>          2m10s   v1.29.0
multinode-nodeport-worker2         Ready    <none>          2m11s   v1.29.0

9.7.2 hello-server 실행하기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ k apply --filename chapter-09/hello-server.yaml --namespace default 
deployment.apps/hello-server created
poddisruptionbudget.policy/hello-server-pdb created
service/hello-server-external created

~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ k get pod --namespace default                                      
NAME                          READY   STATUS    RESTARTS   AGE
hello-server-965f5b86-79744   1/1     Running   0          35s
hello-server-965f5b86-lmzp5   1/1     Running   0          35s
hello-server-965f5b86-qdkmq   1/1     Running   0          35s

~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ k get node multinode-nodeport-worker -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}' 
172.20.0.3

~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ colima ssh
bossm0n5t3r@colima:/Users/bossm0n5t3r/gitFolders/build-breaking-fixing-kubernetes$ curl 172.20.0.3:30599
Hello, world! Let\'s learn Kubernetes!
bossm0n5t3r@colima:/Users/bossm0n5t3r/gitFolders/build-breaking-fixing-kubernetes$ exit
logout

~/gitFolders/build-breaking-fixing-kubernetes master ⇡ 11s
❯ curl localhost:30599
Hello, world! Let's learn Kubernetes!%                                          

9.7.3 컨트롤 플레인 정지하기

1
2
3
4
5
6
~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ docker ps               
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                        NAMES
6be34d255073   kindest/node:v1.29.0   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes   127.0.0.1:30599->30599/tcp   multinode-nodeport-worker
e8b82592147e   kindest/node:v1.29.0   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes   127.0.0.1:51439->6443/tcp    multinode-nodeport-control-plane
9f99cc675625   kindest/node:v1.29.0   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes                                multinode-nodeport-worker2
1
2
3
~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ docker stop e8b82592147e   
e8b82592147e
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
~/gitFolders/build-breaking-fixing-kubernetes master ⇡ 10s
❯ colima ssh                                      
bossm0n5t3r@colima:/Users/bossm0n5t3r/gitFolders/build-breaking-fixing-kubernetes$ curl 172.20.0.3:30599
Hello, world! Let\'s learn Kubernetes!
bossm0n5t3r@colima:/Users/bossm0n5t3r/gitFolders/build-breaking-fixing-kubernetes$ exit
logout

~/gitFolders/build-breaking-fixing-kubernetes master ⇡ 5s
❯ curl localhost:30599
Hello, world! Let's learn Kubernetes!%                                          
1
2
3
~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ k get pod --namespace default
The connection to the server 127.0.0.1:51439 was refused - did you specify the right host or port?
1
2
3
~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ docker start e8b82592147e 
e8b82592147e
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ k get pod --namespace default
NAME                          READY   STATUS    RESTARTS   AGE
hello-server-965f5b86-79744   1/1     Running   0          6m6s
hello-server-965f5b86-lmzp5   1/1     Running   0          6m6s
hello-server-965f5b86-qdkmq   1/1     Running   0          6m6s

~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ kind delete cluster --name multinode-nodeport
Deleting cluster "multinode-nodeport" ...
Deleted nodes: ["multinode-nodeport-worker" "multinode-nodeport-control-plane" "multinode-nodeport-worker2"]

~/gitFolders/build-breaking-fixing-kubernetes master ⇡
❯ kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.35.0) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

~/gitFolders/build-breaking-fixing-kubernetes master ⇡ 48s
❯ k get pod --namespace kube-system
NAME                                         READY   STATUS    RESTARTS   AGE
coredns-7d764666f9-fr2lq                     1/1     Running   0          98s
coredns-7d764666f9-p25qm                     1/1     Running   0          98s
etcd-kind-control-plane                      1/1     Running   0          106s
kindnet-hwcb2                                1/1     Running   0          98s
kube-apiserver-kind-control-plane            1/1     Running   0          106s
kube-controller-manager-kind-control-plane   1/1     Running   0          106s
kube-proxy-lc97v                             1/1     Running   0          98s
kube-scheduler-kind-control-plane            1/1     Running   0          106s

9.8 쿠버네티스를 확장하는 방법

flowchart LR
%% -----------------------------
%% 기본(내장) 리소스: Deployment -> ReplicaSet
%% -----------------------------
    subgraph BuiltIn["기본 리소스"]
        direction TB
        DEP["Deployment"]
        DCTL["Deployment Controller"]
        RS["ReplicaSet"]
        DCTL -->|" watch "| DEP
        DCTL -->|" create "| RS
    end

%% -----------------------------
%% 커스텀 리소스: Otofu -> Pod
%% -----------------------------
    subgraph Custom["커스텀 리소스"]
        direction TB
        OTF["Otofu (Custom Resource)"]
        OCTL["Otofu Controller (Custom Controller)"]
        POD["Pod"]
        OCTL -->|" watch "| OTF
        OCTL -->|" create "| POD
    end

Categories:

Tags: