[TIL] 개발환경 구축을 위한 Docker와 K8S 실습 (5)

이원진·2023년 6월 16일
0

데브코스

목록 보기
50/54
post-thumbnail
post-custom-banner

학습내용


  1. 서버 관리의 어려움

  2. Container Orchestration 소개

  3. Kubernetes 소개

  4. Kubernetes 아키텍처

1. 서버 관리의 어려움


  • 관리해야하는 서버의 수가 늘어날 경우, 어느 서버 혹은 서비스가 어떤 문제를 파악하기 어렵고, 문제들의 가짓수가 늘어나는 등의 어려움이 있음

  • 해결방안 1: 문서화

    • 현재 서비스의 상황과 설정 방법, 문제 해결 방법을 문서화

    • 상황에 따라 의미가 없는 경우가 많고, 지속적으로 업데이트하기 번거로우며 다수의 서버를 문서를 확인하고 일일히 관리하는 것은 거의 불가능하다는 단점 존재

  • 해결방안 2: 코드로 관리

    • DevOps 엔지니어가 반드시 알아야하는 IaaS 기술

    • 대화형 명령보다는 자동화된 스크립트로 다수의 서버에 명령

    • Chef, Puppet, Ansible, Terraform 등 다양한 툴 존재

    • Learning Curve가 높으며, 소프트웨어 충돌 문제 해결에 큰 도움이 되지 않는다는 단점 존재

  • 해결방안 3: Virtual Machine 도입

    • 하나의 물리적 서버에 다수의 VM을 올리고, 서비스별로 하나씩 할당

    • VM은 리소스를 많이 소비하고 느리며, 특정 VM 벤더 혹은 클라우드에 종속된다는 단점 존재

  • 해결방안 4: Docker 도입

    • 모든 소프트웨어를 Docker Image로 만들면, 어디서든 동작함

      • 기본적으로 리눅스 환경에 최적화됨

      • Image를 사용해 버전을 관리하고 배포하며, 문제 발생 시 롤백 용이

    • VM에 비해 리소스 낭비도 적고, 실행 시간도 빠름

    • 오픈소스이기 때문에 특정 클라우드 벤더에 독립적

    • 사용 언어, 환경에 따른 관리 방법에 차이가 없음

      • 개발, 빌드, 등록, 실행 절차가 일관되게 진행(Dev, Test, Production)


    • 모든 서비스를 Docker Image로 만드는 트렌드이기 때문에, 다량의 Container를 효율적으로 관리할 도구가 필요

      • 다수의 Container 동시 관리

      • 놀고 있는 서버, 바쁜 서버 파악

      • 운영되는 서비스 파악

      • 모니터링

      • Container 수의 탄력적 조절


2. Container Orchestration 소개


  • 다량의 Container를 효율적으로 관리하는 기법을 Container Orchestration이라고 부름

  • 한 클러스터 내에 DB, 웹서비스, 백엔드 등 다양한 서비스들이 공존

    • 자원을 요청하면, 마스터가 자원을 할당


  • 기능

    • 소프트웨어 배포

      • 서비스 Image를 Container로 배포

      • 이상 감지 시 이전의 안정된 버전으로 롤백

        • Container의 수가 증가할수록 중요한 기능

    • 스케일링

      • 서버의 사용률을 고려해 특정 서비스의 Container 수를 늘이고 줄이는 것


    • 네트워크

      • 서비스가 다수의 Container로 나눠지며 이들을 대표하는 Load Balancer를 만들어줘야 함

      • 서비스들 간 서로를 쉽게 찾을 수 있어야 함

    • 인사이트

      • 노드 / Container에서 문제 발생 시 해결

      • 플러그인을 통한 로그, 분석 등의 기능 제공

        • 서비스, 문제 분석 및 시각화

  • Mesos, Marathon, Docker Swarm 등 다양한 툴들이 있지만 대부분 Kubernetes(K8S) 사용


3. Kubernetes 소개


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

    • 주로 Docker Container를 대상으로 하지만, 모든 컨테이너 사용 가능

    • 클라우드, 온프레미스 환경에서 모두 잘 동작

  • 가장 많이 사용되는 Container Orchestration 시스템

    • 사용 회사와 커뮤니티가 많고 활발

    • Kubernetes에 기능을 추가한 툴들이 등장

    • 모든 글로벌 클라우드가 EKS, AKS, GKE 등의 서비스로 제공

  • 확장성이 좋아서 ML, CI / CD, Service Mesh, Serverless 등 다양한 환경에서 활용됨

  • 다수의 서버에 컨테이너 기반 프로그램(Docker Container)을 실행하고 관리


4. Kubernetes 아키텍처


  • 마스터 - 노드

    • 각 노드는 물리 혹은 가상 서버

    • 클러스터는 1 + 노드의 집합

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

  • Kubernetes 프로세스

    • 마스터 내에서 여러 프로세스가 수행

      • API Server

        • Container로 동작

        • 클러스터의 진입점

        • 웹 UI, CLI, API 등

      • Scheduler

        • 노드의 상황을 고려해 Pods 생성 및 할당

      • Controller Manager

        • 전체 상황을 모니터링하고 장애 대응 시스템 제공

      • etcd

        • Kubernetes 환경 설정 정보가 저장되는 key / value 스토어로 백업됨

    • Controller runtime

      • 대부분 Docker가 사용됨

  • Kubectl: 커맨드라인 툴

    • kubectl run image_name: Pod 내의 Image 생성 및 실행

    • kubectl cluster-info: 클러스터 세부 정보 조회

    • kubectl get node: 특정 노드 조회

  • Pod

    • Kubernetes는 컨테이너를 바로 다루지 않음

    • Pod: Kubernetes 사용자가 사용하는 가장 작은 빌딩 블록

      • 네트워크 주소를 갖는 self-contained server

    • 보통 1Pod = 1Container로 구성

      • 하나보다 많은 경우, 보통 helper container를 같이 사용

      • 같은 Pod 내에서는 디스크와 네트워크 공유

      • Fail-over를 위해 replica를 지정하고, 다양한 방법으로 복제본 유지


메모


  • Docker를 사용한 Production 환경에서 유의할 점

    • Production 시에는 named volume을 사용

    • Docker Container는 read-only로 사용

      • 내용 수정이 필요할 경우 실행 중인 Container를 수정하지 않고, Image를 새로 빌드

        • CI / CD 환경이 중요

    • 용량 문제와 장애에 대응하기 위해 다수의 Container를 다수의 호스트에서 실행

  • 개인 생산성 향상을 위한 Docker

    • 개발시 필요한 모듈을 Docker Image로 받아와서 Container로 실행

    • 여러 개의 소프트웨어를 연동해서 개발시 docker-compose를 활용

    • 일관된 방식으로, 충돌 없이 소프트웨어 설치 가능


post-custom-banner

0개의 댓글