본 포스팅 자료는 2019년 네이버 블로그에 포스팅 했던 내용을 리 포스팅한 글입니다.
개인적으로 2019년 한해 가장 뜨거웠던 IT 키워드는 쿠버네티스(Kubernetes: 첫 자인 K와 마지막 자인 S사이에 8개의 단어가 있다고 해서 K8S로 줄여 부른다) 였던 걸로 생각됩니다. 쿠버네티스는 다수의 컨테이너들을 관리해 주는 오케스트레이션(Orchestration) 플랫폼입니다. 즉, 도커(Docker)와 같은 컨테이너들이 한 두대의 서버에 몇 개로만 구성되어 운영될 때는 필요 없는 개념이지만 컨테이너들이 엔터프라이즈(Enterprise)급의 구성을 통해 수십, 수백개로 늘어나게 되면 그 관리를 위해 꼭 필요한 플랫폼입니다.
쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다. 쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다. 쿠버네티스는 크고, 빠르게 성장하는 생태계를 가지고 있다. 쿠버네티스 서비스, 기술 지원 및 도구는 어디서나 쉽게 이용할 수 있다.
쿠버네티스란 명칭은 키잡이(helmsman)이나 파일럿을 뜻하는 그리스어에서 유래했다. 구글이 2014년에 쿠버네티스 프로젝트를 오픈소스화했다. 쿠버네티스는 구글의 15여년에 걸친 대규모 상용 워크로드 운영 경험을 기반으로 만들어졌으며 커뮤니티의 최고의 아이디어와 적용 사례가 결합되었다.
컨테이너 개념
오늘날 컨테이너로서 가장 유명한 것은 도커(Docker)이며 수십, 수백개의 도커를 관리(Management) 할 수 있는 가장 효율적인 툴로 여겨 지는 것이 쿠버네티스이므로 컨테이너에 대한 개념을 잡기 위해 Docker를 보는 것을 추천드립니다. Docker에 대한 내용은 이 블로그의 Docker와 관련된 포스팅 읽기를 권장해 드립니다.
Kubernetes(쿠버네티스)란
쿠버네티스는 컨테이너화된 어플리케이션의 개발, 스케일링(Scaling) 그리고 관리를 자동화 하기 위한 오픈소스 스시템입니다.
- 컨테이너 오케스트레이터(실행 및 관리)
- 다양한 클라우드 및 베어메탈 환경 지원
- Google Borg에서 시작되어 오픈소스화 됨
- 100% Go 언어로 작성
- 2015년 7월 v1.0이 Cloud Native Computing Foundation(CNCF)로 기부
- V1.8.0(20170928), v1.9.0(20171216)…
쿠버네티스의 특징
- Automatic binpacking
- 가용성에 대한 희생없이, 리소스 사용과 제약 사항을 기준으로 자동으로 컨테이너를 스케쥴
- Self-healing
- 자동으로 문제가 발생한 노드의 컨테이너를 대체(룰/정책에 따른 헬스 체크)
- Horizontal scaling
- CPU와 메모리와 같은 리소스 사용에 따라 자동으로 애플리케이션을 확장
- 경우에 따라서, 사용자 정의 측정 값을 기준으로 한 동적인 확장 가능
- Service discovery and Load balancing
- Container에 고유한 IP를 부여
- 여러개의 Container를 묶어 단일 Service로 부여하는 경우 단일 DNS name으로 접근하도록 로드 벨런싱 제공
- Automatic rollouts and rollbacks
- 다운타임 없이 애플리케이션의 새로운 버전 및 설정에 대한 롤아웃/롤백 가능
- Secret and configuration management
- 애플리케이션의 secret과 configuration 정보를 이미지와 독립적으로 구분하여 별도의 이미지 재생성 없이 관리
- Storage orchestration
- 소프트웨어 정의 저장장치(Software Defined Storage)를 기반으로 로컬, 외부 및 저장소 솔루션 등을 동일한 방법으로 컨테이너에 마운트 할 수 있음
- Batch execution
- CI 워크로드와 같은 Batch성 작업 지원cronetab형식으로 스케쥴링도 가능
Kubernetes Architecture (쿠버네티스 아키텍처)
K8S Master Node(Cluster Control Plane)
- kube-apiserver
- Cluster와 상호 작용을 위한 명령어를 받아 적절한 명령어 인지 체크 후 일제 명령어를 수행하도록 전달하는 역할, k8s API 서버
- kube-scheduler
- Worker node에 있는 pod를 스케쥴
- kube-controller-manager
- Deployments나 Replication Controller 등 관리
- kube-cloud-manager
- Public cloud provider 연동 관리
- etcd
- Master Cluster에서 k8s object 저장소로 사용
Kuberntes Node
- Container runtime
- 컨테이너 실행을 위한 Docker Engine 포함
- kubelet
- Master의 명령 수행을 위한 K8S에이전트
- kube-proxy
- 인바운드 또는 아웃바운드 트래픽에 대한 네트워크 프록시 담당
- cAdvisor
- Container Advisor는 리소스 사용/성능 통계를 제공
Node, Pod and Namespace
쿠버네티스(Kubernetes)의 오브젝트(Object) 소개
오브젝트란?
Kubernetes는 Kubernetes에 올라가는 모든 컴포넌트(?)들을 Object라 하고 이 Object들을 정의하고 특징 짓는 것을 YAML 포맷의 manifest 파일로 정의
기본 오브젝트 Basic Objects) |
컨트롤러 오브젝트 (Controller Objects) |
스토리지 (Storages) |
|
• Pod • Service • Configuration • Secrets • Volume • Namespace |
• ReplicaSet • ReplicationController • Deployment • StatefulSets • DaemonSet • Garbage Collection • Jobs • CronJob |
• Volume • Volume Type • PersistenceVolume • PersistenceVolume Type |
기본 오브젝트(Basic Object)
- Pod
- Worker 노드에서 실행되는 컨테이너들의 집합
- 하나의 Pod에서 한 개 이상의 서비스로 지정될 수 있음
(그러나 일반적으로 하나의 Container에 하나의 Pod설정) - 각각의 Pod는 고유한 IP가 할당 됨(내부 IP)
- 하나의 Pod내에서는 PID namespace, network와 hostname을 공유
(즉, 하나의 Pod내에서는 서로 다른 컨테이너의 Pid가 보이며 같은 NW, 같은 호스트명을 씀)
- Service
- 위에서 만든 Pod은 같은 Pod끼리는 호출이 되지만 이를 외부에서 사용하고자 하면 외부에선 접속 불가, 이를 해결하기 위해 Service사용
- Label Selector로 선택하여 하나의 endpoint로 노출되는 pod의 집합
- 종류: ClusterIP, NodePort, LoadBalancer, ExternalName, Ingress
- NodePort
- K8S Pod의 컨테이너들을 외부에서 접속 할 수 있도록 IP를 노출 시킴, 외부에 IP를 노출 시키는 기능으로는 이후에 설명할 Ingress를 이용한 방법과 지금 설명하는 NodePort를 이용한 방법이 있습니다.
- K8S Pod의 컨테이너들을 외부에서 접속 할 수 있도록 IP를 노출 시킴, 외부에 IP를 노출 시키는 기능으로는 이후에 설명할 Ingress를 이용한 방법과 지금 설명하는 NodePort를 이용한 방법이 있습니다.
- Ingress
- K8S Pod의 컨테이너들을 외부에서 접속 할 수 있도록 일종의 Proxy서버를 이용해 접근 하는 방식, 이 Proxy서버를 Ingress 서버라 하며 Nginx를 비롯한 여타의 웹 서버로 구성 가능합니다.
- K8S Pod의 컨테이너들을 외부에서 접속 할 수 있도록 일종의 Proxy서버를 이용해 접근 하는 방식, 이 Proxy서버를 Ingress 서버라 하며 Nginx를 비롯한 여타의 웹 서버로 구성 가능합니다.
- NodePort
- ConfigMap
- pod에 담겨진 container에서 사용되는 구성 값(내가 사용할 DB의 IP정보, 접속 정보등 Cluster내부 Pod내부 오브젝트들에서 사용하는 Config(Properties) 정보를 기록
- Secret
- 컨테이너에서 읽혀지거나 사용되는 소량의 민감한 정보
- 특수한 volume이 자동으로 연결되어 container에서 사용 가능
- 수동으로 secret을 생성 하고 연결하여 사용 가능
- Base64로 encoding될 뿐 암호화 되지는 않음
- Volume으로 연결된 File형식 또는 환경 변수 형식으로 사용 가능
컨트롤러 오브젝트(Controller Object)
- Deployment Controller
- pod의 배포 및 관리에 사용
- ReplicaSet을 자동으로 생성
- Pod에 대한 rolling 업데이트 관리
- ReplicaSet
- Replication Controller의 새로운 버전
- 가용성과 확장성 보장
- 사용자의 요청에 따른 pod의 숫자를 유지하고 관리
- 각각의 pod가 필요로하는 정보 명세가 있는 Template을 이용
- StatefulSet
- Deployment와 유사하나 pod별 고정된 identity(name, network id 등) 할당
- v1.9에서 안정화 버전 적용
- 라이선스 등으로 Pod구성이 제한될 때 유리
- DaemonSet
- 모든 Node에 배포되어 실행(Node Selector로 정의하는 경우 일부 Node 실행)
- Node 상태에 따른 Monitoring 용으로 주로 사용(storage관리, log수집 daemon등)
- Job
- 특정 task실행을 위해 하나 혹은 이상의 pod를 생성하고 실행
- pod가 실행 완료하는 것을 보장(실패시 재시도, deadline 설정 가능)
- job 실행 시 pod의 순차 실행 또는 동시 실행 가능
- 모든 pod 실행이 완료 시 job의 완료로 인식하고 사용한 pod를 제거
스토리지(Storages)
- Volume(임시적인 데이터 저장)
- Pod에 연결되어 디렉토리 형태로 데이터를 저장 할 수 있도록 제공
- Pod의 container들 끼리 공유
- Pod와 Life-cycle이 동일하게 적용되어 pod삭제 시 같이 사라짐
- Volume Type
- emptyDir, hostPath
- gcePersistenceDisk, awsElasticBlockStore, azureFileVolume, azureDiskVolume
- nfs, iscsi, cephfs, gitRepo, secret
- persistenceVolumeChaim 등
- PersistenceVolume(영구적인 데이터 저장)
- k8s 클러스터 관리자에 의해 제공된 저장소의 일부
- Volume과 유사하지만 pod와 독립적인 life-cycle을 가짐
- 사용자가 용량, 모드 등 필요한 정보와 함께 PVC(PersistenceVolumeClaim)를 생성하면 이에 대응하는 Persistence Volume이 생성됨
- NFS, iSCSI 또는 Cloud Provider 특화된 storage system으로 제공
- Persistence Volume Type
- GCEPersistenceDiskl AWSElasticBolckStore, AzureFile,AzureDisk,NFS,iSCSI
- CephFS, Cinder, Gluesterfs, VMWare Photon등
- PersistenceVolume(영구적인 데이터 저장)
기타 Cloud Native Tools
- kubectl
- k8s 클러스터 관리자를 위한 CLI(command line interface) 도구
- kubeadm
- 물리 서버, 클라우드 서버 또는 가상 머신에 k8s 클러스터 구성을 쉽게 할 수 있도록 도와주는 CLI도구
- kubefed
- 연합 클러스터 운영을 위한 CLI 도구
- minikube
- 개발이나 테스트를 목적으로 개인 PC에서 단일 노드 k8s 클러스터를 쉽게 제공하는 도구(VirtualBox로 제공)
- Dashboard
- Web UI기반의 k8s 대시보드
- K8S 3rd party tools – Kubernetes Chart & Helm
- *manifest(yml) 타입으로 오브젝트(K8s의 모든 구성요소)를 올리는것이 아닌 chart타입으로 오브젝트를 올리는 방식을 helm이라 함
- Kubernetes chart
- 사전 정의된 k8s 리소스에 대한 패키지
- 필요한 모든 manifest를 메타 데이터와 함께 구성한 일정의 탬플릿
- Linux에서 rpm이나 deb와 유사
- chart저장소는 https://github.com/kubernetes/charts 참고
- Kubernetes Helm
- k8s chart 패키지 관리( 조회, 설치, 갱신 및 삭제)
- Linux의 yum 또는 apt와 유사
- tiler: k8s클러스터 내부에 설치된 서버
- helm; 외부에서 접근하는 클라이언트
이번 포스팅은 여기까지 하도록 하겠습니다. 쿠버네티스 관련 컨텐츠는 계속해서 업데이트 하도록 하겠습니다.
감사합니다.
'Application Modernization > Container & PaaS' 카테고리의 다른 글
Spring Boot로 만든 Hello Minikube 예제 (2) | 2021.10.04 |
---|---|
Minikube(미니큐브) (0) | 2021.10.01 |
Docker Image Repository (0) | 2021.09.29 |
Docker Private Container Registry 만들기 (0) | 2021.09.29 |
자주쓰는 Dockerfile 명령어 (0) | 2021.09.14 |