쿠버네티스

Vorhandenheit ·2022년 7월 6일

Kubernetes

목록 보기
1/3

Kubernetes

이력서를 집어넣는 회사를 보다가 보니, 우대사항에서 k8s를 이해하고 있는가를 보게되었습니다. k8s?가 무엇인지 알아보니 쿠버네티스라는걸 알게되었습니다.

1. 쿠버네티스란?

쿠버네티스에 대해 검색하면 도커가 같이 나오는걸 볼 수 있습니다. 처음에는 이게 뜬금없이 여기서 왜틔어나오는지 당황했지만 이에 대해 한번 보겠습니다.

여러 개의 서버를 더 가볍게 다룰 수 있는 도커가 등장하고 많은 컨테이너들이 생겻습니다. 도커 이미지가 점점 많아지면서 이에 따라 관리해야할 컨테이너가 점차 늘어나기 시작합니다.
문제는 이러한 컨테이너가 많아지면서 어떤 컨테이너를 어디에 배포해야할지, 죽은 컨테이너를 다시 살리는 업무까지 .. 해야할 일이 많아지다보니 이 컨테이너들을 관리를 자동화할 툴이 필요하게 되었습니다. 그래서 등장한 것이 쿠버네티스입니다.
즉 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼입니다.

Kubernates가 너무길어서 k와 s사이에 있는 글자 8개를 따서 k8s라고 합니다.

2. 기능

  • 서비스 디스커버리와 로드밸런싱
    DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있습니다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있습니다.

  • 스토리지 오케스트레이션
    로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있습니다.

  • 자동화된 롤아웃과 롤백
    배포된 컨테이너의 원하는 상태를 서술할 수 있고 현재상태를 원하는 상태로 설정하나 속도에 따라 변경할 수 있습니다.

  • 자동화된 빈 패킹(bin packing)
    컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공합니다. 각 컨테이너가 필요로하는 cpu와 메모리를 쿠버네티스에게 지시합니다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 도와줍니다.

  • 자동화된 복구(self-healing)
    컨테이너들을 모니터링하여 컨테이너 중 하나라도 죽으면 그것을 빠르게 재시작시킵니다.

  • 로드밸런싱 : 이용자가 급등할 경우, 쿠버네티스는 해당 웹사이트의 니즈를 수용할 수 있도록 자동으로 새로운 컨테이너를 만들 수 있습니다. 니즈가 줄어들면 지정해둔 최소 숫자로 자동으로 조절됩니다

  • 무중단 서비스 : 쿠버네티스는 점진적 업데이트를 제공하기 떄문에 서비스를 중단하지않고도 애플리케이션을 업데이트 할 수 있습니다

  • 호환성 해결 : 특정 업체에 종속되지않고 클라우드의 환경들을 이전할 수 있습니다.

3. 개념

desired state

쿠버네티스는 내가 원하는 상태(Desired State)와 현재 상태(Current State)를 비교하고, 원하는 상태와 현재 상태가 다르면 현재 상태를 원한느 상태로 변경하는 기능을 수행합니다.

  • Desired state : 원하는 상태라 함은 관리자가 바라는 환경을 말합니다. 얼마나 많은 웹서버가 작동되면 좋은지, 몇번 포트로 서비스를 할지 등을 말합니다.

4. 오브젝트

쿠버네티스는 상태를 관리하기 위한 대상을 오브젝트로 정의합니다.

(1) Pod

배포할 수 있는 가장 작은 단위로 한 개 이상의 컨테이너와 스토리지, 네트워크 속성을 가집니다.
Pod에 속한 컨테이너는 스토리지와 네트워크를 공유하고 서로 localhost로 접근할 수 있습니다.

(2) ReplicaSet

Pod를 여러개 복제하여 관리하는 오브젝트입니다. ReplicaSet은 복제할 개수, 개수를 체크할 라벨 선택자, 생성할 Pod의 설정값 등을 가지고 있습니다.

(3) Service

네트워크와 관련된 오브젝트입니다. Pod를 외부 네트워크와 연결해주고 여러 개의 Pod를 바라보는 내부 로드 밸런서를 생성할 때 사용합니다.

(4) Volume

저장소와 관련된 오브젝트입니다. 호스트 디렉토리를 그대로 사용할 수도 있고 EBS와 같은 스토리지를 동적으로 생성하여 사용할 수도 있습니다.

(5) Deployment

배포 버전을 관리하는 오브젝트입니다. 내부적으로 ReplicaSet을 사용합니다.

5. 아키텍쳐

(1) 마스터-노드 구조

쿠버네티스는 전체 클러스터를 관리하는 마스터와 컨테이너가 배포되는 노드로 구성되어있습니다. 모든 명령은 마스터의 API를 호출하고 노드는 마스터와 통신하면서 필요한 작업을 수행합니다.

A. 컨트롤 플레인 컴포넌트

