Home 팟 생성 시 컨트롤러 매니저의 역할
Post
Cancel

팟 생성 시 컨트롤러 매니저의 역할

잠깐! k8s 오브젝트란 etcd에 저장되는 Json 객체라는 사실을 아시나요?

헷갈린다면 이 글(Kubernetes 오브젝트는 etcd에 저장되는 JSON 객체) 을 읽어주세요.

컨트롤러 매니저가 팟을 생성하는 과정. 컨트롤러 공식문서

  1. kubectl apply 명령 실행:
    • 사용자가 kubectl apply -f deployment.yaml 명령어를 실행합니다.
    • kubectl은 YAML 파일을 읽고, 이를 JSON 형식으로 변환하여 Kubernetes API 서버에 HTTP 요청으로 보냅니다.
  2. 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
                  }
                ]
              }
            ]
          }
        }
      }
    }
    
  3. 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
                  }
                ]
              }
            ]
          }
        }
      }
    }
    
  4. 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 등)를 통해 연속적으로 이루어지며, 최종적으로 클러스터에 필요한 리소스를 생성하고 관리합니다.

This post is licensed under CC BY 4.0 by the author.

api server가 호출받고 etcd에 저장하는 방식

Kubernetes 오브젝트는 etcd에 저장되는 JSON 객체

Trending Tags