[kubernetes] POD, ReplicaSet, Deployment

728x90

POD vs Container

파드는 같은 리눅스 네임스페이스를 공유하는 여러 컨테이너들을 추상호된 집합으로 사용하기 위해서 사용한다.

포드 내의 컨테이너들이 네트워크 네임스페이스 등과 같은 리눅스 네임스페이스를 공유해 사용하기 때문이다.

즉, 도커에서 컨테이너들끼리 네트워크 네임 스페이스를 공유하여 동일한 네트워크 환경을 사용한 것 처럼 POD 내부의 컨테이너들도 같은 리눅스 네임스페이스를 공유해 사용한다.

완전한 앱으로써의 POD

하나의 포드는 하나의 완전환 애플리케이션이다. 만약 하나의 애플리케이션에 로그를 수집하는 기능이나, 변경사항을 갱신해야 하는 경우 포드의 주 컨테이너와 기능 확장을 위한 추가 컨테이너를 함께 포드에 포함시킬 수 있다.

이렇게 포드에 정의된 부가적인 컨테이너를 사이드카 컨테이너라고 부르며 사이드카 컨테이너는 포드 내의 다른 컨테이너와 네트워크 환경 등을 공유하게 된다.

RepilcaSet

POD 의 라이프 싸이클을 관리하기 위해 여러 개의 파드를 생성하거나 삭제할 때 한 번에 관리하기 편하다.

파드와 RS 는 느슨한 연결을 유지하고 있으며 이런 느슨한 연결은 포드와 RS 의 정의 중 라벨 셀렉터를 이용해 이뤄진다.

라벨은 포드 등의 쿠버네티스 리소스를 분류할 때 유용하게 사용할 수 있는 메타데이터이다. 라벨은 쿠버네티스 리소스의 부가적인 정보를 표현할 수 있을 뿐만 아니라 서로 다른 오브젝트가 서로를 찾아야 할 때 사용되기도 한다.

  • 정해진 수의 동일한 포드가 항상 실행되도록 관리한다.
  • 노드 장애 등의 이유로 포드를 사용할 수 없을 때 다른 노드에서 포드를 다시 생성한다.
  • 레플리카셋의 목적은 ‘포드를 생성하는 것'이 아닌, ‘일정 개수의 포드를 유지하는 것’이다.

Deployment

실제 쿠버네티스 운영 환경에서 레플리카셋을 YAML 파일에서 사용하는 경우는 거의 없다. 대부분은 레플리카셋과 포드의 정보를 정의하는 디플로이먼트라는 오브젝트를 YAML 파일에 정의해 사용한다.

디플로이먼트는 레플리카셋의 상위 오브젝트이기 때문에 디플로이먼트를 생성하면 해당 디플로이먼트에 대응하는 레플리카셋도 함께 생성된다.

💡 디플로이먼트로부터 생성된 레플리카셋과 포드는 특이한 해시값을 포함한 이름으로 생성된다. 이 해시값은 포드를 정의하는 템플릿으로부터 생성된 것 이다.

Deployment 를 사용하는 이유

디플로이먼트를 사용하는 이유 중 하나는 애플리케이션의 업데이트와 배포를 더욱 편하게 만들기 위해서이다.

예를 들어, 애플리케이션을 업데이트할 때 레플리카셋의 변경 사항을 저장하는 리비전(revision)을 남겨 롤백을 가능하게 해주고, 무중단 서비스를 위해 포드의 롤링 업데이트의 전략을 지정할 수도 있다.

디플로이먼트는 포드의 정보를 업데이트함으로써 새로운 레플리카셋과 포드를 생성하더라도 이전 버전의 레플리카셋을 삭제하지 않고 남겨두고 있다. 즉, 디플로이먼트는 포드의 정보가 변경되어 업데이트가 발생했을 때 이전의 정보를 리비전으로서 보존한다.

리비전에 대한 자세한 정보를 알고 싶으면 아래 명령어로 확인이 가능하다.

kubectl rollout history deployment <디플로이먼트_이름>

--record=true 옵션으로 디플로이먼트를 변경하면 변경 사항을 위와 같이 디플로이먼트에 기록함으로써 해당 버전의 레플리카셋을 보존한다.

만약, 이전 버전의 레플리카셋으로 되돌리는 롤백을 하고 싶을 경우 아래와 같은 명령어를 사용할 수 있다. --to-revision 에는 되돌리려는 리비전의 번호를 입력하면 된다.

kubectl rollout undo deployment <디플로이먼트_이름> --to-revision=1
728x90