클러스터의 마스터 노드가 수행하는 각 컨테이너 및 워커 노드 관리는 이 '컨트롤 플레인 컴포넌트'를 통해 이루어집니다.

  • kube-apiserver
    API 서버는 모든 요청을 처리하는 마스터의 핵심 모듈입니다. kubectl의 요청뿐 아니라 내부 모듈의 요청도 처리하며 권한을 체커하며 요청을 거부할 수도 있습니다.
    실제로 하는 일은 원하는 상태를 key-value 저장소에 저장하고 저장된 상태를 조회하는 단순한 작업입니다.
    노드에서 실행 중인 컨테이너의 로그를 보여주고 명령을 보내는 등 디버거 역할도 수행합니다.

  • etcd
    RAFT 알고리즘을 이용해서 클러스터 안의 각 구성요소들에 대한 정보다 key-value 형태로 저장된 데이터베이스 입니다.
    쿠버네티스 클러스터에 노드가 몇 개인지, 각각의 Pod들이 어떤 컨테이너를 들고 어느 노드에서 어떻게 동작하는지 모두 etcd에 기록됩니다.
    클러스터의 모든 설정, 상태 데이터는 여기에 저장되고 나머지 모듈은 stateless하게 동작하기 떄문에 etcd만 잘 백업해두면 언제든지 클러스터를 복구할 수 있습니다.
    etcd는 오직 API서버와 통신하고 다른 모듈은 API 서버를 거쳐 etcd 데이터에 접근합니다.

  • scheduler
    스케쥴러는 할당되지 않은 Pod를 여러가지 조건에 따라 적절한 노드 서버에 할당해주는 모듈입니다.

  • kube-controller-manager
    쿠버네티스에 있는 거의 모든 오브젝트 상태를 관리합니다. 클러스터 안에서 구동되는 다양한 리소스들을 모니터링하여 이들이 원할하게 동작하도록 관리하는 프로세스입니다. 오브젝트별로 분업화되어 Deployment는 ReplicaSet을 생성하고 ReplicaSet은 Pod를 생성하고 Pod은 스케줄러가 관리하는 식입니다.

  • cloud-controller-manager
    클라우드 컨트롤러는 AWS, GCE, Azure 등 클라우드에 특화된 모듈입니다.
    노드를 추가/삭제하고 로드 밸런서를 연결하거나 볼륨을 붙일 수 있습니다. 각 클라우드 업체에서 인터페이스에 맞춰 구현하면 되기 떄문에 확장성이 좋고 많은 곳에서 자체 모듈을 만들어 제공하고있습니다.

B. 노드 컴포넌트

노드 서버는 마스터 서버와 통신하면서 필요한 Pod를 생성하고 네트워크와 볼륨을 설정합니다. 실제 컨테이너들이 생성되는 곳으로, 수백, 수천대로 확장할 수 있습니다.

  • kubelete
    클러스터의 각 노드에서 Pod 안 컨테이너들이 정상 구동되록 조율하는 에이전트입니다. 즉 노드에 할당된 Pod의 생명주기를 관리합니다. 마스터 노드의 스케줄러가 파드를 노드에 할당하면, kubelete이 해당 Pod와 컨테이너를 배치하게 됩니다.
    Pod를 생성하고 Pod안의 컨테이너에 이상이 없는지 확인하면서 주기적으로 마스터에 상태를 전달합니다.
    API 서버의 요청을 받아서 컨테이너의 로그를 전달하거나 특정명령 대신 수행하기도 합니다.

  • kube-proxy
    kube-proxy는 클러스터의 각 노드에서 구동되는 쿠버네티스 네트워크 프록시입니다.
    kubelete가 Pod를 관리한다면 프록시는 Pod로 연결되는 네트워크를 관리합니다. 내/외부 트래픽을 어느 Pod로 포워딩할 것인지에 대한 규칙을 생성합니다.
    TCP, UDP, SCTP 스트림을 포워딩하고 여러 개의 Pod를 라운드로빈 형태로 묶어서 서비스를 제공할 수 있습니다.

5. 동작순서

    1. 클라이언트는 쿠버네티스 api server에 요청
      일반적으로 kubectl을 사용하여 요청합니다.
    1. kube-apiserver는 etcd에 새로운 상태를 저장합니다.
    1. kube-controleer-manager에게 kube-apiserver가 etcd의 상태 변경을 확인하여, 새로운 Pod 생성을 요청합니다.
    1. kube-controller-manage는 새로운 Pod를 생성 kube-apiserver에 전달하고, 이를 전달받은 kube-apiserver는 etcd에 저장합니다.
    1. kube-scheduler는 kube-apiserver에 의해 Pod가 확인되면, 조건에 맞는 Woker Noder를 찾아 해당 Pod를 할당하기위해 kube-apiserver는 etcd에 업데이트
    1. 모든 Worker Node에 kubelete은 자신의 노드에 할당되었지만, 생성되지않은 Pod가 있는지 체크하고 있다면 Pod를 생성합니다.
    1. 해당 Worker Node의 kubelete은 Pod의 상태를 주기적으로 API server에 전달합니다.

6. 다양한 Workload

출처

https://www.youtube.com/watch?v=S3FVcdZcZnA&ab_channel=%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%94NomadCoders
https://subicura.com/2019/05/19/kubernetes-basic-1.html
https://bcho.tistory.com/1257?category=731548
https://malbongcode.tistory.com/156
https://seongjin.me/kubernetes-cluster-components/
https://tech.ktcloud.com/82?category=465864
https://www.youtube.com/watch?v=SNA1sSNlmy0&ab_channel=44BITS

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글