kubernetes이론
Container Orchestration 이 왜 필요한가?
방대한 콘테이너들의 변수를 통제하고 안정적인 서비스를 목표로 하는 운영계에서 단순한 방법이 아닌 보다 체계적으로 관리할 필요가 있다.
Container Orchestration 의 역할
- 스케줄링
- Cluster 관리
- 서비스 Discovery
- 모니터링
- 설정
Container Orchestration Players
Knubernetes , Docker Swarm 등이 있다.
Kubernetes란?
Kubernetes is an open-source system for automating depeloyment, scaling, and management of containerized applications. http://kubernetes.io
- 컨테이너 오케스트레이터(실행 및 관리)
- 다양한 클라우드 및 베어 메탈 환경 지원
- Google Borg에서 시작되어 오픈 소스화됨
- 100% Go 언어로 작성
Kubernetes 특징
-
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성 작업 지원
crontab 형식으로 스케쥴링도 가능
kubernetes 아키텍처
간단히 비유를 하자면
- Kubernetes Cluster Control Plane(Master) : 팀장역할
- Kubernetes Node : Worker 작업자
- Registry : 일
Kubernetes Cluster Control Plane (Master)
-
kube-apiserver
cluster와 상호 작용을 위한 k8s API서버
-
kube-scheduler
worker node에 있는 pod를 스케쥴한다.
-
kube-controller-manager
Deploymnets나 Replication Controller 등 관리
-
kube-cloud-manager
Public Cloud Provider 연동 관리
-
etcd
Master cluster에서 k8s object 저장소로 사용
Kubernetes Node (Worker or Minion)
-
Container runtime
컨테이너 실행을 위한 Docker Engine 포함
-
kubelet
Master의 명령 수행을 위한 k8s 에이전트
-
kube-proxy
인바운드 또는 아웃바운드 트래픽에 대한 네트워크 프록시 담당
-
cAdvisor
Container Advisor는 리소스 사용/성능 통계를 제공
내부 : Master -> kubelete -> Pod
외부 : Ingress Controller -> kube-proxy -> Pod
Kubernetes Object Model
- k8s object에 대한 mainfest를 YAML 형식으로 작성
- Master 노드의 ApI Server를 통해 클러스터에 k8s object 생성
Kubernetes Objects
- Basic objects
- Pod
- Service
- Volume
- Namespace
- Controllers
- ReplicaSet
- ReplicationController
- Deployment
- StatefulSets
- DaemonSet
- Garbage Collection
- Jobs
- CronJob
Pod
- Worker 노드에서 실행되는 컨테이너의 집합
- 하나의 pod에는 한 개 이상의 서비스로 지정될 수 있음 (일반적으로 하나의 Pod 에 하나의 Container)
- 각각의 pod는 고유한 IP가 할당됨(내부 IP)
- 하나의 pod내에서는 PID namespace, network와 hostname을 공유
Service
- Lable Selector로 선택하여 하나의 endpoint로 노출되는 pod의 집합
- 종류 : ClusterIP, NodePort, LoadBalacer, ExternalName
Ingress
-
서비스에 대한 L7(어플리케이션 레이어) 라우터 정의
-
사용자가 직접 서비스에 접근하지 않고 Ingress를 통해 접근
ConfigMap
- pod에 담겨진 container에서 사용되는 구성 값
Secret
- 컨테이너에서 읽혀지거나 사용되는 소량의 민감한 정보
- 특수한 volume이 자동으로 연결되어 container에서 사용가능
- 수동으로 secret을 생성하고 연결하여 사용가능
- Base64로 encoding 될 뿐 암호화 되지는 않음
- Volume으로 연결된 File 형식 또는 환경 변수 형식으로 사용 가능
ReplicaSet
- Replication Controller의 새로운 버전
- 가용성과 확장성 보장
- 사용자의 요청에 따른 pod의 숫자를 유지하고 관리
- 각각의 pod가 필요로하는 정보 명세가 있는 template을 이용
Deployment Controller
- pod의 배포 및 관리에 사용
- ReplicaSet을 자동으로 생성
- Pod에 대한 rolling 업데이트 관리
- 버전별로 다른 여러개의 ReplicaSet을 하나의 Deployment Controller로 묶어서 관리할 수 있음
StatefulSet
- Deployment와 유사하나 pod별 고정된 identity(name , netword id등)할당
- 라이선스등으로 고정된 자원이 필요할 때 사용
- v1.9에서 안정화 버전이 적용된
DaemonSet
- 모든 Node에 배포되어 실행(Node Selector로 정의하는 경우 일부 Node 실행)
- Node 상태에 따른 Monotoring 용으로 주로 사용(storage관리, log 수집 daemon 등)
Job
- 특정 task 실행을 위하 하나 혹은 이상의 pod를 생성하고 실행
- Pod가 실행 완료하는 것을 보장(실패시 재시도, deadline 설정 가능)
- Job 실행시 Pod의 순차 실행 또는 동시 실행 가능
- 모든 Pod 실행이 완료 시 Job의 완료로 인식하고 사용한 Pod를 제거함
Storage
- Volume
- Pod에 연결되어 디렉토리 형태로 데이터를 저장할 수 있도록 제공
- Pod의 container 들끼리 공유
- Pod와 Life-cycle이 동일하게 적용되어 pod 삭제 시 같이 사라짐
- Volume Type
- empyDir, hostPath
- gcePersistentDisk, awsElasticBlockStore, azureFileVolume, azureDiskVolume
- nfs, iscsi, cephfs, gitRepo, secret
- persistentVolmeClaim 등
- PersistentVolume(PV)
- k8s 클러스터 관리자에 의해 제공된 저장소의 일부
- Volume과 유사하지만 pod와 독립적인 life-cycle을 가짐
- 사용자가 용랼, 모드 등 필요한 정보와 함께 PVC(PersistentVolumeClaim)를 생성하면, 이에 대응하는 PersistentVolume이 연결됨
- NFS, iSCSI 또는 Cloud Provider 특화된 storage system으로 제공
- Persistent Volume Type
- GCEPersistentDist, AWSElasticBlockStore, AzureFile, AzureDisk, NFS, iSCSI
- CephFS, Cinder, Gluesterfs, VMWare Photon등
Kubernetes Native Tools
-
kubectl
k&s 클러스터 관리자를 위한 CLI(command line interface) 도구
-
kubeadm
물리서버, 클라우드 서버 또는 가상머신에 k8s 클러스터 구성을 쉽게할 수 있도록 도와주는 CLI도구
-
kubefed
연합 클러스터 운영을 위한 CLI 도구
-
minikube
개발이나 테스트를 목적으로 개인 PC에서 단일노드 k8s클러스터를 쉽게 제공하는 도구(virtualBox로 제공)
-
Dashboard
Web UI 기반의 k8s 대시보드
Kubernetes 3rd party Tools - Helm
- Kubernetes Chart
- 사전 정의된 k8s 리소스에 대한 패키지
- 필요한 모든 mainfest를 메타 데이터와 함계 구성한 일종의 템플릿
- Linux에서 rpm이나 deb와 유사
- chart 저장소는 https://github.com/kubernetes/charts 참고
- Kubernetes Helm
- k8s Chart 패키지 관리(조회,설치,갱신 및 삭제)
- Linux의 yum 또는 apt와 유사
- tiler : k8s 클러스터 내부에 설치된 서버
- helm : 외부에서 접근하는 클라이언트
Kubernetes 3rd party Tools - Kompose
- Docker Compose 사용자들을 Kubernetes로 옮겨올 수 있도록 도와주는 도구
- Docker Compose 파일을 k8s object로 변화
- http://kompose.io 참고
유튜브 강좌
이 포스트는 학습을 목적으로 해당 유튜브의 내용을 발췌하여 정리한 것입니다.
여러분도 한번 보세요. 상당히 유익합니다.
https://www.youtube.com/watch?v=l42GttmnnZ4&list=PLKQw1Ska3hjpnFBbQJJrnJIUE062OCyKo
댓글남기기