# Kubernetes [[Small Kubernetes]] ## kind - [[k8s v1]] - [[k8s apps]] - [[k8s extensions]] - [[k8s networking]] - [[K8s Autoscale]] - [[k8s namespace]] - [[k8s configmap]] - [[k8s secret]] - [[ingress]] - [[VirtualService]] - [[Job]] - [[PodPreset]] ## Terms - [[레이블]], [[셀렉터]] ## Links - 공식 쿠버네티스 슬랙 채널 http://slack.k8s.io - 쿠버네티스 공개 포럼 https://discuss.kubernetes.io - 쿠버네티스 팟캐스트 https://kubernetespodcast.com - TGI Kubernetes https://github.com/heptio/tgik - https://twitter.com/kubeweekly - https://sreweekly.com - https://www.devopsweekly.com - https://devopsish.com - https://securitynewsletter.co ## Docs - [[클러스터 아키텍처]] - [[CoreDNS]] - [[쿠버네티스 서비스]] ### 새로 개발한 애플리케이션을 쿠버네티스에서 사용하는 과정 1. [[docker build]] 2. [[docker push]] 3. [[kubectl create]] 4. [[kubectl expose]] ### 쿠버네티스 기능 - 배포 계획에 맞춰 애플리케이션을 신속하게 배포할 수 있다 - 컨테이너 개수, CPU 사용률, 메모리 사용량을 설정 가능 - 저장 공간, 네트워크 접근 제어, 로드밸런싱 기능 설정 가능 - 가동 중인 애플리케이션을 스케일 업/다운할 수 있다 - 요청이 많을 때는 컨테이너 수를 늘려서 처리 능력을 높임 - 요청이 적을 때는 컨테이너 수를 줄여서 자원 점유율이나 요금을 줄임 - 새로운 버전의 애플리케이션을 무정지로 업그레이드 할 수 있다 - 하드웨어 가동률을 높여 자원 낭비를 줄인다 ### 쿠버네티스 특징 https://kubernetes.io/ko/case-studies ## k8s 클러스터를 구성하는 코어 프로세스 - [[kubectl]]: k8s 클러스터를 조작하기 위한 도구로 가장 빈번하게 이용되는 커맨드 라인 인터페이스다 - [[kube-apiserver]]: kubectl 등의 API 클라이언트로부터 오는 REST 요청을 검증하고, API 오브젝트를 구성하고 상태를 보고한다. - [[kube-scheduler]]: 쿠버네티스의 기본 스케줄러이며, 새로 생성된 모든 파드에 대해 실행할 최적의 노드를 선택한다. 스케줄러는 파드가 실행 가능한 노드를 찾은 다음 점수를 계산하여 가장 점수가 높은 노드를 선택한다. - [[kube-controller-manager]]: 컨트롤러를 구동하는 마스터상의 컴포넌트 - [[cloud-controller-manager]]: API를 통해서 클라우드 서비스와 연계하는 컨트롤러로, 클라우드 업체에서 개발한다. - [[etcd]]: k8s 클러스터의 모든 관리 데이터는 etcd에 저장된다. 이 etcd는 CoreOS가 개발한 분산 키/값 저장소로 신뢰성이 요구되는 핵심 데이터의 저장 및 접근을 위해 설계 되었다 - [[kubelet]]: kubelet은 각 노드에서 다음과 같은 역할을 수행한다. - 파드와 컨테이너의 샐행 - 파드와 노드의 상태를 API 서버에 보고 - 컨테이너의 동작을 확인하는 프로브 실행 - 내장된 [[cAdvisor]]를 통해 메트릭 수집 및 공개 - [[kube-proxy]]: kube-proxy 는 각 노드에서 동작하며 [[로드밸런싱]] 기능을 제공한다 - 서비스와 파드의 변경을 감지하여 최신 상태로 유지 - [[iptables]] 규칙을 관리 - 서비스명과 [[ClusterIP]]를 내부 [[DNS]]에 등록 - [[coredns]]: 파드가 서비스 이름으로부터 IP 주소를 얻기 위해 사용된다 ## 애드온 컴포넌트 - [[kube-flannel]]: 모든 노드에서 실행되어 여러 노드 사이에서 [[IPv4]] 네트워크를 제공한다. - [[calico-kube-controllers]]: [[calico]]를 위한 컨트롤러. 데이터 스토어로서 etcd를 이용하기 위하여 사용된다 - [[calico-node]]: 모든 노드에서 실행되어 노드 간 파드의 통신, 라우팅, 네트워크 접근 관리 기능을 제공한다 - [[kubernetes-dashboard]]: Web 대시보드 - [[metrics-server]]: [[heapster]]를 대신하여 버전 1.8부터 도입되었다. API의 aggregation layer를 통해서 k8s 클러스터 전체로부터 메트릭을 수집한다 ## 개발자를 위한 쿠버네티스 개념 [디플로이먼트] --> [레플리카세트] [크론잡] --> [잡] [데몬세트] --> [파드] [레플리카세트] --> [파드] [스테이트풀세트] --> [파드] [잡] --> [파드] [레플리케이션 컨트롤러] --> [파드] [파드] <-- [서비스] [파드] <-- [수평적 파드 오토스케일러] [파드] --> [컨테이너] [파드] <-- [스평적 파드 오토스케일리] [파드] <-- [PodDisruption Budget] [컨테이너] --> [볼륨] [볼륨] --> [컨피그맵] [볼륨] --> [시크릿] [볼륨] --> [PersistentVolumeClaim] [볼륨] --> [다운워드 API] [볼륨] --> [HostPath, EmptyDir] ## 주요 구성 요소 ### kubectl 쿠버네티스는 kubectl이라는 커맨드라인 인터페이스를 제공한다. 쿠버네티스 클러스터의 커맨드를 실행하거나 상호 작용하는데 사용한다. ### 마스터 노드 마스터는 쿠버네티스의 두뇌와 같다. 여러 가지 지원 서비스의 도움을 받아 클러스터 동작을 조율한다. [[API 서버]]와 [[스케줄러]]와 [[리플리케이션 컨트롤러]]로 구성된다. 애플리케이션의 상태를 관리하고 스케줄링하고 규모를 늘리거나 줄이는 등의 작업을 관리한다. #### API 서버 API 서버는 쿠버네티스와 상호 작용하는 데 필요한 [[REST]] API를 외부에 제공한다. 클라이언트([[kubectl]])와 쿠버네티스 클러스터 사이에서 일어나는 외부 통신음 모두 이러한 API 서버를 이용해 처리된다. 또한 워커 노드와 마스터 노드 사이에서 발생하는 클러스터 내부 통신도 API 서버를 거친다. 오브젝트의 상태를 저장하기 위해 분산 키-밸류 스토어([[etcd]])와 통신하는 유일한 컴포넌트다. kubectl run myTomcat --image=Tomcat --replicas=3 kubectl은 클러스터 안에 톰캣 인스턴스 3개를 구동하려는 사용자의 '의도', 즉 요청을 API 서버로 전달한다. 그러면 API 서버는 스케줄러, 리플리케이션 컨트롤러와 연동해 요청을 처리함으로써 클러스터를 원하는 상태로 전환한다. ### 워커 노드 워커 노드(worker node)는 포드가 스케쥴링돼 실제로 구동되는 곳이다. 각 워커 노드마다 큐브릿(kubelet)이라 부르는 에이전트가 실행된다. ### 쿠버네티스 클러스터 외부 저장소를 사용하는 것이 적합한 사용 사례 - 스토리지 클러스터는 일부 완전 다른 하드웨어를 사용하거나 네트워킹에 기반한 내부 또는 [[CSI]] 플러그인이 없다. (CSI가 표준이 됨에 따라 드물게 나타남) - 클라우드 공급자에 쿠버네티스를 실행하면 너무 비싸고, 위험하며, 모든 데이터를 마이크레이션하기에 너무 느릴 수 있다. - 조직의 다른 애플리케이션은 동일한 스토리지 클러스터를 사용하며, 조직의 모든 애플리케이션과 시스템을 쿠버네티스로 마이그레이션하는 것은 실용적이지 않고 비경제적인 경우가 많다. - 규제 요건 때문에 데이터의 통제 유지가 필요하다 - 쿠버네티스 외부에서 스토리지를 관리하는 데는 몇 가지 단점이 있다. - 보안 (워크로드에서 별도의 스토리지 클러스터로 네트워크 액세스를 제공해야 한다) - 스토리지 클러스터의 확장, 가용성, 모니터링, 구성을 구현해야 한다. - 스토리지 클러스터 측에서 상황이 변경될 때 종종 쿠버네티스 측에서 해당 구성을 변경해야 한다. - 추가 네트워크 단계나 인증, 권한 부여 또는 암호화로 인해 성능 또는 대기 시간 오버헤드가 발생할 수 있다. ## Docs - [[서비스]] - [[컨트롤러]] - [[OSS]] - [[매니페스트]] - [[사이드카 패턴]] - [[잡 컨트롤러]] - [[k8s 네임스페이스]] - [[K8s 클러스터]] - [[클러스터 가상화]] ## 출처 - [[15단계로 배우는 도커와 쿠버네티스]] - [모든 프로그래머가 알아야 할 지연 시간](http://gist.github.com/jboner/2841832) - [[쿠버네티스로 만나는 손안의 마이크로서비스]]