VM vs Container virtualization은 단일 시스템에서 여러 os 동시에 수행 컨테이너는 동일한 os 커널 공유. 시스템의 나머지 부분으로 프로세스 격리 프로세스와 그에 따른 환경을 격리해 오버헤드가 적음. Docker Networking docker0라는 linux bridge 디바이스가 생성됨. (brctl show) 동일 호스트에서 생성되는 모든 컨테이너들은 같은 docker0에 바인딩 각 컨테이너는 외부 또는 다른 컨테이너와 통신을 위해 linux bridge로 통신 컨테이너와 linux bridge 간 veth pair 생성 각 컨테이너는 의도한 포트만 expose해서 통신 docker0 동일 호스트, 동일 Network Container의 게이트웨이 K8S 클러스터 구성 시에는 CNI0가 docker0 대체 East - West Communication 동일 호스트 Container 간 통신 East - West Communication : Linking 컨테이너가 PM 이나 VM에 떠있든 하나의 프로세스로 동작하며, 어떠한 외부 요인에 의해 쉽게 죽을 수 있음 이러한 Container Lifecycle 특성상 IP를 이용한 통신의 한계를 보완하기 위한 컨셉 Container hosts 파일을 이용, 도메인을 이용한 통신 이 컨셉도 동일 호스트, 동일 brdige 내 Container 간에서만 사용 가능하다는 한계. East - West Communication : Custom network 동일 Network 바인드 Container 간 사설 통신 가능 동일 호스트, 다른 Network 바인드 Container 간 통신 불가 다수 호스트 Container 간 통신은 어떻게 할까 ? Overlay Network add-on 도입 필요(OVS, flannel, Calico, weave, etc) 이러한 컨셉을 K8S가 지원 Network Overlay add-on 별 특징이 있으므로, 상황에 맞는 적합한 add-on 선택 필요 South - North Communication Container expose : -p / -P $ docker run -d -p 8080:80 --name test nginx Kubernetes의 경우는 Service 오브젝트를 통해서 외부에 Container 오픈 : Load Balancer, NodePort Docker 호스트의 iptables를 이용한 DNAT / SNAT 을 통해서 외부와 통신 Kubernetes ? Multi 호스트에 배포된 컨테이너들을 자동으로 관리할 수 있도록하는 매니지먼트 툴 Master - Work (1:N or N:N) Matster Components Kubernetes Master Kubernetes Cluster에서 컨테이너의 관리 및 배포를 관리하는 액세스 제어 플레인. 클러스터 복제패턴에 따라 마스터 수는 1개 이상임. API Server Kubernetes API를 노출하는 컴포넌트로, Kubernetes 오브젝트 관리/제어를 위한 Frontend Scheduler Node가 배정되지 않은 새로 생성된 Pods를 감지하고 그것이 구동될 Node를 선택함 Controller-Manager : 4개의 컨트롤러는 논리적으로는 개별 프로세스이지만 복잡성을 낮추기 위해 단일 바이너리로 컴파일 Node Controller : 노드가 다운되었을 때 통지와 대응 Replication Controller : 모든 Replication Controller Object에 대해 알맞는 수의 Pods를 유지 Service Controller : 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰 생성 etcd 모든 클러스터 데이터를 담는 Key-value 저장소, Replicaset, Controller, Scheduler, Kubelet 등은 etcd에 접근하기 위해 API Server를 통해 접근. Worker Node Component Kubernetes Worker Node : 동작죽인 Pods를 유지, Kubernetes Runtime 환경 제공 Kublet 각 노드에 구동되는 Agent로 Kubernetes Master와 통신하며 Pod Spec에 기술된 컨테이너들이 정상적으로 작동되도록 함. Kube-proxy 호스트 상에서 네트워크 규칙을 유지하고 연결에 대한 포워딩을 수행, 쿠버네트스 서비스 추상화를 가능하도록 함. Container Runtime(Docker, Containered, etc.) Plugin Network 쿠버네티스 기본 네트워크인 kubenet은 기능 제약이 있어 사용자 요구사항에 따라 별더의 CNI 사용 DNS Why Container Orchestration tool ? Overlay Network add-on을 통한 멀티호스트 컨테이너들간의 통신 추가 컨테이너는 어디에 넣어 ? 호스트 리소스와 Affinity 설정 등 여러 요소 기준으로 스케줄링 노드 선정 가능 컨테이너 Failure Resistance ? Replication Controller(Replicaset) : 클러스터 내에서 Pods를 어떤 replica로 유지할 것인가 설정. Container가 죽으면 자동으로 동일 컨테이너를 띄어줌. 호스트가 죽으면 포함되어있던 컨테이너들을 다른 호스트에 스케줄링. Rolling update : 무중단 서비스 지원 Kubernetes 기능 정리 Automatic Binpacking Worker Node의 가용성을 유지하면서 보유한 리소스를 충분히 활용할 수 있도록 스스로 스케줄링하며 컨테이너를 배치 Storage Orchestration 로컬 저장소를 선택하거나 NFS, SCSI 등과 같은 공유 네트워크 스토리지를 컨테이너에 할당, 마운트하여 사용 가능 Secret & Config Management App 연동 및 접근 제어를 위한 보안 키, 설정 내역을 컨테이너 이미지의 변경 없이 업데이트 할 수 있고, 외부로 노출하지 않고 사용 가능. Horizontal Scailing CPU 사용률과 같은 메트릭을 기반으로 Pod의 Deployments, Replicaset을 스케줄링하여 수평적으로 확장 가능 Service Discovery & Load Balancing 컨테이너에 IP 주소를 자동으로 할당하고 클러스터 내 트래픽을 로드 밸런싱 할 수 있는 컨테이너 세트에 단일 DNS 이름을 할당 Self Healing 실패한 컨테이너를 자동으로 다시 시작하고, 사용자가 정의한 헬스체크에 응답이 없는 컨테이너를 종료함. 워커 노드 장애 시 사용 가능한 다른 워커 노드에 컨테이너를 다시 기동함. Batch Execution 컨테이너 기반의 서비스 관리 뿐 아니라 배치를 관리할 수 있으므로 원하는 경우 실패한 컨테이너 대체 가능 Automatic Rollbacks & Rollouts 컨테이너의 응용 프로그램이나 구성에 대한 변경 사항을 점진적으로 업데이트하고 문제 발생 시 자동으로 롤백.