Kubernetes2

윤석주·2023년 11월 24일
1

docker

목록 보기
10/10

쿠버네티스 Objects

쿠버네티스는 몇 가지 Objects를 가지고 동작합니다. Pod, Deployments, Services, Volume, ... 등이 있죠.

특정한 명령어를 실행하여 이런 Object를 생성할 수 있고, 쿠버네티스는 생성할 때 작성한 코드에 맞춰 Object가 동작할 수 있도록 합니다.

Object 생성 방식은 크게 2가지 입니다.

  • Imperatively (명령적)
  • Declaratively (선언적)

각각의 방식에 따른 차이는 조금 뒤 알아보겠습니다.

사용자는 필요한 기능을 수행할 수 있는 Object를 생성하고, 쿠버네티스는 해당 Object를 이용하여 기능을 수행합니다. 이것이 기본적인 동작 방식이죠.

핵심적인 Object를 살펴보겠습니다.

Pod

Pod는 쿠버네티스에서 가장 작은 단위입니다. 저번 포스팅에서 Pod를 시각적으로 확인했었죠. 쿠버네티스는 Pod를 생성하고, Pod는 컨테이너를 보관합니다. 그리고 쿠버네티스는 Pod와 컨테이너를 관리하죠.

Pod는 하나 또는 그 이상의 컨테이너를 포함할 수 있습니다. 보통은 Pod당 하나의 컨테이너를 사용하는 경우가 많습니다. 하지만 필요하다면 더 많은 컨테이너도 포함할 수 있죠.

Pod는 단순히 컨테이너만 들고 있는 것은 아닙니다. Volume과 같이 컨테이너가 활용할 수 있는 자원을 포함하고 있습니다.

또한 다른 Pod나 Pod 밖과 통신할 수 있습니다. 기본적으로 Pod는 cluster-internal IP를 가지고 있죠. 이를 통해 Pod에 요청을 보낼 수 있고, 컨테이너에도 명령을 할 수 있습니다.

하나의 Pod에 여러 컨테어너가 포함된 경우, 이들은 각각 localhost를 통해 통신할 수 있습니다.

Pod는 두 가지 특성을 가지고 있습니다.

  • Pods are designed to be ephemeral: Kubernetes will start, stop and replace them as needed
  • For Pods to be managed for you, you need a "Controller" (e.g. a "Deployment")

첫 번째 사실은 Pod는 수명이 짧습니다. Pod는 지속되지 않으며 삭제되고 대체될 수 있죠. 따라서 Pod가 없어지는 경우 안에 있던 자원이나 데이터는 소멸됩니다. 이는 버그가 아닌 의도적인 설계입니다.

두 번째는 Pod를 직접 생성하고 관리하며 워커 노드에서 동작시킬 수 있지만, 우리는 쿠버네티스를 통해 자동으로 생성, 제거, 대체 하기를 원합니다. 예를 들면 Pod에서 동작하는 어플리케이션에서 문제가 발생하는 경우, 자동으로 Pod를 삭제하고 새로운 Pod를 생성하고 싶은 니즈가 있죠. 이러한 Pod의 관리를 위해 우리는 Deployment라는 객체가 필요합니다.

Deployment

Deployment 객체는 매우 핵심적인 개념입니다. 우리가 Pod를 직접 생성하고 워커 노드로 전달하는게 아니라, Deployment 객체를 통해 이런 일을 대신 하기 때문입니다.

Deployment는 하나 이상의 Pods를 제어할 수 있습니다. 우리가 원하는 상태를 정의하면, 쿠버네티스는 이 상태를 만들기 위해 동작합니다. 우리가 어떤 파드와 컨테이너가 동작하고, 인스턴스 수 등을 정의하면 쿠버네티스는 이 상태를 만들어주는 것이죠.

Deployment를 사용하면 우리가 이런 상태를 직접 만들지 않고 정의만 한 뒤, 쿠버네티스가 자동으로 이런 상태를 만들도록 할 수 있습니다.

두 번째 장점은 자동으로 배포를 중단하거나 삭제하고, 롤백할 수 있다는 것입니다. 오류가 나는 경우 자동으로 롤백이 되어 우리는 여유롭게... 코드를 수정하고 다시 배포할 수 있는 것이죠.

또 다른 편리한 기능은 Deployments를 확장할 수 있다는 사실입니다. 우리가 Pod수를 늘리거나 줄여야 한다고 전달할 수 있으며, autoscaling을 통해 트래픽이나 CPU 사용률 같은 메트릭을 설정할 수 있습니다. 메트릭이 늘면 Pods가 증가하고, 메트릭이 감소하면 Pods도 줄어드는 식이죠.

따라서 우리는 직접 Pods를 제어하지 않고, Deployments를 생성하고 이를 쿠버네티스 클러스터로 전송하여 쿠버네티스가 이런 일을 자동으로 수행하도록 합니다.

A first Deployment

어플리케이션을 쿠버네티스 클러스터에 배포하기 위한 간단한 Deployment를 명령적으로 생성해봅시다. (minikube를 이용합니다)

kubectl create deployment ${name} --image=${image_name_for_container_in_pod}

이 명령어는 쿠버네티스 클러스터 내부의 마스터 노드로 전달됩니다. 마스터노드의 스케쥴러는 새로운 Pod를 위해 사용할 워커 노드를 찾습니다. 그리고 이렇게 새로 생성된 Pod는 해당 워커 노드로 전달됩니다. 그리고 워커 노드 내부의 kubelet에서 Pod와 컨테이너를 관리합니다.

이후 다음 명령어를 사용하여 deployments, pods 정보를 확인할 수 있습니다.

kubectl get deployments
kubectl get pods

image는 dockerhub같은 곳에 올려놓고 사용하는 것이 좋습니다. 클러스터 내부에서도 image 정보가 필요하기 때문이죠.

다음 명령어를 통해 대시보드를 확인할 수 있습니다.

minikube dashboard

출처

profile
웹 개발을 공부하고 있는 윤석주입니다.

0개의 댓글