guswns1659 / guswns1659.github.io

MIT License
1 stars 0 forks source link

24.06.21 k8s 스터디 준비 #9

Closed guswns1659 closed 2 months ago

guswns1659 commented 2 months ago

코멘트로 하나씩 작성

guswns1659 commented 2 months ago

팟을 생성하는 명령어

Kubernetes에서 kubectl을 사용하여 Pod를 생성하는 방법은 다음과 같습니다:

  1. YAML 파일로 생성:

    • pod.yaml 파일 작성:
      apiVersion: v1
      kind: Pod
      metadata:
      name: mypod
      spec:
      containers:
      - name: mycontainer
       image: nginx
       ports:
       - containerPort: 80
    • 생성 명령어:
      kubectl apply -f pod.yaml
  2. 명령어 한 줄로 생성:

    kubectl run mypod --image=nginx --restart=Never

Pod 상태 확인:

kubectl get pods

Pod 상세 정보 확인:

kubectl describe pod mypod
guswns1659 commented 2 months ago

api server가 명령받고 etcd에 저장하는 방식

Kubernetes API 서버가 Pod 생성 명령을 받으면, 이 명령을 etcd에 저장하는 과정은 다음과 같은 일련의 단계를 거칩니다. 아래는 이 과정을 설명하는 예시입니다.

  1. kubectl 명령 실행:

    kubectl apply -f pod.yaml
  2. API 서버가 명령을 수신:

    • kubectl 명령을 실행하면, 클라이언트는 API 서버에 HTTP 요청을 보냅니다.
    • 예: POST /api/v1/namespaces/default/pods
  3. API 서버가 요청을 처리:

    • API 서버는 요청을 수신하고, 요청의 유효성을 검사한 후 etcd에 저장할 준비를 합니다.
  4. etcd에 데이터 저장:

    • 유효성 검사가 완료되면, API 서버는 Pod 정의를 etcd에 저장합니다.
    • 저장되는 데이터의 예시는 다음과 같습니다.
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "mypod",
    "namespace": "default",
    "uid": "12345678-1234-1234-1234-123456789abc",
    "resourceVersion": "12345",
    "creationTimestamp": "2024-06-21T12:00:00Z"
  },
  "spec": {
    "containers": [
      {
        "name": "mycontainer",
        "image": "nginx",
        "ports": [
          {
            "containerPort": 80
          }
        ]
      }
    ]
  },
  "status": {
    "phase": "Pending"
  }
}
  1. etcd의 저장 구조:

    • etcd는 위와 같은 JSON 데이터를 key-value 형식으로 저장합니다.
    • 예를 들어, 저장되는 key는 /registry/pods/default/mypod와 같은 형식이 됩니다.
  2. API 서버의 응답:

    • API 서버는 etcd에 성공적으로 저장된 후 클라이언트에게 응답을 반환합니다.
    • 응답 예시:
      {
      "kind": "Pod",
      "apiVersion": "v1",
      "metadata": {
       "name": "mypod",
       "namespace": "default",
       "uid": "12345678-1234-1234-1234-123456789abc",
       "resourceVersion": "12345",
       "creationTimestamp": "2024-06-21T12:00:00Z"
      },
      "spec": {
       "containers": [
         {
           "name": "mycontainer",
           "image": "nginx",
           "ports": [
             {
               "containerPort": 80
             }
           ]
         }
       ]
      },
      "status": {
       "phase": "Pending"
      }
      }

이러한 과정으로 API 서버는 kubectl 명령을 통해 받은 Pod 생성 요청을 처리하고, 해당 정보를 etcd에 저장하게 됩니다. etcd는 Kubernetes 클러스터의 모든 상태 정보를 저장하는 중앙 저장소 역할을 합니다.

etcd 키의 구조화

Kubernetes에서 etcd의 key가 /registry/로 시작하는 이유는 Kubernetes의 리소스를 구조화하고 네임스페이스와 다른 리소스 타입을 구분하기 위해 사용됩니다. 이를 통해 Kubernetes는 다양한 리소스 유형을 체계적으로 관리할 수 있습니다.

  1. 키 구조화 및 조직화:

    • Kubernetes는 여러 유형의 리소스를 관리합니다(Pods, Services, ConfigMaps 등). 모든 리소스는 etcd에 저장되며, 이를 효과적으로 조직화하기 위해 특정 경로 구조를 사용합니다.
    • /registry/ 접두사는 Kubernetes 리소스를 구분하는 데 사용됩니다.
  2. 예시:

    • /registry/pods/default/mypod: 기본 네임스페이스에 있는 mypod Pod의 정보.
    • /registry/services/default/myservice: 기본 네임스페이스에 있는 myservice 서비스의 정보.
    • /registry/namespaces/default: 기본 네임스페이스 자체의 정보.
  3. 효율적인 검색 및 관리:

    • 이러한 경로 구조를 사용하면 etcd에서 특정 유형의 리소스를 쉽게 검색하고 관리할 수 있습니다.
    • 예를 들어, 모든 Pod를 검색하려면 /registry/pods/ 아래의 모든 키를 검색하면 됩니다.
  4. 네임스페이스와 리소스 타입 분리:

    • 각 네임스페이스와 리소스 타입별로 경로를 구분하여, 네임스페이스나 리소스 타입에 따른 데이터 충돌을 방지할 수 있습니다.

