docker(도커) 및 쿠버네티스

쿠버네티스 기초

데이터왕 2023. 12. 30. 10:48

쿠버네티스(k8s)

  • 컨테이너 기반 서비스의 배포,스케일,관리 자동화를 해주는 오픈소스 프레임워크
  • 가장 많이 사용되는 컨테이너 관리(orchestration) 시스템이다.
  • 모든 컨테이너가 가능하지만 컨테이너는 주로 docker가 쓰여서, docker container가 주 대상이다.
  • 물리서버나 가상서버 위에서 모두 동작한다.
  • 카카오, 네이버, 라인, 쿠팡 등 활발히 사용
  • 글로벌 클라우드 업체들이 지원 : EKS( Elastic 아마존),AKS ( Azure 마이크로소프트) ,GKE( Google 구글)
  • 그외 다양한 추가기능 머신러닝(kubeflow), CI/CD(Tekton), Service Mesh(lstio), serverless(kubeless)


k8s 기본구조와 구성요소

  • high availability : 시스템이나 서비스가 지속적으로 가용성을 유지하고 장애가 발생했을 때에도 빠르게 회복할 수 있는 능력. 다수의 서버를 구성하거나, 부하분산, 감시 및 자동화를 통해 장애를 최소화하는게 도움이 된다.

  • 노드들(서버들)은 물리 및 가상서버이다. master가 노드들의 상황을 파악하기 위해 kubelet을 이용한다. 
    virtual network : 노드들간의 연결, pod들간에 연결을 관리. 연결이 필요할땐, 연결해주고 보인이 필요할땐, 분리된 네트워크를 만들어 보안을 보장. 
    + Pod은 하나 이상의 컨테이너를 묶어서 공동으로 실행 하는 단위, 동일한 네트워크 네임스페이스를 공유하여 통신

  • api 서버 : container로 동작한다. 
    + 커맨드라인 cli(kubectl) 으로도 다룰수 있음
    예) kubectl run hello-minikube : 새로운 Pod를 시작 ,
    kubectl cluster-info : 작동 중인 Kubernetes 클러스터의 정보를 제공 ,
    kubectl get node : 클러스터 내의 노드들의 목록을 가져옴

  • scheduler : 노드들의 상황을 고려한 pods의 생성과 할당
  • controller manager : 전체 상황 모니터링 하고, 중단 없이 작동할 수 있게(fault tolerance) 한다.
  • etcd( distributed reliable key-value store ) : k8s 환경 설정 정보가 저장되는 key/value스토어(저장소)

 

pod란 무엇인가?

  1. pod : 사용자가 사용하는 가장 작은 블록(하나 혹은 그 이상의 컨테이너의 집합)
  2. 보통 쿠버네티스에서 컨테이너를 바로 다루지 않고 pod를 다룬다고 보면됨
  3. pod가 하나보다 많을땐, 경우에 따라 helper container가 같이 사용됨.
    +helper container : 주된 애플리케이션 컨테이너가 시작되기 전에 일회성 작업을 수행하는 데 사용.
    처음 설치때만 사용하고 비활성화 되는 init 같은것
  4. Pod 내의 컨테이너들이 서로 독립된 환경이 아니라, 동일한 네트워크 네임스페이스와 디스크 공간을 공유함
  5. fail-over를 방지하기 위해 다양한 방법으로 복제본을 유지한다.
  6. pod는 자체적인 네트워크 주소를 가진 독립된 서버, 내부에서는 컨테이너 간 통신과 데이터 공유가 쉽다.

 

 

환경설정 예

  • kind의 값으로 pod,service,replicaset,deployment가 가능하다.

  • Service: Kubernetes에서 서비스를 정의하여 클러스터 내의 여러 Pod에 접근 가능한 하나의 가상 IP 및 DNS 주소를 제공합니다. Pod의 논리적 그룹에 대한 로드 밸런싱, 서비스 디스커버리, 클러스터 내의 다른 서비스와 통신을 위한 추상화를 제공합니다.
  • ReplicaSet: ReplicaSet은 Pod을 여러 개 복제하고 관리하는 Kubernetes 오브젝트로, 지정된 수의 Pod 인스턴스를 유지하도록 합니다. 애플리케이션의 가용성을 보장하고 스케일링을 가능케 하며, Pod의 상태를 관리하여 원하는 상태를 유지합니다.
  • Deployment:Kubernetes에서 애플리케이션의 배포 및 업데이트를 관리하는 리소스로, ReplicaSet과 Pod을 관리하면서 롤링 업데이트 및 롤백과 같은 기능을 제공합니다. Deployment를 통해 애플리케이션의 버전 업데이트, 스케일 인/아웃 등을 쉽게 수행할 수 있습니다.

  • metadata : 오브젝트의 이름, 네임스페이스, 레이블 등의 정보를 포함하며, 오브젝트를 식별하고 구성하는 데 사용
  • spec : 오브젝트의 원하는 상태를 기술하며, Pod의 경우 컨테이너 이미지, 볼륨, 네트워크 설정 등이 여기에 속함

pod 생성예

  1. Kubernetes 클러스터에 Pod을 생성
    `kubectl create -f pod-definition.yml`:
       - `-f` 옵션 다음에는 Pod을 정의한 YAML 파일인 `pod-definition.yml`이 주어집니다.
       - YAML 파일에는 Pod의 메타데이터, 스펙 등이 정의되어 있어야 합니다.

  2. 현재 Kubernetes 클러스터에서 실행 중인 Pod 목록을 조회
    `kubectl get pods`:
       - 각 Pod의 이름, 상태, 시작 시간 등의 정보를 출력합니다.

  3. 이름이 "nginx"인 Pod에 대한 상세 정보를 출력
    `kubectl describe pod nginx`:
       - Pod의 메타데이터, 레이블, 이벤트, 컨테이너 상태 등을 자세히 보여줍니다.

  4. 새로운 Pod을 실행하도록 명령
    kubectl run nginx --image nginx`:
       - `nginx` 이미지를 사용하며, 이 명령어는 Deployment를 생성하여 Pod을 관리하는 형태로 동작합니다. (최근 버전의 kubectl에서는 Deprecated 되었을 수 있음)

 

쿠버네티스 사용 실제예

 

쏘카 데이터 그룹 - Airflow와 함께한 데이터 환경 구축기(feat. Airflow on Kubernetes)

지난 3년간 Airflow 구축 및 운영기록

tech.socarcorp.kr

 

버킷플레이스 Airflow 도입기 - 오늘의집 블로그

탁월한 데이터플랫폼을 위한 Airflow 도입기

www.bucketplace.com

 

쿠버네티스로 다음에 해볼만한 것들

  • docker image를 어떻게 배포할것인가? (블로그의 도커관련 글 참조)
  • docker-compose를 통해 multi-container 관리방법 (블로그의 도커관련 글 참조)
  • 쿠버네티스를 사용해 container 관리하고 배포하기
  • 네트워크 관련해 외부와 연결설정하기 (cluster ip,nodeport,load balancer, ingress, 서비스 타입)
  • 부하에 따라서 컨테이너 수를 늘리기(스케일 아웃)