
지난 시간에는 쿠버네티스의 기본개념과 구성요소에 대해서 알아보았다.
이제 직접 쿠버네티스를 이용해서 컨테이너를 관리하는 실습을 해보자. 이를 위해 먼저 minikube를 다운받아야한다.
이 포스팅을 통해 아래 워커로드들을 공부한다!
미니큐브는 로컬 쿠버네티스이다. 쿠버네티스를 로컬에서 테스트할 수 있게 만들어놓은 것이다.
설치 방법은 간단한데, 하이퍼바이저 설치 - 쿠버네티스트 명령줄 모음 설치 - 미니큐브 설치 순으로 진행한다.
원래 쿠버네티스를 실행하면 클러스터가 만들어지는데, 미니큐브는 하이퍼바이저 위의 VM에 클러스터를 생성한다. 여기서는 deployment, service 워커로드를 만들어 보면서 내부에 pod가 생기는 것을 관찰한다. 그리고 직접 서비스 단에 연결해보도록 하자.
미니큐브는 쿠버네티스의 로컬판이고 쿠버네티스는 여러 컨테이너들을 관리해주는 오픈소스 프로그램이라고 했다. 그래서 여러개의 컨테이너들을 묶어서 관리하는데 이를 지칭하는 용어가 Pod이다.
Pod란 한 개 이상의 컨테이너로 이루어진 집합이다.
도커에서는 앱 파일을 도커 이미지로 빌드하고, 그 이미지를 사용해서 docker 플랫폼 위에서 컨테이너를 실행했다.
(앱을 실행한다는 의미가 컨테이너를 run한다는 의미로 사용되었다.)
쿠버네티스에서 앱을 배포하는 최소의 단위는 pod이다.
(배포한다의 의미는 쿠버네티스 클러스터내에서 컨테이너가 실행되는 것이다.) 컨테이너 오케스트레이션 시스템이기 때문에 관리를 위해 여러 컨테이너가 묶인 파드 단위로 실행하도록 설계한 것으로 보인다.
pod를 관리하는 컨트롤러다.
pod는 컨테이너 집합이라고 했다. 만약 pod 내부의 컨테이너가 갑자기 종료되거나하면 deployment가 이를 체크해서 다시 실행시키며 파드 스케일업 및 롤링업데이트 등 다양한 역할을 수행한다.
kubectl(큐브 컨트롤)은 쿠버네티스 클러스터에서 컨테이너화된 애플리케이션을 배포, 업데이트, 유지 관리하기 위한 커맨드 라인 인터페이스(CLI) 도구이다.
이러한 개념들을 아래 실습을 하면서 어떤 의미인지 파악해보자.
글로만 읽었던 개념들을 직접 실습해보면서 익혀보도록 하자.
미니큐브를 설치했다면 도커를 실행하고 아래 명령어로 미니큐브를 시작한다.
minikube start
아래 명령어를 통해 deployment를 만들어보자
kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
"hello-node"라는 이름의 새로운 Deployment를 생성하며, 간단한 HTTP 서버를 실행하는 Pod를 포함한다. deployment 내에는 Replicaset과 컨테이너를 만들기 위한 도커 이미지가 명세된된다.
registry.k8s.io/e2e-test-images/agnhost:2.39 이미지를 기반으로 8080 포트에서 실행되는 것을 포함한 명령어다.
아래 명령어를 통해서 deployment와 pod를 확인한다.
kubectl get deployments

deployment는 1개의 파드를 관리하고 있다! 파드를 식별하기 위한 ID가 옆에 붙어있는것을 볼 수 있다

describe 명령어를 사용해서 pod의 상세정보를 확인해보자
kubectl describe pod hello-node-7579565d66-wzfqh
나 같은 경우는 아래와 같이 나왔다. pod내 컨테이너는 agnhost 1개로 상세 정보가 나와있다.

서비스란 외부 트래픽 노출, 로드밸런싱, 서비스 검색 등을 도와주는 추상화 계층이다.
deployment를 통해 파드 내 컨테이너의 라이프사이클을 관리하였던 반면 서비스에는 네트워크와 관련된 사항들을 명세해야한다.
쿠버네티스에 클러스터에서 트래픽을 수신하는 주체는 파드이다. 하지만 구동되는 어플리케이션은 컨테이너이니 결국 트래픽은 파드 내의 개별 컨테이너로 라우팅되어야한다.
그래서 파드에서 수신한 트래픽을 내부 컨테이너들에게 배분하게된다. (로드 밸런싱) 이것을 위해 필요한 계층이 바로 서비스 계층이다.
deployment 자체는 IP나 포트를 가지지 않는다. 따라서 서비스 계층을 통해 IP, 포트를 할당하는 역할을 한다.
Service 계층을 하나 더 만들어서 네트워크 역할을 분리한 것의 핵심적인 이유는 파드 관리를 위해서이다.
delpoyment는 파드에 이상이 생겨 갑자기 파드가 중지/종료 되었을 때, 재생성하는 등의 역할을 한다. 이 때 항상 새로운 파드가 형성되며 IP가 바뀌기 때문에 통신에 이상이 생겨버린다. 따라서 네트워크를 수신하는 계층을 만들고, 그 계층을 통해 트래픽을 1차로 받고 로드밸런싱을 시키는 형태로 설계했다.
우리가 만든 앱을 외부 네트워크에 노출시켜보자!
hello-node 이름의 deployment를 로드밸런서를 적용하여 포트 8080으로 노출한다.
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
kubectl expose deployment hello-node: "hello-node"라는 Deployment를 노출시키는 서비스를 생성-type=LoadBalancer: 생성되는 서비스의 유형을 지정. LoadBalancer 유형으로 설정되어있는데 클라우드 제공자에서 로드 밸런서를 자동으로 프로비저닝하도록 Kubernetes에 지시함. 즉, 외부에서 이 서비스에 접근하기 위해 클라우드 로드 밸런서가 사용된다는 의미.-port=8080: 서비스가 사용할 포트를 지정. 앞서 Deployment에서 실행한 Pod가 8080 포트에서 동작하도록 구성되어 있기 때문에 이 포트를 사용함.아래 명령어를 사용해서 서비스를 실행시켜보자
minikube service hello-node

127.0.0.1 이라는 익숙한 IP가 보인다. 두번째가 로컬 URL이다. 여기로 접속하면 실행되는 앱을 볼 수 있다!
테스트 앱은 현재의 Date 정보를 문자로 나타내주는 간단한 앱이었다

미니큐브 테스트
[kubernetes] 맥에 minikube를 사용해 로컬 kubernetes 설치
서비스 타입 설명 블로그 글