Kubernetes는 컨테이너화된 애플리케이션을 배포, 관리, 확장 및 운영 하기 위한 오픈소스 플랫폼입니다. Kubernetes 플랫폼은 애플리케이션간의 유기적인 통합과 일관된 관리 프로세스로 워크로드 크기에 상관없이 서비스 가치를 IT 로 실현해 낼 수 있는 훌륭한 도구 입니다.
Kubernetes UseCase 기반 특징
-
웹 애플리케이션 배포:
Kubernetes를 사용하여 회사 내부에서 사용되는 웹 애플리케이션을 안정적으로 배포하고 관리할 수 있습니다.
웹 애플리케이션의 컨테이너화된 버전을 배포하고 로드 밸런싱, 자동 확장 및 롤링 업데이트를 설정합니다. 이렇게 하면 애플리케이션의 가용성이 높아지고 개발자와 운영팀이 함께 협력하여 애플리케이션을 관리할 수 있습니다. -
마이크로서비스 아키텍처:
Kubernetes를 사용하여 마이크로 서비스 아키텍처 기반으로 워크로드르 운영 관리 할 수 있습니다.
각 마이크로서비스를 별도의 컨테이너로 배포하고, 서비스 디스커버리와 로드 밸런싱을 통해 서로 통신하도록 설정합니다. 각 마이크로서비스는 개별적으로 관리되므로 개발, 배포 및 유지보수가 용이해집니다. -
DevOps 및 CI/CD 환경:
Kubernetes를 사용하여 개발, 테스트, 스테이징 및 프로덕션을 위한 각 환경을 노드 그룹으로 나누어 구성할 수 있습니다.
GitOps와 CI/CD 도구를 위한 독립적인 Toolchain 서비스를 구성하고, Toolchain 서비스는 코드 변경 사항을 자동으로 클러스터에 배포하며, 롤링 업데이트와 롤백 기능으로 안정적인 애플리케이션 배포를 하게됩니다. -
스케일 기능:
Kubernetes의 자동 스케일링 기능을 활용하여 트래픽의 증가에 대응 하는 애플리케이션 인스턴스를 자동으로 확장합니다.
가상화 컴퓨팅 인스턴스인 워커 노드 또한 자동으로 확장 / 축소 할 수 있습니다. 이를 통해 서비스의 가용성을 높이고 사용자의 요구에 빠르게 대응할 수 있습니다.
Kubernetes 아키텍처
Kubernetes 클러스터는 컨트롤 플레인 (Control Plane)과 데이터 플레인 (Data Plane) 컴포넌트로 구성 되며, 이 두 컴포넌트는 Kubernetes 서로 상호작용하여 클러스터의 안정성과 가용성을 확보합니다.
컨트롤 플레인 (Control Plane)
은 클러스터의 구성 및 관리를 담당하고, 데이터 플레인 (Data Plane)
은 실제 애플리케이션을 실행하고 관리합니다.
예를 들어 애플리케이션 Pod 를 배포하고 서비스를 Endpoint 로 expose(노출) 하는 등의 리소스(Pod, Service, …) 상태를 조정 하는 등의 역할은 컨트롤 플레인 (Control Plane)
이 담당 하고, 실제 애플리케이션 Pod 가 인스턴스로 올라와서 서비스 기능 자체로 동작하도록 기반을 제공하는 것은 데이터 플레인 (Data Plane)
이 담당하게 됩니다.
컨트롤 플레인 (Control Plane)
컨트롤 플레인 (Control Plane)
은 클러스터 상태를 중앙 관리 및 제어를 통해 지속적으로 조정해 주는 컨트롤 센터 역할을 담당 합니다.
클라이언트(사용자)가 API 및 kubectl 을 통해 Kubernetes 리소스를 생성, 수정, 삭제, 자동화 요청을 하게 되며컨트롤 플레인 (Control Plane)
은 이 명령들을 처리하게 됩니다.
API 서버 (API Server)
- 클러스터의 컨트롤 플레인의 중심이 되는 구성 요소로, 클러스터 관리 작업을 수행하고 API 요청을 처리합니다.
스케줄러 (Scheduler)
- 파드를 노드에 할당하는 역할을 담당합니다. 사용자가 생성한 파드를 최적의 노드에 할당하여 실행하도록 관리합니다.
컨트롤러 매니저 (Controller Manager)
- 클러스터의 상태를 지속적으로 확인하고 필요에 따라 상태를 조정합니다. Node Controller, Replication Controller, Deployment Controller 등의 컨트롤러가 포함됩니다.
새로운 Node 추가 / 제거, Taint, Drain 과 애플리케이션의 컨테이너 복제 수를 일치하도록 조정하는 등의 중요한 프로세스를 처리 합니다.
Etcd (Cluster Storage)
- 클러스터의 모든 구성 정보를 저장하는 분산 데이터 저장소로, 클러스터의 상태 및 설정 정보를 Key / Value 로 관리합니다.
데이터 플레인 (Data Plane)
데이터 플레인 (Data Plane)
은 모든 Node 에서 실제 컨테이너화된 애플리케이션 컨테이너가 실행중인 Pod 를 유지하고 Kubernetes 런타임 환경을 제공 합니다.
kubelet
- 각 노드에서 실행되는 에이전트로, Node 에서 PodSpec에 설명된 컨테이너가 Pod 로서 실행 중이고 정상적으로 동작하는지 확인합니다.
kube-proxy:
- kube-proxy는 노드의 네트워크 규칙을 유지하며 클러스터 내부 또는 외부의 네트워크 세션을 Pod와 연결되도록 합니다.
kube-proxy는 각 노드에서 실행되는 네트워크 프록시로 NAT 및 네트워크 연결을 담당 합니다.
Container runtime:
- 컨테이너 런타임 (Container Runtime)은 Kubernetes 환경 내에서 컨테이너의 생성에서 제거까지 수명 주기를 관리하는 실행 주체입니다. Docker, Containerd, CRI-O 및 기타 Kubernetes CRI(컨테이너 런타임 인터페이스) 구현체가 컨테이너 런타임을 실행합니다.
Kubernetes Resource
데이터 플레인 (Data Plane)
위에 애플리케이션 서비스를 위한 주요한 Kubernetes 리소스들이 배포됩니다.
Pods
- 컨테이너화된 애플리케이션을 배포하는 가장 작은 단위 입니다. 여기에는 애플리케이션과 애플리케이션이 사용하는 공유 리소스(IP 주소, IPC, 호스트 이름, Volume 등)를 함께 구성하여 배포할 수 있습니다. 참고로, Pod 는 고유의 private IP 주소를 가집니다. Pod 를 구성하는 애플리케이션 서비스인 container 는 Pod 내에서 localhost 로 서로 통신 합니다. 컴퓨팅 및 공유 리소스의 격리화를 통해 Cluster 내에서 복제 및 이동이 용이합니다.
Service
- Service 는 생성 / 삭제 / 확장 / 축소와 같이 동적으로 상태가 변화하는 Pod 를 대상으로 외부에서 접근할 수 있는 하나의 Endpoint 를 제공 합니다.
Ingress
- Ingress는 클러스터 외부의 HTTP 및 HTTPS 요청을 클러스터 내부의 서비스로 라우팅 합니다. 특히 hostname 기반 또는 URI 경로 기반으로 Ingress 리소스에 정의된 규칙에 따라 트래픽을 제어합니다.
Kubernetes 클라우드 아키텍처
Kubernetes 의 기본 아키텍처를 Cloud Native한 환경에서 운영되도록 Cloud 컴포넌트를 추가하여 확장한 아키텍처 입니다.
Cloud Controller Manager
- Cloud 환경에서 Node 의 자동화된 확장 정책, DNS 라우팅 정책, CSP 특화된 Ingress 컨트롤러 등을 관리 합니다.
Cloud Provider API
- Public 및 Private Cloud Service Provider 를 위한 API 를 제공 합니다.
Cloud DNS
- Cloud 에서 제공되는 public / private 도메인 네임 해석을 Pods 및 Services 에 라우팅 되도록 지원 합니다.
Kubernetes 를 이용하는 최대 강점
자동화된 컨테이너 관리
- Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장, 관리, 복구 등을 자동화하며, 개발자와 운영팀의 작업 부담을 줄여줍니다.
가용성 및 확장성
- Kubernetes는 다양한 클러스터 환경에서 애플리케이션의 가용성을 보장하고 필요에 따라 자동으로 스케일링할 수 있습니다.
선언적 구성 관리
- YAML 또는 JSON 형식의 리소스 정의 파일을 사용하여 애플리케이션의 상태를 선언적으로 관리하므로, 원하는 상태에 맞게 변경할 수 있습니다.
포터블한 환경
- Kubernetes는 여러 환경에서 일관된 방식으로 애플리케이션을 배포하고 관리할 수 있습니다. 로컬 개발 환경부터 클라우드까지 효율적으로 작업할 수 있습니다.
설계상의 확장성
- Kubernetes는 모듈화된 아키텍처로 설계되어 확장성이 우수합니다. 필요에 따라 노드, 클러스터, 레플리카 등을 확장할 수 있습니다.
자동 복구 및 롤아웃
- 애플리케이션의 장애 상황에서 자동으로 복구하고, 롤아웃 전략을 사용하여 버전 업그레이드를 안정적으로 진행할 수 있습니다.
많은 커뮤니티 및 에코시스템
- Kubernetes는 큰 개발 및 사용자 커뮤니티를 가지고 있어 다양한 리소스, 도구, 플러그인, 서비스 등을 활용할 수 있는 풍부한 에코시스템을 제공합니다.
클라우드 네이티브 지원
- Kubernetes는 클라우드 네이티브 워크로드와 통합하기에 이상적인 도구로서, 다양한 클라우드 프로바이더와 연동하여 사용할 수 있습니다.
helloworld 애플리케이션 서비스 배포
Kubernetes 환경에서 애플리케이션을 얼마나 빨리 서비스를 올리고 그 방법의 일관됨과 단순함을
helloworld 애플리케이션 배포를 통해 선언적 구성 배포
와 자동화된 컨테이너 관리
와 가용성 및 확장성
을 바로 확인할 수 있습니다.
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld
spec:
replicas: 2
selector:
matchLabels:
app: helloworld
template:
metadata:
labels:
app: helloworld
spec:
containers:
- name: helloworld
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: helloworld-svc
spec:
selector:
app: helloworld
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
애플리케이션이 갖추어야할 미덕
- lightweight (Base 이미지는 alpine, slim)
- 구동 시간이 짧을수록 좋음
- health 체크를위한 api 를 항상 추가 (형식은 통일 /health, httpStatus 200 OK)
- 트러블 슈팅을 위한 툴이 필요할 수 있음 (curl, netcat, bind-utils 등 경우에 따라 컨테이너 내부에서 설치하여 확인이 필요할 수 있음)
Kubernetes 가 애플리케이션을 배포하는 흐름
위 다이어그램은 Kubernetes 클러스터의 컴포넌트가 유기적인 상호작용으로 애플리케이션을 어떻게 배포하고 상태를 현행화하는지를 보여주고 있습니다.
Minikube
Kubernetes 리소스를 배포 및 테스트하는 목적으로 Minikube
를 통해 로컬 클러스터를 구성할 수 있습니다.
Minikube는 로컬 개발 및 테스트를 위한 Kubernetes 클러스터를 간단하게 구성하고 관리하는 도구로, 로컬 개발 및 디버깅, 샘플 및 데모 실행, 기술 검토 및 교육, CI/CD 파이프라인 테스트 용도로 활용할 수 있습니다.
minikube 설치
Minikube Start 를 통해 OS 및 CPU 아키텍처에 해당하는 번들을 다운로드하고 설치 할 수 있습니다.
minikube 설정
다음은 minikube 리소스를 정의하고 실행 에뮬레이터 드라이버를 설정 합니다.
# light-mode
minikube config set driver docker
minikube config set cpus 2
minikube config set memory 5919MB
minikube config view
# normal-mode
minikube config set memory 8192
minikube config set cpus 4
minikube 실행
minikube start
minikube 에서 LoadBalancer 타입을 지원하기 위해 Tunnel 을 생성합니다.
minikube tunnel
minikube 다중 노드 실행
# minikube start --nodes 3 --profile <profile_name>
minikube start --nodes 3 --profile mininode
minikube Node 로 터미널 접속
# minikube ssh --profile <profile_name>
minikube ssh --profile basic