DevOps/Docker & K8S

쿠버네티스 오브젝트

SKaSha 2020. 1. 22. 13:05

쿠버네티스 클러스터 다이어그램

컨트롤 플레인

클러스터의 두뇌 역활을 수행하며 컨테이너 스케줄링, 서비스 관리, API 관리 요청 처리 등의 작업을 수행한다.
컨트롤 플레인 컴포넌트는 클러스터 내 마스터 노드에서 실행된다.

kube-apiserver

컨트롤 플레인의 프론트엔드 서버로 API 요청을 처리하며 모든 통신은 kube-apiserver가 중심이다.
특히 etcd에는 kube-apiserver만 접근 가능하다.

etcd

어떤 노드와 리소스가 존재하는지 저장하는 key-value 데이터베이스.
etcd는 서버 하나당 프로세스 1개만 사용할 수 있으므로, 보통 etcd자체를 클러스터링한 후 여러개 마스터 서버에 분산해서 실행해 데이터의 안정성을 보장한다.

kube-scheduler

대기열에서 스케줄링되지 않은 파드를 찾아 생성하고 요청된 파드를 조건에 맞는 노드를 결정하여 실행하는 과정을 책임지는 컴포넌트다.
조건에는 하드웨어 요구사항, 파드들을 같은 노드에서 실행시키는 어피니티, 파드들을 다른 노드로 분산 시키는 안티 어피니티, 특정 데이터가 있는 노드에 할당 등이 있다.
새로운 레플리카가 필요할 경우, 레플리카셋을 통해 디플로이먼트에 요청을 하여 쿠버네티스 데이터베이스에 파드 리소스를 직접 생성하고 동시에 파드는 스케줄러 수신함 대기열에 추가된다.

cloud-controller-manager

클라우드 기반 클러스터는 클라우드 업체와 연동하여 로드 밸런서나 디스크 볼륨 같은 자원을 관리

컨트롤러

디플로이먼트 리소스가 존재하고 작동하는지 관리한다.

노드 컴포넌트

워커 노드는 사용자의 워크로드를 수행한다.

kubelet

클러스터 안 모든 노드에서 실행되는 에이전트로서 파드 컨테이너들의 실행을 직접 관리한다.
노드에 예약된 워크로드를 실행하기 위해 컨테이너 런타임을 관리하고 상태를 모니터링한다.

kube-proxy

클러스터 안에 별도의 가상 네트워크를 설정하고 관리함.
서로 다른 노드에 있는 파드 간 통신이나 파드와 인터넷 사이의 트래픽을 라우팅한다.

컨테이너 런타임

컨테이너를 시작하고 중지하며 컨테이너 간 통신을 처리한다.
가장 많이 알려진 런타임으로 도커가 있고, containerd, runc 같은 런타임도 지원한다.

네임스페이스 (Namespace)

네임스페이스는 쿠버네티스 클러스터 하나를 여러 개 논리적인 단위로 나눠서 사용할수 있도록 해준다.
다음 네임스페이스는 쿠버네티스가 기본으로 생성하는 네임스페이스이다.

  • default: 기본 네임스페이스.
  • kube-system: 쿠버네티스 시스템에서 관리하는 네임스페이스로써, 쿠버네티스 관리용 파드나 설정이 존재함.
  • kube-public: 클러스터 안 모든 사용자가 읽을 수 있는 네임스페이스로써, 클러스터 사용량 같은 정보를 관리함.
  • kube-node-lease: 각 노드의 임대 오브젝트들을 관리하는 네임스페이스.

디플로이먼트 (Deployment)

쿠버네티스에서 상태가 없는(stateless) 앱을 배포할 때 사용하는 가장 기본적인 컨트롤러이다.
컨테이너 이미지 이름, 실행할 레플리카 수 등, 컨테이너를 실행하기 위해 알하야 하는 정보들이 기록된다.
레플리카를 관리할 때는 레플리카셋이라는 오브젝트를 자동으로 생성해서 처리한다.
단순히 실행시켜야 하는 파드의 개수를 유지하는 것 뿐만 아니라 롤링 업데이트 등도 지원한다.

네임스페이스에서 활성화된 모든 디플로이먼트 확인

kubectl get deployments

특정 디플로이먼트 상세 정보 확인

kubectl describe deplyments/[name]

레플리카셋 (ReplicaSet)

레플리카셋은 동일한 파드 집합이나 레플리카들을 관리한다.
파드가 스펙과 동일하지 않게 존재할 경우, 레플리카셋 컨트롤러는 일부 파드를 실행하거나 중지한다.
새로운 버전의 어플리케이션이 롤아웃하여 업데이트할 경우, 디플로이먼트는 새로운 레플리카셋을 생성하고 이전에 존재하던 레플리카셋과 파드는 종료된다.

레플리카세트 vs 레플리케이션 컨트롤러

파드 (Pod)

하나 이상의 컨테이너 그룹으로 구성된 쿠버네티스 오브젝트.
디플로이먼트가 파드를 개별적으로 관리하지 않는 이유는 컨테이너 집합은 함께 스케줄링 되기도 하고, 동일 노드에서 실행될 경우 로컬 통신이나 저장 공간을 공유 해야하기 때문이다.

서비스

파드에 자동으로 라우팅되는 영구적인 IP주소와 DNS 주소를 제공한다.
이를 이용하여 서비스 디스커버리 및 로드 밸런서의 역활을 수행하며 외부에서 들어온 요청을 파드에게 전달한다.

sessionAffinity

Service는 sessionAffinity 기능을 지원하는데, 이는 A클라이언트가 A인스턴스로 접속 후 다시 접속을 요청하면 B인스턴스가 아닌 A 인스턴스로 접속할 수 있게 해주는 기능이다.

서비스 타입

서비스의 타입은 IP 주소 할당 방식과 연동 서비스 등에 따라 나뉜다.

  • Cluster IP
    쿠버네티스 클러스터 내에서만 접속 가능
  • Load Balancer
    외부 IP를 가져서 로드밸런싱 역할
  • NodePort
    클러스터 IP뿐만 아니라 포트도 사용하여 팟에 접근 가능
  • External name
    클러스터 내부에서 외부로 접근할때 주로 사용
    Pod들은 클러스터 IP를 가지고 있기 때문에 클러스터 IP 대역 밖의 서비스를 호출하고자 하면, NAT 설정등 복잡한 설정이 필요합니다.
    서비스가 CNAME값으로 연결되서 클러스터 외부로 접근할 수 있습니다.
    외부로 접근할때 사용하는 값이기 때문에 설정할때 셀렉터가 필요 없습니다.