본문 바로가기
데이터엔지니어링/K8s on Cloud

[4장] 쿠버네티스 오브젝트 다루기

by 잼있는잼니 2023. 6. 20.

디플로이먼트

 

만약 컨테이너가 종료가 된다면, 터미널에 접속하여 docker container run 명령어로 컨테이너를 다시 시작해줘야하는 불편함이 있다. 이런 방식은 불편하며, 지속적으로 컨테이너가 실행 중인지 혹은 정지되었다면 다시 실행해야하는지 관리하는 관리프로그램이 필요하다. 전통적으로 systemd, runit, supervisord 같은 도구를 사용하고, 쿠버네티스의 경우 디플로이먼트라는 관리자 기능을 제공한다.


관리와 스케줄링

 

쿠버네티스는 각 프로그램을 관리하기 위해 디플로이먼트 오브젝트를 생성하는데, 디플로이먼트 오브젝트에는 해당 프로그램에 대한 정보가 기록된다.

쿠버네티스의 오브젝티브인 컨트롤러는 디플로이먼트 리소스를 관리하며, 컨트롤러는 리소스가 존재하고 작동하는지 확인한다.

컨트롤러는 레플리카가 부족하면 생성하고, 너무 많으면 초과 레플리카를 종료한다. 실제로 디플로이먼트는 레플리카를 직접 관리하지 않고, 레플리카셋이라는 오브젝트를 자동으로 생성해서 처리하게 한다.


컨테이너 재시작하기

 

컨테이너가 작업을 마치고 종료되면, 디플로이먼트는 이 컨테이너를 재시작한다. 컨테이너에 크래시가 발생하거나, 시그널 이벤트가 kubectl로 컨테이너를 종료하는 경우에도 디플로이먼트는 재시작을 한다.

 

쿠버네티스는 재시작을 기본 작동으로 수행한다. 다만, 이런 재시작 정책을 수정할 수 있으나, 항상 재시작 옵션은 기본설정이다.

 

따라서 디플로이먼트의 역할은 관련된 컨테이너를 감시하고 지정된 수의 컨테이너가 항상 실행 중인지 확인하는 것이며,컨테이너 수가 부족하다면 증가를, 많으면 감소시킨다.


디플로이먼트 조회하기

 

kubectl get pods

두 명령어를 통해 확인이 가능함

특정 디플로이먼트의 자세한 정보를 확인하고 싶다면, 다음 명령어를 입력하자.

쿠버네티스가 컨테이너를 실행하는 정보가 들어 있다.


파드

 

파드는 하나 이상의 컨테이너 그룹으로 구성된 쿠버네티스 오브젝트다.

디플로이먼트에서 개별 컨테이너를 직접 관리하지 않는 이유!?

컨테이너의 집합은 때때로 함께 스케줄링되고, 동일 노드에서 실행되며, 로컬로 통신하거나 저장 공간을 공유해야 하기 때문이다.

 

실습시 이미지 스펙은 docker_id/hellotest가 되며,포트 번호를 포함한 모든 정보는 디플로이먼트가 파드를 시작하고 유지하는데 사용한다.

중요한 것은 kubectl run 명령이 실제로 파드를 직접 생성하지 않는다는 점, 대신 디플로이먼트가 생성되고 디플로이먼트가 파드를 실행한다는 것( 파드는 hellotest 컨테이너와 함께 실행 되야한다. )


레플리카셋

 

디플로이먼트가 파드를 시작하지만, 파드를 직접 관리하지 않는다.

파드 관리는 레플리카셋 오브젝트가 수행한다.

레플리카셋은 동일한 파드 집합이나 레플리카들을 관리한다.

디플로이먼트는 레플리카셋을 관리하며 레플리카들이 애플리케이션의 새로운 버전을 롤아웃하여 업데이트할 때의 작동을 제어한다. 디플로이먼트를 업데이트하면 새 파드를 관리하기 위한 새로운 레플리카셋이 생성되고, 업데이트가 완료되면 이전 레플리카셋과 파드가 종료된다.

 

