쿠버네티스란

쿠버네티스란 컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈소스 컨테이너 오케스트레이션 플랫폼 cloud native orchestration이 필요한 이유 자동화 된 스케일링 자동화된 롤아웃과 롤백 자동화된 복수 자동화된 빈패킹 (자원이 놀지 않도록) 시크릿과 구성관리 서비스 디스커버리와 로드밸런싱 스토리지 오케스트레이션 선언적 코드를 사용한 운영

특징

완전오픈소스,가장풍부한 에코시스템 를 구현 어디서나 구동가능 구글에 넘쳐나는 kubernetes reference https://cncf.io

아키텍처

control plane masternode 전체를 통제 관리 kube-apiserver etcd kube-schduler kube-controller-manager()cloud-controller-manager data plane workernode 실제 사용자의 애플리케이션 배포 kubelet kube-proxy container runtime

kubectl

kubernetes 클러스터와 통신하기 위한 cli 도구

kubeconfig

클러스터 인증정보와 컨텍스트 kubectl이 kubenetes와 통신할때 필요한 접속 대상의 서버정보, 인증정보 등을 정의 기본위치: ~/.kube/config cluster users context current-context

간단한 kubectl

k get node k get pod -A k get all k get all -A

kubectl cheatsheet

etcd

쿠버네티스에서 필요한 모든 데이터를 키값 형태로 저장하는 데이터베이스 etcd 가 다운되면 모든 컴포넌트가 미아가 되기 때문에 가용성이 매우 중요 클러스터링하여 분산 실행하는 Rsm replicated state machine 구조

etcd ha 구성 분산합의

etcdctl

etcd를다루기위한 유틸리티 apiversion2,3

kube-apiserver

쿠버네티스 api를 제공하는 핵심구성요소 쿠버네티스 프론트 앤드로서 클러스터로온 요청의 유효성을 검증 다른 컴포넌트 간 통신을 중재 kubectl 유틸리티가 접근하는 주체

kube-scheduler

클러스터 안에서 자원 할당이 가능한 노드중 알맞은 노드를 선택하는 역할 label selector affinity taint toleration

kube-scheduler가없다면 pod를 manual scheduling해주어야함 definition file에 원래느 생략되어 있는 NodeName 필드를 직접 추가해줘야함 pod 스케줄링의 필요성 머신러닝 워크로드를 돌리느 ㄴ특정 ㅔod는 gpu가 탑재된 node에서만 돌아야한다
consumer들은 네트워크 intensive 하므로 전용 node group을 쓰고 싶다 팀별로 node를 나눠서사용하고싶다

pod 스케줄링 분류 사용자가 특정 노드에 pod를 배치하고 싶을때 nodeselector node affinity node anti-affinity inter pod affinity inter pod anti-anffiniry

관리자가 특정 노드에는 pod가 배치되는 것을 막고 싶을때 taints tolerations

tainst and toleration 어떤 pod가 어떤 node에 스케줄링 될 수 있는지를 제한 taints node가 가지게 되는 성격 toleration pod가 가지게 되는 taint에 대한 labels and selector affinity nodeselector 노드에는 라벨을 할당하고 파드에는 nodeselector 필드를 추가하여 특정 ㅗㄴ드에서 구동되도록함 다만 nodeselector는 여러 값을 할당하거나 not 예외처리를 하거나 하는등을 하기는 어려움 nodeaffinity 여러 advanceed 할당을 할 수 있는 만큼 문법이 다소 복잡

labels and selector

kube-controller-manager

다야안 컨트롤러를 실행하는 구성 요소 노드 컨트롤러 잡컨트롤러 엔드포인트 컨트롤러 레플리케이션 컨트롤러 등 각 오브젝트를 관할

컨트롤러 동작예시 노드에 문제가 생겼을때의 노드 컨트롤러 동작 5s 마다 status check를 하다가 node monitor period hearbeat가 도착하지 않으면 40s를 대기하고 unreachable로 마킹하고 nodemonitor grace period 추가로 5m을 더 대기 pod eviction timeout 복구되지 않으면 해당 node의 pod들을 정상node로 재배포 pod가 replica set에 해당하는 경우

cloud-controller-manager

쿠버네티스의 컨트롤러들을 클라우드 서비스 api와 연결해서 관리하는 컴포넌트 csp에 특화된 컨트롤러만을 관리 따라서 onprem환경인경우 이컴포넌트는 없음

kubelet

각 노드에서 동작하는 node agent 컨테이너 런타임과 연계하여 컨테이너의 기동 및 정지 등을 관리 파드스펙 설정을 kube-apiserver로부터 전달받아 파드 컨테이너의 실행을 직접관리 pod가 아니라 process 형태 journalctl -u kubelet

kube-proxy

클러스터 내 각 노드에서 실행되는 네트워크 프록시 가상 네트워크의 동작을 관리 ip translation과 라우팅

kube proxy가 네트워크를 관리할때 쓰는 방법 userspace > iptables> ipvs로 진화 ipvs가 더 다양한 로드밸런싱 알고리즘을 갖고 있고 더 높은 성능을 냄 메모리 오버헤드가 적다

container-runtime

실제로 컨테이너를 실행시키는 런타임환경 가장많이 사용하는 런타임응로 docker 주로 사용 했으나 containerd cri-O docker engine mirantis container runtime

고수준과 저수준 런타임 고수준 containerdd cri docker 저수준 runc runv

k describe node minikube

coredns

kubernetes 클라스터 내부으이 주소 해석이나 서비스 디스커버리에 사용되는 내부 dns 서버

pod

pod간 네트워킹

overlay network 를 구성하여 노드간 네트워크 위에 별도로 flat한 네트워크를구성 cni 파드간 통신을 위해서 cni 브릿지인터페이스를 만들어주고 컨테이너 네트워크 대역을 나눠줌

control plane

protocol direction port range purpose used by
tcp inbound 6443 kubernetes api server all
tcp inbound 2379-2380 etcd server client api kube-apiserver, etcd
tcp inbound 10250 kubelet api self, control plane
tcp inbound 10259 kube-scheduler self
tcp inbound 10257 kube-controller-manager self

worker node(s)

protocol direction port range purpose used by
tcp inbound 10250 kubelet api self,control plane
tcp inbound 30000-32767 nodeport servicest all

버전관리

major minor patch kube-apiserver > 1 controller manager, scheduler kube-apiserver > 2 kubelet kube-proxy