[Kubernetes] 쿠버네티스란?

[Kubernetes] 쿠버네티스란?

안녕하세요? 정리하는 개발자 워니즈 입니다. 이번시간에는 쿠버네티스가 어떤것인지 정리를 해보도록 하겠습니다.

Kubernetes 또는 k8s (첫글자 k와 끝글자 s를 제외한 8 글자인 “ubernete”를 8로 대체한 약어) 또는 간단히 “kube”는 컨테이너 응용 프로그램의 배포, 확장 및 관리를 자동화하는 container orchestration 오픈소스 플랫폼입니다.

쿠버네시트 로고

1. 쿠버네티스의 특징

쿠버네티스는 다음과 같은 역할을 갖고 있습니다.

  • 컨테이너를 실행하는 호스트 그룹을 클러스터링 할 수 있습니다.
  • 적절한 위치에 배포하고 (auto-placement) 서비스할 수 있습니다.
  • 자동으로 복구할 수 있습니다. (auto-restart)
  • 자동으로 추가(scaling), 복제(replication), 업데이트(rolling update), 롤백(rollback) 할 수 있습니다.

즉, 오케스트레이션을 손쉽게 해주는 도구인데요. 여기서 말하는 오케스트레이션은 배포,롤백,복제등 손쉽게 스케일에 대한 유연성을 갖고 있다는 것을 말합니다.

2. 용어 설명

2-1. 클러스터

Kubernetes 내 Master와 여러개의 Node로 구성된 추상 개념으로, 컨테이너화된 애플리케이션을 배포, 관리하는 논리적인 환경입니다.

2-2. 마스터

쿠버네티스 관리자는 Master Node를 통해 클러스터를 관리합니다. Master Node는 1대 이상 구축할 수 있고 본 과정에서는 Master VM에 1대 구성되어 있습니다. 구성요소인 API Server, Controller Manager, Scheduler, etcd 등으로 클러스터내 연결된 노드들의 이벤트를 감지하고, Workerd Node에게 배포, 스케일링 등의 명령을 내립니다.

2-3. 노드

VM머신으로 실제 Docker Engine이 구동되어 컨테이너가 실행되는 서버입니다.
Master의 API Server로부터 Master의 명령을 받아컨테이너의 상태를 관리합니다.
(Node == Worker == Minion)

3. 쿠버네티스 Object

Kubernetes에서 Object를 생성하고자 할때 Kubernetes 시스템에 해당 객체의 Spec과 원하는 상태나 특성 등을 알려주어야 합니다. Object를 생성하는 방법은 3가지로 구분될 수 있는데

  • API Request
  • kubectl 명령어
  • kubectl 명령어 with yaml

Cluster상의 리소스 배포는 일반적으로 YAML(YAML Ain’t Markup Language) 형식으로 정의한 파일을kubectl create 또는 kubectl apply 명령어를 사용해 배포하는 것이 일반적이므로 본 과정에서도 주로 kubectl apply 명령어로 Object를 생성합니다.

3-1. Spec

다음 예제는 NGINX 웹 서버의 Deployment를 생성하는 예제입니다.

Deployment의 주요Spec은 3개의 복제본을 만들고, Lavel selector가 app: nginx입니다.

ReplicaSet의 주요Spec은 Pod안에 컨테이너를 명세하고 있습니다. nginx이미지로 80 포트가 컨테이너에서 열리도록 지정하고 있습니다.

즉 먼저나온 spec은 Deployment의 spec이며, 두번째로 나온 spec은 ReplicaSet의 spec입니다.

  • 배포명령어

  • 배포확인

  • 리소스 관련 주요 명령어

3-2. Namespace

Kubernetes는 동일한 Cluster위에 여러개의 가상 Cluster를 지원합니다. 이러한 가상 Cluster는 Pod 및 Deployment와 같은 Kubernetes 리소스를 논리적인 단위로 그룹화할 수 있는데, 이러한 가상의 Cluster를 namespace라고 합니다.

아래 명령어로 클러스터 내의 namespace를 조회할 수 있습니다.

아래 명령어로 클러스터 내의 namespace를 조회할 수 있습니다.

Kubernetes를 설치하면 초기셋팅으로 아래와 같은 namespace가 조회됩니다.

  • default` The default namespace for objects with no other namespace
  • kube-system The namespace for objects created by the Kubernetes system
  • kube-public 이 namespace 역시 자동으로 생성되는 namespace로써, Kubernetes Cluster 전체에서 볼수 있는 리소스에 사용될 수 있으며, 모든 사용자가 볼 수 있습니다.

Subdividing your cluster using Kubernetes namespaces

구성된 클러스터를 namespace를 통해 동일한 phisical machine에 여러개의 cluster로 분할하여 사용할 수 있습니다. 여기서는 개발자들이 사용하는 dev cluster, 운영을 위한 prod cluster로 namespace를 생성하는 예제입니다.

생성한 yaml파일을 cluster에 배포합니다.

root@master:/lab/namespace# kubectl apply -f /lab/namespace
namespace/development created
namespace/production created

배포된 결과를 조회하면 아래와 같이 development, production 의 namespace가 추가된 것을 확인할 수 있습니다.

그럼 신규로 생성된 namespace를 context로 지정해 pod를 생성해보도록하겠습니다.

context를 지정하지 않으면 object를 생성할 때 option으로 아래와 같이 namespace를 주어야 해당되는 namespace에 배포가 됩니다.

kubectl config view 명령어로 현재 설정된 cluster config정보를 조회해봅니다. 현재는 default로 생성된 kubernetes-admin@kubernetes라는 context만 존재하는 것을 확인할 수 있습니다.

이제 여기에 위에서 만든 namespace 두개를 추가해 client에서 context로 접속해 봅시다.

정상적으로 context가 추가되면, client에서 사용할 context를 지정할 수 있는데, 여기서는 사용 할 context를 dev로 지정합니다.

접속된 context에 pod를 배포합니다.

아래와 같이 정상적으로 pod가 조회됨을 확인 할 수 있습니다.

그러나 위에서 언급했듯이 pod, service 등의 배포가 되는 scope는 namespace에 의해 결정되기 때문에 context를 prod로 바꾸었을때는 다른 namespace에 존재하는 pod가 조회되지 않는 것을 확인 할 수 있습니다.

워니즈 블로그
워니즈 깃헙

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다