디플로이먼트가 있으면 레플리카셋을 직접 다룰 일이 없다고 한다.


의도한 상태 유지하기

 

쿠버네티스 컨트롤러가 의도한 상태와 실제 상태를 일치시키기 위한 조정 작업이 영원히 반복되는 이 과정을 조정 루프라고 부른다. 여기서 의도한 상태란, 각 리소스가 지정한 상태라 볼 수 있다.

 

파드가 실행 중인지 확인하기

파드 삭제하기

이렇게 하면 파드가 모두 삭제가 되었다.

책에선 새로운 파드를 실행한다고 했는데, 왜 나는 지워졌을까??

 


쿠버네티스 스케줄러

 

디플로이먼트가 파드를 생성하고 쿠버네티스는 요청된 파드를 실행한다!라고 말했다.

쿠버네티스 스케줄러는 이 과정을 책임지는 컴포넌트다.

 

스케줄러의 역할은 대기열에서 스케줄링되지 않은 파드를 찾아 배치하고 실행할 노드를 찾는것이다.

이때, 노드를 찾기 위해 파드 리소스 요청 및 몇 가지 사항으로 기준을 삼는다고 한다.

 

위에서 파드를 삭제했을 때 상태 변화를 감지하고 새로운 파드로 교체한 것은 kubelet라 한다.


 YAML 형식의 리소스 매니페스트

 

kubectl run 명령어를 이용해 디플로이먼트를 생성하는 것은 유용하나 제한적이다.

쿠버네티스는 근본적으로 선언형 시스템이기 때문에 실제 상태와 의도한 상태를 계속해서 조정해 맞춰나간다.


리소스는 데이터다

 

디플로이먼트, 파드와 같은 쿠버네티스 리소스는 모두 내부 데이터베이스에 기록되는데, 조정 루프는 데이터베이스 내 기록의 변경 사항을 감시하고 적절하게 동작한다.

 

리소스 매니페스트를 직접 생성하고 수정하면, kubectl run 명령어를 사용하지 않아도 되며, 명령어를 실행하여 변경사항을 적용하는 대신에 매니페스트 파일을 소스 제어에 보관하고 수정한 후 쿠버네티스가 이를 반영하게 요청하면 된다.


디플로이먼트 매니페스트

 

JSON 형식도 가능하지만 일반적으로 YAML 형식을 이용한다.


kubectl apply 사용하기

 

선언형 인프라 코드 시스템으로서의 쿠버네티스 기능을 충분히 잘 활용하려면 kubectl apply 명령어를 사용하여 YAML 매니페스트를 클러스터에 직접 전달해야 한다

 

이후에 확인하면 데모 파드가 실행 중!

demo 파드를 웹 브라우저에서 접속 가능하게 하려면 배포한 파드에 연결 할 수 있게 해주는 쿠버네티스 서비스 리소스를 생성해야 한다.

서비스 리소스는 무엇일까??


서비스 리소스

 

서비스 리소스는 파드에 자동으로 라우팅되는 영구적인 IP주소와 DNS 주소를 제공한다.

 

서비스는 웹 프록시나 로드 밸런서와 같이 요청을 백엔드 파드의 세트로 전달하고, 웹 포트뿐만 아니라 스펙의 포트 부분에 명시된 모든 포트로 트래픽을 전달할 수 있다.

쿠버네티스 서비스는 전통적인 로드 밸런서와 유사하며, 디플로이먼트는 애플리케이션의 파드의 세트를 관리하고 서비스는 요청을 파드에 전달하는 단일 엔트리 포인트를 제공한다는 것

 

 

매니페스트를 적용하고 서비스를 생성

웹 브라우저로 접속할 수 있게 된다.

짜잔

다했으면 아래처럼 진행해서 정리하자.


kubectl로 클러스터 조회하기

 

kubectl 도구는 설정을 적용하고, 리소스를 생성, 수정, 제거할 수 있으며 클러스터에 존재하는 리소스 상태에 대한 정보를 조회할 수 있다.

