개발 기록장

05. Kubernetes(K8s) 본문

데브코스(DE)/Docker & K8S

05. Kubernetes(K8s)

jxwxnk 2024. 5. 31. 22:26
반응형

학습 주제: Docker 정리, Kubernetes(K8s)

Docker 정리

Docker 관련 용어

Docker 란?
: 소프트웨어를 이미지 -> 컨테이너화 하여 독립된 환경에서 실행할 수 있는 플랫폼, 다른 소프트웨어와의 의존성을 줄일 수 있다.

  • Docker Image: 소프트웨어를 패키지화 한 것(독립적)
  • Dockerfile: Docker Image 빌드하기 위한 명령어를 담은 텍스트 파일, Docker Image를 Docker Container화 하기 위한 환경설정 파일
  • Docker Container: Image를 기반으로 만들어진 SW의 독립된 환경
  • Docker Hub (hub.docker.com): Docker Image를 위한 Reop. 생성 한 Image를 다른 사람(팀원)과 공유하여 사용하거나 Docker Hub로 부 터 새로운 이미지를 다운받아 사용
  • Docker Compose: 다수의 컨테이너 Docker 애플리케이션을 정의하고 다루기 위한 것(편의성 증대)

Docker 실제 Production 환경에서 사용 시 유의할 점

  • Docker volumes
    • Host volume은 보통 개발 시 소스코드르 바로 container 안으로 마운트하기 위함
    • Production에서는 named volumes를 써야함
  • Docker container는 read-only로 사용
    • 내용을 바꿔야한다면 실행 중인 컨테이너를 수정하지 말 것
    • 항상 이미지를 새로 빌드하고 다시 컨테이너들을 새로 론치
    • 자동화가 중요해짐: CI/CD 프로세스
  • 다수의 Docker Container들을 다수의 호스트들에서 실행 필요
    • 용량 문제와 Fail-over(또는 fail-tolerant)

개인 생산성 향상을 위해 Docker 사용

  • 개발 시 필요한 모듈을 Docker 이미지로 받아와서 Container로 실행
  • 여러 소프트웨어를 연동해서 개발 시 이것들을 docker-compopse로 설정

장점

  • 일관된 방식으로 소프트웨어 설치(문서화하고 매뉴얼하게 설치 불필요)
  • 분리된 충돌없는 환경에서 소프트웨어 설치/실행

서버 관리의 어려움

: 복잡한 다수의 서버로 구성된 시스템을 효율적으로 관리하기는 어려운 일

해결방안: 문서화

  • 현재의 서비스 상황과 셋업 방법 문서화
  • 다양한 문제 발생 시 해결 방법 문서화
  • 문서를 현재 상황에 맞게 업데이트하는 것은 엄청난 노력
    • 상황에 따라 의미 없는 경우도 많음
  • 몇백 대의 서버를 일일이 관리하고 명령을 실행한다는 것은 거의 불가능에 가까운 일

해결방안: 문서화가 아닌 코드로 대신

  • Infrastructure As Code: DevOps 엔지니어가 꼭 알아야 하는 기술
  • 문서보다는 코드로 관리
    • 대화형 명령보다는 자동화된 스크립트로 해결
    • 다수의 서버들에 명령을 대신 실행해 줌
  • 다양한 툴들이 존재
    • Chef
    • Puppet
    • Ansible
    • Terraform
  • 단점
    • Learning curve가 높음
    • 설치 시 소프트웨어 충돌 문제에는 크게 도움이 안 됨

해결방안: Virtual Machine 도입

  • 소프트웨어 충돌 해결을 위해 VM을 사용
    • 한 Physical Server에 다수의 VM을 올리고 서비스별로 VM을 하나씩 할당
  • 단점
    • VM이 전반적으로 리소스 소비가 크고 느림
    • 결정적으로 특정 VM 벤더 혹은 클라우드에게 종속됨(Lock-in)

해결방안: Docker의 도입

  • 모든 소프트웨어를 Docker Image로 만들면 어디서든 동작함
    • 기본적으로 리눅스 환경에 최적
  • VM에 비해 리소스 낭비도 적고 실행 시간도 빠름
  • 오픈소스이므로 클라우드나 특정업체 Lock-in 이슈도 없음
  • 거의 단점 없음
    • 하지만 Docker Container의 수가 늘어나면서 관리가 힘들다는 점이 부각됨

Docker의 장점

  • Container 생성이 쉽고 빠름(VM과 비교했을 때)
  • Image를 통해 버전 관리를 하고, 배포 후 문제 발생 시 롤백이 용이함
  • 사용 언어 등의 환경에 따른 관리방법에 차이가 없음(환경의존성 X)
    • 개발, 빌드, 등록, 실행 절차가 일관되게 만들어짐(Dev, Test, Production)
    • 개인 컴퓨터와 프로덕션 환경이 동일
  • 오픈소스이므로 특정 클라우드 벤더나 업체와 독립적

Docke은 서비스 배포의 기본이 됨

  • 많은 DevOps 엔지니어들은 모든 서비스를 Docker Image로 만들어서 운영
  • 즉, 빌드 프로세스 출력물은 Docker Image가 되고 있음
    • Github에서 빌드 프로세스를 보면 docker image를 만들고 이를 내부 Registry에 등록하는 것이 일반적
  • 따라서, 다수의 Docker Image들을 더 많은 수의 Docker Container로 실행 관리하는 것이 필요해짐
  • 모든 것의 컨테이너화: Containerization

Container Orchestration 소개

