Kubernetes 개념 진짜 진짜 x3 핵심만

정재경·2025년 1월 20일
1
post-thumbnail

새로운 회사에 와서 이제는 진짜 드디어 Kubernetes를 공부할 때가 왔다.
사실 코프링도 대기중임 만관부~

누구한테 도움될까

  • Docker는 뭔지 알고 쓸줄도 안다.
  • Kubernetes가 k8s인줄은 안다.
  • k8s가 대충 컨테이너 관리하는 뭐시깽이인줄은 안다.
  • 그러나 k8s를 굳이 쓸 이유가 없어서 써보지 않았다.
  • k8s를 곧 쓰게 될 예정이다.

→ 이게 나여서 진짜 핵심만 개념 공부를 해보았다.

공부 Reference


본론

k8s가 뭔데~

그냥 한마디로 컨테이너들을 프로덕션 환경에서 안정적으로 배포하기 위한 툴이라고 생각하자.
갑자기 문제가 생겨서 어떤 앱이 죽거나, 서버가 다운되거나.. 등등의 이슈가 생겨도 알아서 서버를 다시 살리고, 다른 앱을 새로 키는 등의 관리를 하는 걸 자동으로 해주는 툴이다.

k8s의 요소

k8s에는 크게 세가지 요소가 있다.

  1. Cluster
  2. Pod
  3. Node

공식문서의 이 그림이 하나의 Cluster를 나타낸다.

Cluster

k8s가 관리하는 가장 큰 단위를 Cluster 라 한다. 유저가 설정한 Cluster 안에서 k8s는 자동으로 자원을 관리하고, 죽은 앱들을 살리는 작업들을 한다.

Pod

Pod는 k8s가 컨테이너를 관리하고 실행하는 논리적인 단위이다.

지선생님이 주신 예시 pod세팅 yaml 파일을 간단히 봐보자.
여기에 있는 모든 세팅을 실제로 다 사용할 가능성은 적어보이긴 한다.

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    app: my-app
    tier: backend
spec:
  containers:
  - name: my-container
    image: nginx:latest
    ports:
    - containerPort: 80
    resources:
      requests:               # Minimum resource requirements
        memory: "64Mi"
        cpu: "250m"
      limits:                 # Maximum resources the container can use
        memory: "128Mi"
        cpu: "500m"
    env:                      # Environment variables
    - name: ENVIRONMENT
      value: production
    volumeMounts:             # Mounting storage volumes
    - name: config-volume
      mountPath: /etc/config
  volumes:                    # Declaring storage volumes
  - name: config-volume
    configMap:
      name: my-config-map
  nodeSelector:               # Run pod on nodes with specific labels
    disktype: ssd

  restartPolicy: Always        # Pod restart policy (Always, OnFailure, Never)
  securityContext:             # Security settings for the pod
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  dnsPolicy: ClusterFirst       # DNS policy for the pod (ClusterFirst, Default)

우리는 개념을 핵심만 배우는 것이기 때문에, 전부는 말고 슬쩍만 보면

  • image: nginx-latest → 띄우고 싶은 컨테이너 이미지를 설정한다

  • resources:
        requests:
            memory: "64Mi"
            cpu: "250m"
        limits:
            memory: "128Mi"
            cpu: "500m"

    → 이 Pod에 할당할 최대와 최소 CPU및 메모리 할당 정보다

  • restartPolicy: Always → 이 Pod이 죽으면 어떻게 할껀지에 대한 설정이다.

이렇게 알 수 있듯이, 어떤 컨테이너를 k8s Cluster안에서 어떤 세팅으로 실행하고 관리하게 할 것인지에 대한 정보를 갖는 논리적인 단위를 Pod이라 한다.

Node

Node는 기본적으로는 Pod들이 실제로 실행되어 동작하는 물리/논리 서버의 컴퓨팅 단위이다.
k8s의 Node에는 크게 두가지가 있다.

  1. Master Node (혹은 Control Plane)
  2. Worker Node

하나씩 구성을 알아보자

Master Node (혹은 Control Plane)

이름에서 알 수 있듯이 Worker Node들을 관리하는 Node이다.
하지만 위에서 말했듯, Node는 Pod들이 실행되는 컴퓨팅 단위이다.
따라서 Master Node에는 k8s가 클러스터를 관리하기 위해 구현해놓은 구현체들이 Pod의 단위로 실행되고 있다. 그래서 Control Plane이라고도 한다.

이 구현체들은 다음과 같다.

  • kube-apiserver
    • k8s Cluster를 관리할 수 있는 HTTP API가 실행되는 서버
  • etcd
    • k8s Cluster의 각종 세팅이나 정보를 저장할 수 있는 Key-Value 스토어
  • kube-scheduler
    • 생성된 Pod들이 아직 Node에 배정됐나 안됐나 확인해서 안됐으면 배정하는 스케쥴러
  • kube-controller-manager
    • controller 라는 프로세스 들을 실행하는 곳.
    • controller 는 k8s Cluster를 전반적으로 관리하는 loop
    • 어떤 Pod이 죽으면 다시 살린다던지, 등록한 크론잡들 실행한다던지 등등..

Worker Node

마찬가지로 이름에서 알 수 있듯이, 실제 일을 하는 Node, 우리의 경우에는 우리가 지정한 Pod들이 실행되는 컴퓨팅 단위이다. 이 또한 컨테이너를 실행하고 관리하기 위한 구현체들이 실행된다.

  • kubelet
    • 각 Node안에서 Pod들을 실행하고, 관리하는 프로세스
  • container-runtime
    • 컨테이너를 실행하는 런타임
    • 통상적으로는 그냥 Docker일듯. containerd 같은 것도 가능하지만.. 굳이?

의문

여기까지 개념을 잡았을 때 처음에는 이런 의문이 들었다.

Master Node의 kube-scheduler에서는 Pod들이 Node에 배정이 됐나 안됐나를 확인해서 배정한다고 했는데, Pod(컨테이너)은 애초에 Node(컴퓨팅 단위)가 없으면 실행할 수 없는 것 아니야?

약간 운영체제식 질문으로 풀어보면 프로그램이 컴퓨터 없이 어떻게 실행돼? 라는 생각이 들었다.

그러나 잘 읽어보면 Pod는 컨테이너를 실행하기 위한 k8s의 논리적인 단위이기 때문에 실행인 상태일수도, 실행되지 않은 상태일수도 있는 것이다.

이 말은, 위의 질문에 비유에 대입해보면 다음과 같은 느낌이다.

k8s운영체제
Pod프로그램
컨테이너 인스턴스실행 중인 프로세스
NodeCPU

프로그램이 실행중일수도, 잠깐 스케쥴링돼 대기중일수도 있으니까.. 이 비유가 적절한진 모르겠지만 나는 이렇게 이해했다.

profile
You'll see what I've become.

0개의 댓글

관련 채용 정보