1. Container Orchestration
- 컨테이너 배포 관리는 흔히 컨테이너 오케스트레이션(Container Orchestration) 이라고 불린다.
- 다수의 컨테이너를 동작하는 환경 그리고 다수의 서버를 사용하는 환경에서는 도커를 관리하기 위한 다른 솔루션 또는 툴이 필요 하였고 이런 컨테이너를 관리 하기 위해 나온 툴이 컨테이너 오케스트레이션이다.
- 컨테이너 오케스트레이션의 목적은 여러 컨테이너의 배포 프로세스를 최적화 하는데 있으며, 이것은 컨테이너와 호스트의 수가 증가함에 따라 점점 더 가치가 있게 된다.
- 컨테이너 오케스트레이션 도구 중 대표적인 Docker 기반 오케스트레이션 도구로, Docker Swarm, Kubernetes, Apache Mesos가 있다.
Docker Swarm은 Docker 호스트 클러스터를 조정하기 가장 쉬운 방법을 제공하고 있고,
Kubernetes는 컨테이너 서비스 배포 및 관리에 많은 이점을 가지고 있다.
Apache Mesos는 대규모 클러스터링을 지원하고 특히 Hadoop, Kafka 및 Spark 와 같은 다른 서비스와 함께 응용 프로그램을 배치해야 하는 환경에 특히 적합하다.
* 오케스트레이션의 기능
• 컨테이너 자동 배치 및 복제
• 컨테이너 그룹에 대한 로드 밸런싱
• 컨테이너 장애 복구
• 클러스터 외부에 서비스 노출
• 컨테이너 추가 또는 제거로 확장 및 축소
• 컨테이너 서비스간의 인터페이스를 통한 연결 및 네트워크 포트 노출 제어
2. 쿠버네티스(Kubernetes)란?
- 쿠버네티스는 구글(Google)이 만들었으며, 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다. 쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다.
- 쿠버네티스란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래되었으며 K8s라는 표기는 "K"와 "s"와 그 사이에 있는 8글자를 나타내는 약식 표기이다.
3. 쿠버네티스가 필요한 이유와 기능
컨테이너는 애플리케이션을 포장하고 실행하는 좋은 방법이다. 프로덕션 환경에서는 애플리케이션을 실행하는 컨테이너를 관리하고 가동 중지 시간이 없는지 확인해야 한다. 예를 들어 컨테이너가 다운되면 다른 컨테이너를 다시 시작해야 한다. 이 문제를 시스템에 의해 처리한다면 더 쉽지 않을까?
그것이 쿠버네티스가 필요한 이유이다. 쿠버네티스는 분산 시스템을 탄력적으로 실행하기 위한 프레임 워크를 제공한다. 애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공한다. 예를 들어, 쿠버네티스는 시스템의 카나리아 배포를 쉽게 관리 할 수 있다.
쿠버네티스는 다음을 제공한다.
• 서비스 디스커버리와 로드 밸런싱 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.
• 스토리지 오케스트레이션 쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재 할 수 있다.
• 자동화된 롤아웃과 롤백 쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다.
• 자동화된 빈 패킹(bin packing) 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다.
• 자동화된 복구(self-healing) 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, '사용자 정의 상태 검사'에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.
• 시크릿과 구성 관리 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리 할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 할 수 있다.
3. Kubernetes 설치하기
쿠버네티스를 구성하기 위해선, 먼저 Docker를 설치해야한다.
아래 링크를 참고하여 Docker를 설치한다.
https://daeunnniii.tistory.com/155?category=886442
Docker 설치를 완료했다면, 오른쪽 Settings 버튼을 눌러 설정 화면으로 들어간다.
좌측 메뉴에서 Kubernetes를 선택한 후 Enable Kubernetes 체크 후 "Apply & Restart"를 클릭해준다.
이제 Docker를 restart하면 아래 이미지와 같이 Kubernetes Running 상태가 된다.
kubectl version을 cmd 창에 입력하여 정상적으로 버전이 출력되는지 확인할 수 있다.
>> kubectl version
4. Kubernetes 용어 정리
Namespace
하나의 물리 클러스터 안에서 여러 개의 가상 클러스터를 사용 할 수 있으며 이러한 가상 클러스터는 Namespace 기반으로 나누어서 사용할 수 있다. 즉, 클러스터에서 여러 개의 앱을 사용하거나 여러 명의 사용자가 사용해야 할 때 유용하게 사용할 수 있다.
# kubectl get namespace
NAME STATUS AGE
default Active 22d
docker Active 22d
kube-node-lease Active 22d
kube-public Active 22d
kube-system Active 22d
kubernetes-dashboard Active 21d
Deployment
Pod의 설치를 관리하는 기본 요소로서, 실행 시의 기본 컨트롤러, Deployment 삭제시 하부의 Pod도 모두 삭제됨
Service
Pod에서 실행중인 프로세스를 위한 신원(identity)을 제공하여 서비스 찾기를 통해서 Pod에 고유한 IP주소와 Pod 집합에 대한 단일 DNS명을 부여하여 외부에서 접근할 수 있게 해준다. 타입는 ClusterIP, NodePort, LoadBalancer ,ExteralName 등이 있다.
Pod
실제로 도커 인스턴스가 떠 있는 단위를 Pod이라고 지칭한다.
5. Kubernetes 노드 구성
쿠버네티스 클러스터를 구성하는 Machine(머신)들을 노드(node)라고 하며, 쿠버네티스 클러스터 내 노드들은 물리 머신이거나 가상 머신일 수 있다.
• Master : 노드들의 상태를 관리하고 제어, 1대만 구성할수 있으나 고가용성 서비스라면 3대 이상으로 구성 장애가 발생하면 남은 서버 중 한대가 마스터의 역할을 함
• Node (Worker) : Kubelet, kube-proxy, docker 등의 프로세스가 동작하며 마스터 노드의 명령을 받아 사용자가 선언한 Pod나 Job을 실행함, 실제 docker 컨테이너가 동작하는 것은 노드에서 동작함
6. Kubernetes 노드별 구성 요소
Master Node 구성 요소
1) kube-scheduler : 클러스터 내에서 발생하는 파드의 생성에 대한 노드의 자원 할당을 선택하는 컴포넌트, 정해놓은 조건에 맞게 빈 노드에 파드를 할당한다. 할당은 affinity, anti-affinity ,데이터 지역성 등 다양한 요소를 고려한다.
2) kube-controller-manager : 토드 컨트롤러외에 아래의 다수의 컨트롤러를 복잡성을 줄이기 위해서 하나로 구성한 컴포넌트로서 각 컨트롤러는 다음과 같다.
- 노드 컨트롤러 : 노드의 중지에 대한 대응
- 레플리케이션 컨트롤러 : 전체 레플리케이션 컨트롤러 객체에 대한 파드 숫자 유지
- 엔드포인트 컨트롤러 : 서비스와 파드 연결
- 서비스 어카운트 & 토큰 컨트롤러 : 신슈 name space에 대한 기본적인 관리
3) cloud-controller-manager : 클라우드 사업자와 컨트롤러들을 연결하여 관리하는 역할을 함
- 노드 컨트롤러 : 노드 중지이후 클라우드 상에서 삭제되었는지 판별하기 위함
- 라우트 컨트롤러 : 클라우드 서비스 상의 네트워크 라우팅 관리
- 서비스 컨트롤러 : 클라우드 제공사업자 서비스의 로드밸런서를 생성, 업데이트 삭제
- 볼륨 컨트롤러 : 클라우드 서비스상의 볼륨을 노드와 연결하거나 마운트
4) kube-apiserver : 쿠버네티스상에서 이루어지는 모든 요청은 이를 통해서 각 컴포넌트에 전달되고 실행된다. 외부에서 클라우드를 관리할 수 있는 핵심 API, 수평 확장이 가능하므로 요청이 많은 경우 확장 할 수 있다.
5) etcd : key- value 저장소로서 모든 클러스터의 데이터를 저장하는 저장소이다. (https://etcd.io)
Worker Node 구성 요소
1) kubelet : 프로세스로서 실행 가능하며 도커를 관리한다. kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당함,
2) kube-proxy : 개별 노드에서 실행되는 네트워크 프록시로서 파드가 외부와 통신할 수 있게 해주는등 네트워크 규칙을 관리.
3) 컨테이너 런타임 : 클러스터에서 컨테이너의 실행을 담당하는 것으로서 대표적으로는 Docker가 있으며 containerd와 같은 다른 런타임도 지원 합니다. CRI (Container Runtime Interface)를 만족하는 모든 소프트웨어를 지원
참고: https://kubernetes.io/ko/docs/home/
https://www.mantech.co.kr/container_orchestration/
https://brunch.co.kr/@sokoban/81
'Kubernetes' 카테고리의 다른 글
Helm 사용법과 명령어 정리 - Repository 조회, Helm Chart 만들기 (0) | 2022.04.22 |
---|---|
[Kubernetes] kubectl 명령어 정리 (0) | 2022.04.08 |