잠깐! k8s 오브젝트란 etcd에 저장되는 Json 객체라는 사실을 아시나요?
헷갈린다면 이 글(Kubernetes 오브젝트는 etcd에 저장되는 JSON 객체) 을 읽어주세요.
컨트롤러 매니저가 팟을 생성하는 과정. 컨트롤러 공식문서
kubectl apply
명령 실행:- 사용자가
kubectl apply -f deployment.yaml
명령어를 실행합니다. kubectl
은 YAML 파일을 읽고, 이를 JSON 형식으로 변환하여 Kubernetes API 서버에 HTTP 요청으로 보냅니다.
- 사용자가
- API 서버 처리:
- API 서버는 YAML 스펙을 JSON 형식으로 변환한 후, 이를 Kubernetes 객체로 파싱합니다.
- API 서버는 Deployment 객체를 생성하고, 이를 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 25 26 27 28 29 30 31 32 33 34 35 36
{ "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": "nginx-deployment", "namespace": "default" }, "spec": { "replicas": 3, "selector": { "matchLabels": { "app": "nginx" } }, "template": { "metadata": { "labels": { "app": "nginx" } }, "spec": { "containers": [ { "name": "nginx", "image": "nginx:1.14.2", "ports": [ { "containerPort": 80 } ] } ] } } } }
- Deployment Controller:
- Deployment Controller는 etcd를 모니터링하면서 새로운 Deployment 객체가 생성된 것을 감지합니다.
- Deployment Controller는 Deployment 스펙에 따라 필요한 수의 ReplicaSet을 생성합니다.
- 생성된 ReplicaSet 객체는 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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
{ "apiVersion": "apps/v1", "kind": "ReplicaSet", "metadata": { "name": "nginx-replicaset", "namespace": "default", "ownerReferences": [ { "apiVersion": "apps/v1", "kind": "Deployment", "name": "nginx-deployment", "uid": "12345678-1234-1234-1234-123456789abc" } ] }, "spec": { "replicas": 3, "selector": { "matchLabels": { "app": "nginx" } }, "template": { "metadata": { "labels": { "app": "nginx" } }, "spec": { "containers": [ { "name": "nginx", "image": "nginx:1.14.2", "ports": [ { "containerPort": 80 } ] } ] } } } }
- ReplicaSet Controller:
- ReplicaSet Controller는 etcd를 모니터링하면서 새로운 ReplicaSet 객체가 생성된 것을 감지합니다.
- ReplicaSet Controller는 ReplicaSet의 스펙에 정의된 수의 Pod가 실행 중인지 확인합니다.
- 필요한 수의 Pod가 실행되지 않은 경우, ReplicaSet Controller는 Kubernetes API 서버를 통해 Pod를 생성합니다.
- API 서버는 이 Pod 객체를 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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
{ "apiVersion": "v1", "kind": "Pod", "metadata": { "name": "nginx-pod", "namespace": "default", "labels": { "app": "nginx" } }, "spec": { "containers": [ { "name": "nginx", "image": "nginx:1.14.2", "ports": [ { "containerPort": 80 } ] } ] }, "status": { "phase": "Running", "conditions": [ { "type": "Initialized", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2024-06-21T12:00:00Z" }, { "type": "Ready", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2024-06-21T12:01:00Z" }, { "type": "ContainersReady", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2024-06-21T12:01:00Z" }, { "type": "PodScheduled", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2024-06-21T11:59:00Z" } ], "hostIP": "192.168.1.1", "podIP": "10.1.1.1", "startTime": "2024-06-21T11:59:00Z", "containerStatuses": [ { "name": "nginx", "state": { "running": { "startedAt": "2024-06-21T12:00:00Z" } }, "lastState": {}, "ready": true, "restartCount": 0, "image": "nginx:1.14.2", "imageID": "docker://nginx@sha256:examplehash", "containerID": "docker://examplecontainerid" } ] } }
이 과정을 통해 Kubernetes는 클러스터의 상태를 원하는 대로 유지하고 관리합니다. Deployment에서 시작된 Pod 생성 프로세스는 여러 컨트롤러(Deployment Controller, ReplicaSet Controller 등)를 통해 연속적으로 이루어지며, 최종적으로 클러스터에 필요한 리소스를 생성하고 관리합니다.