파드와 디플로이먼트를 조회했던 것처럼 kubectl get을 사용하여 클러스터에 존재하는 노드를 확인할 수 있다.

모든 타입의 리소스는 kubectl get all을 치면 볼 수 있다.

개별 파드(혹은 다른 리소스)에 대한 포괄적인 정보를 알고 싶다면 kubectl describe 명령어를 이용하자.


헬름 : 쿠버네티스 패키지 매니저

 

쿠버네티스 패키지 매니저인 헬름은 귀찮은 일들을 처리해준다.

helm 명령줄 도구를 사용하면 애플리케이션을 설치하고 설정할 수 있다.

헬름 차트라는 패키지를 생성하면 애플리케이션을 실행하는 데 필요한 리소스, 의존성, 구성 가능한 변수를 지정할 수 있다.

 

helm-auth.yaml 파일을 적용하기

필요한 권한을 얻었기에 클러스터에 접근할 수 있도록 헬름을 초기화하자

 

다음처럼 헬름 차트를 설치해준다.

책에서는 헬름 2.x 버전이라 init 을 진행하지만, 3.x는 필요없는듯 하다.

그리고 --name이라는 플래그는 필요가 없었다.

여기서 helm install은 헬름 릴리스라는 쿠버네티스 오브젝트를 생성하여 이를 수행한다.

 

차트는 쿠버네티스에서 애플리케이션을 실행하는 데 필요한 모든 리소스 정의를 포함한 헬름 패키지

리포지터리는 차트가 모여 있는 공유할 수 있는 공간

릴리스는 쿠버네티스 클러스터에서 실행되는 차트의 특정 인스턴스

 

릴리스는 고유한 이름을 가지며 helm install에서 -name 플래그를 굳이 지정하지 않고,

위와 같이 helm install [릴리스이름] [차트이름 or 위치]식으로 변경된 것 같다. 

 

helm list를 보게되면 위와 같이 나오게 된다.

정확한 상태는 helm status와 릴리스 이름을 입력하게 되면,

이런 정보가 나오게 된다.


이제까지 한 내용을 정리해보자.

 

  • 파드는 쿠버네티스의 기본 작업 단위이며, 컨테이너의 그룹을 지정한다.

 

  • 디플로이먼트는 파드를 선언적으로 관리하는 리소스이며, 배포, 스케줄링, 업데이트 작업을 수행하고 필요하다면 파드를 재시작한다.

 

  • 서비스는 쿠버네티스의 로드 밸런서나 프록시에 해당하며 IP 주소나 DNS 이름을 통해 트래픽을 일치하는 파드로 라우팅한다.

 

  • 쿠버네티스 스케줄러는 노드에서 아직 실행되지 않는 파드를 감시하고 적합한 노드를 찾은 다음 해당 노드의 kubelet이 파드를 실행하도록 지시한다.

 

  • 디플로이먼트와 같은 리소스는 쿠버네티스의 내부 데이터베이스에 레코드로 표시되고, 외부적으로 이러한 리소스는 YAML 형식의 텍스트 파일(매니페스트)로 표현된다. 매니페스트는 리소스의 의도한 상태를 선언한다.

 

  • kubectl은 쿠버네티스와 상호작용하기 위한 도구로 매니페스트를 적용하고 리소스를 조회, 변경, 삭제하는 등의 많은 작업을 수행할 수 있다.

 

  • 헬름은 쿠버네티스 패키지 매니저로 쿠버네티스 애플리케이션을 쉽게 구성하고 배포할 수 있게 해준다. 직접  YAML 파일을 관리할 필요 없이 템플릿을 사용하여 쿠버네티스 YAML 파일을 생성할 수 있게 해준다.

 

'데이터엔지니어링 > K8s on Cloud' 카테고리의 다른 글

[6장] 클러스터 운영하기  (0) 2023.08.03
[5장] 리소스 관리  (0) 2023.07.04
[3장] 쿠버네티스 구축하기  (0) 2023.06.06
[2장] 쿠버네티스 첫걸음  (0) 2023.06.05

댓글