: 다수의 Container을 효율적으로 관리하는 것

Container Orchestration 기능: 요약

  • 한 클러스터 안에 당야한 서비스들이 공존함(DB, Web Service, Backend 등)
    • 자원 요청을 받아 마스터가 자원을 할당
  • 다양한 기능 제공: 배포, 스케일링, 네트워크, 인사이트 등

Container Orchestration 기능: 소프트웨어 배포

  • 서비스 이미지를 Container로 배포
  • 이상이 감지되면 안정적이었던 이전 버전으로 롤백
    • ex) v1에서 v2로 배포되는 경우 문제 발생하면 v1으로 롤백
    • Container의 수가 많을수록 큰 이슈가 됨
    • DevOps 팀 관점에서 보면 가장 중요한 기능

Container Orchestration 기능: 스케일링

  • 특정 서비스의 Container 수를 쉽게 늘리고 줄이는 것
    • 이때 서버의 utilization도 고려

Container Orchestration 기능: 네트워크

  • 서비스가 다수의 컨테이너로 나눠지면서 이들을 대표하는 Load Balancer를 만들어주어야 함
  • 서비스들간에 서로를 쉽게 찾을 수 있어야 함
    • 서비스 디스커버리

Container Orchestration 기능: 인사이트

  • 노드/컨테이너 문제 시 해결
    • 예를 들어, 서버 2의 어떤 기능이 다운되면 이를 서버 3에서 재실행
    • 그에 맞게 로드밸런서 정보도 수정
  • Logging/Analytics 등의 기능 제공
    • 외부 서비스 plug and play
  • 전체 서비스 분석
    • 시각화
    • 문제 분석

Container Orchestration Tool

  • Mesos
  • Marathon
  • DEIS
  • Rancher
  • Nomad
  • Docker Swarm
  • Kubernetes(K8s): 대부분 K8s 사용, 모든 클라우드 업체들은 이것 관련 서비스를 내놓고 있음(ex. EKS, AKS, GKE)

Kubernetes(K8s)

Kubernetes(K8s) 소개

  • 컨테이너 기반 서비스 배포/스케일/관리 자동화 해주는 오픈소스 프레임 웍

    • 구글에서 사용하던 Borg 서비스를 오픈소스화 함(2015년)
    • 클라우드나 on-prem 모두에서 잘 동작
    • 어떤 컨테이너에서도 가능하지만 주로 Docker Container들이 대상이 됨
    • 물리서버나 가상서버 위에서 모두 동작
  • 지금은 Cloud Native Computing Foundation이라는 비영리 단체에서 운영

    • 클라우드 환경에서 어떻게 소프트웨어를 배포하는 것이 효율적인가
      • 컨테이너, 서비스메시, 마이크로서비스, API, DevOps, On-demand Infra
  • 가장 많이 사용되는 컨테이너 관리(Orchestration) 시스템

    • 사용회사와 커뮤니티 활동이 굉장히 많고 활발함
    • 카카오, 네이버, 라인, 쿠팡 등의 국내 업체도 활발히 사용
    • 모든 글로벌 클라우드 업체들이 지원: EKS, AKS, GKE
  • 확장성이 좋아 다양한 환경에서 사용됨

    • 머신러닝: Kubeflow
    • CI/CD: Tekton
    • Service Mesh: Istio
    • Serverless: Kubeless
  • 다수의 서버에 컨테이너 기반 프로그램을 실행하고 관리

    • 컨테이너 기반 프로그램: Docker Container
    • 보통 Docker와 K8s는 같이 사용됨
    • Pod: 같은 디스크와 네트워크를 공유하는 1+ 컨테이너들의 집합

Kubernetes(K8s) 아키텍처

기본 구조

마스터 - 노드

  • 노드는 물리서버이거나 가상서버

    • Kubelet: 마스터와 통신하는 에이전트
  • 클러스터는 1+ 노드의 집합

  • 마스터는 클러스트를 관리하는 역할 수행

K8s 프로세스

  • Master안에는 여러 프로세스들이 돌고 있음
    • API Server(Container로 동작): Kube-apiserver
      • Entrypoint of K8s cluster
      • Web UI, CLI(Kebectl), API
    • Scheduler
      • Posd 생성과 할당(노드들의 상황 고려 - utilization)
    • Controller Manager
      • 전체 상황을 모니터링하고 fault tolerance 보장
    • Master는 Hign Availability가 중요함
    • etcd
      • K8s 환경 설정 정보가 저장되는 key/value 스토어로 백업됨
  • Controller runtime
    • 대부분 Docker가 사용됨

Pod란?

  • K8s 사용시 컨티에너를 바로 다루지 않음
  • Pod: K8s 사용자가 사용하는 가장 작은 빌딩 블록
  • 1 Pod = 보통은 하나의 container로 구성
    • 하나보다 많은 경우에는 보통 helper container가 같이 사용됨
      • 같은 Pod 안에서는 디스크와 네트워크가 공유됨
    • Fall-over를 위해 replicas를 지정하는 것이 일반적
      • 다양한 방법으로 복제본을 유지
  • Pod는 네트워크 주소를 갖는 self-contained server
반응형

'데브코스(DE) > Docker & K8S' 카테고리의 다른 글

04. Docker Compose  (0) 2024.05.30
03. Docker Volume과 다수 컨테이너 SW 다루기  (0) 2024.05.29
02. Docker에서 웹 서비스 실행  (0) 2024.05.28
01. Docker  (0) 2024.05.28