이러한 구조화된 접근 방식을 통해 Kubernetes는 효율적으로 리소스를 관리하고, 확장 가능한 클러스터 관리 기능을 제공합니다.

guswns1659 commented 2 months ago

kubectl이 api server로 HTTP 요청을 어떻게 만드는지

kubectl이 Kubernetes API 서버와 통신하기 위해 HTTP 요청을 생성하는 과정은 다음과 같습니다:

  1. kubectl 명령 실행:

    • 사용자가 터미널에서 kubectl 명령어를 실행합니다. 예를 들어, kubectl apply -f pod.yaml 명령을 실행합니다.
  2. API 서버와의 통신 설정:

    • kubectl~/.kube/config 파일에서 API 서버의 주소와 인증 정보를 읽어옵니다. 이 파일에는 클러스터 정보, 사용자 인증 정보, 컨텍스트 등이 포함됩니다.
  3. HTTP 요청 생성:

    • kubectl은 사용자가 입력한 명령을 바탕으로 HTTP(S) 요청을 생성합니다. 예를 들어, kubectl apply -f pod.yaml 명령은 YAML 파일을 읽고, API 서버에 POST 요청을 보냅니다.
    • 이 요청에는 필요한 인증 정보(예: 인증 토큰, 인증서 등)가 포함됩니다.
  4. API 서버로 요청 전송:

    • 생성된 HTTP(S) 요청이 API 서버로 전송됩니다. 이 요청은 Kubernetes API 서버에서 지정된 리소스 경로에 도달합니다.
  5. API 서버의 요청 처리:

    • API 서버는 요청을 수신하고, 요청의 유효성을 검사한 후, etcd에 데이터를 저장하거나 필요한 작업을 수행합니다.
  6. 응답 반환:

    • API 서버는 요청 처리 결과를 HTTP 응답으로 반환합니다. kubectl은 이 응답을 받아 사용자에게 출력합니다.

예시:

  1. kubectl 명령어:

    kubectl apply -f pod.yaml
  2. ~/.kube/config 파일 예시:

    apiVersion: v1
    clusters:
    - cluster:
       certificate-authority: /path/to/ca.crt
       server: https://example.com:6443
     name: my-cluster
    contexts:
    - context:
       cluster: my-cluster
       user: my-user
       namespace: default
     name: my-context
    current-context: my-context
    kind: Config
    preferences: {}
    users:
    - name: my-user
     user:
       client-certificate: /path/to/client.crt
       client-key: /path/to/client.key
  3. HTTP 요청 생성 및 전송:

    • kubectl은 위 설정 파일을 사용하여 API 서버의 주소(https://example.com:6443)와 인증 정보를 가져와 HTTP 요청을 생성합니다.
    • POST /api/v1/namespaces/default/pods와 같은 요청을 생성하여 Pod를 생성하도록 API 서버에 보냅니다.

이러한 과정을 통해 kubectl이 HTTP 요청을 생성하고 API 서버와 통신하는 것을 알 수 있습니다. kubectl의 내부 코드는 Kubernetes의 client-go 라이브러리를 사용하여 HTTP 요청을 생성하고 처리합니다. 해당 코드는 Kubernetes의 GitHub 리포지토리에서 확인할 수 있습니다.

guswns1659 commented 2 months ago

Kubernetes에서 kubectl apply 명령어로부터 ReplicaSet Controller가 Pod를 생성하는 과정

Kubernetes에서 kubectl apply -f deployment.yaml 명령어를 실행하면, Deployment 객체가 생성되고, 이어서 ReplicaSet Controller가 Pod를 생성하는 일련의 과정을 다음과 같이 요약할 수 있습니다:

  1. kubectl apply 명령 실행:

    • 사용자가 kubectl apply -f deployment.yaml 명령어를 실행합니다.
    • kubectl은 YAML 파일을 읽고, 이를 JSON 형식으로 변환하여 Kubernetes API 서버에 HTTP 요청으로 보냅니다.
  2. API 서버 처리:

    • API 서버는 YAML 스펙을 JSON 형식으로 변환한 후, 이를 Kubernetes 객체로 파싱합니다.
    • API 서버는 Deployment 객체를 생성하고, 이를 etcd에 저장합니다. 여기서 etcd는 클러스터 상태를 저장하는 분산 키-값 저장소입니다.
  3. Deployment Controller:

    • Deployment Controller는 etcd를 모니터링하면서 새로운 Deployment 객체가 생성된 것을 감지합니다.
    • Deployment Controller는 Deployment 스펙에 따라 필요한 수의 ReplicaSet을 생성합니다.
    • 생성된 ReplicaSet 객체는 etcd에 저장됩니다.
  4. ReplicaSet Controller:

    • ReplicaSet Controller는 etcd를 모니터링하면서 새로운 ReplicaSet 객체가 생성된 것을 감지합니다.
    • ReplicaSet Controller는 ReplicaSet의 스펙에 정의된 수의 Pod가 실행 중인지 확인합니다.
    • 필요한 수의 Pod가 실행되지 않은 경우, ReplicaSet Controller는 Kubernetes API 서버를 통해 Pod를 생성합니다.
    • API 서버는 이 Pod 객체를 etcd에 저장합니다.

이 과정을 통해 Kubernetes는 클러스터의 상태를 원하는 대로 유지하고 관리합니다.

guswns1659 commented 2 months ago

Kubernetes에서 스케줄러부터 kubelet까지의 과정

Kubernetes에서 스케줄러와 kubelet이 Pod를 생성하고 실행하는 전체 과정을 정리하면 다음과 같습니다:

1. 스케줄러 (Scheduler)의 역할

  1. Pod 객체 감지:

    • ReplicaSet Controller에 의해 생성된 새로운 Pod 객체가 etcd에 저장됩니다.
    • 스케줄러는 etcd에서 새로 생성된 Pending 상태의 Pod 객체를 감지합니다.
  2. 노드 선택:

    • 스케줄러는 클러스터 내의 모든 노드를 검토합니다.
    • 리소스 요구사항(예: CPU, 메모리), 노드의 상태, Pod의 어피니티 및 안티-어피니티 규칙 등을 기반으로 적절한 노드를 선택합니다.
    • 스케줄러는 선택된 노드에 Pod를 배치하기 위한 결정을 내립니다【74†source】【75†source】.
  3. Pod 스케줄링:

    • 스케줄러는 선택된 노드 정보를 Pod 객체에 추가하고, 이를 etcd에 업데이트합니다.
    • 이 과정에서 Pod 객체는 특정 노드에 할당된 상태가 됩니다【76†source】【77†source】.

2. kubelet의 역할

  1. Pod 감지 및 다운로드:

    • 각 노드에서 실행 중인 kubelet은 자신이 담당하는 노드에 할당된 새로운 Pod 객체를 감지합니다.
    • kubelet은 API 서버를 통해 etcd에서 해당 Pod의 정보를 가져옵니다.
  2. 컨테이너 이미지 다운로드:

    • kubelet은 Pod 스펙에 정의된 컨테이너 이미지를 컨테이너 런타임(예: Docker, containerd)을 통해 다운로드합니다.
    • 이미지가 이미 노드에 존재하는 경우, 이를 다시 다운로드하지 않고 기존 이미지를 사용합니다.
  3. Pod 생성:

    • kubelet은 Pod 스펙에 정의된 대로 컨테이너를 생성하고 실행합니다.
    • 네트워킹 설정, 볼륨 마운트, 환경 변수 설정 등을 포함한 모든 필요한 설정을 적용합니다.
  4. 상태 보고:

    • kubelet은 Pod의 상태를 주기적으로 API 서버에 보고합니다.
    • Pod의 상태가 Pending에서 Running으로 변경됩니다.
    • 만약 Pod 실행 중 문제가 발생하면, kubelet은 이를 감지하고 API 서버에 상태를 보고합니다【74†source】【75†source】【76†source】.

요약된 과정

  1. 스케줄러:

    • 새로운 Pending 상태의 Pod 객체를 감지.
    • 클러스터 내의 적절한 노드를 선택하여 Pod 객체에 할당.
    • Pod 객체를 etcd에 업데이트하여 특정 노드에 할당된 상태로 변경.
  2. kubelet:

    • 할당된 노드에서 새로운 Pod 객체를 감지.
    • Pod 스펙에 정의된 컨테이너 이미지를 다운로드하고, 컨테이너를 생성 및 실행.
    • Pod의 상태를 주기적으로 API 서버에 보고하여 Pending 상태에서 Running 상태로 변경.

이 과정을 통해 Kubernetes는 클러스터의 상태를 효율적으로 관리하고, Pod가 적절한 노드에서 실행될 수 있도록 합니다.


Kubernetes Scheduler | Kubernetes Documentation​ (Production-Grade Container Orchestration)​ How the Kubernetes scheduler works | Opensource.com​ (Opensource.com)​ Kubernetes Cluster & Process Flow of a POD creation - Blogs, Ideas, Train of Thoughts​ (Blogs, Ideas, Train of Thoughts)