[5/31] TIL - Container-Orchestration, Kubernetes(K8s)

Sangwon Jwa·2024년 6월 2일

데브코스 TIL

목록 보기
41/54
post-thumbnail

📖 학습 주제


  1. 서버 관리의 어려움
  2. Container Orchestration
  3. Kubernetes
  4. 학습 방향

✏️ 주요 메모 사항 소개


서버 관리의 어려움

관리해야하는 서버의 수가 기하급수적으로 늘어나면, '어느 서버가 문제가 있는지?', '어느 서비스가 문제를 갖고 있는지?' 또 '이런 문제들을 얼마나 빨리 알고 해결할 수 있을지?'와 같은 물음에 답하기 곤란한 상황이 일어난다.

이러한 문제를 어떻게 해결하는 지가 중요한데, 요즘은 Infrastructure As Code 라고 해서 자동화된 스크립트를 이용해서 다수의 서버들에 명령을 대신 실행해주는 툴들을 이용한다. 다수의 서버에 설치 작업을 하고, 명령을 내리는 것은 가능하지만, 소프트웨어 충돌 문제에는 크게 도움이 안되는 단점이 있는데, 이를 해결하기위한 수단으로 Docker를 사용한다.

Docker를 사용하면 모든 소프트웨어를 Docker Image로 만들기 때문에 버전 관리, 배포 작업에 용이하고 문제 발생 시 롤백도 쉽다. 또한 VM에 비해 리소스 낭비도 적고 실행 시간도 빠른 장점이 있다. 오픈소스라 클라우드나 특정 업체에 Lock-in 이슈도 없기 때문에 Docker는 이제 서비스 배포의 기본이 됐다. 이제 DevOps 엔지니어들은 모든 서비스를 Docker Image로 만들어서 운영한다.

이렇다보니 다수의 Docker Image들을 더 많은 수의 Docker Container로 실행해야하기 때문에 관리가 힘들다는 점이 부각되었다. 그래서 다음의 문제를 해결하기 위해서 Docker Container를 효율적으로 관리할 수 있는 도구의 필요성이 생겼다.

  • 다수의 컨테이너를 동시에 관리
  • 놀고 있는 서버나 너무 바쁜 서버를 확인
  • MSA의 등장으로 인한 서비스 수 증가로 어떤 서비스들이 있는지 쉽게 찾을 수 있는 방법
  • 모니터링 방법
  • 특정 서비스의 컨테이너 수를 탄력적으로 운영

이런 배경하에 탄생한 것이 Kubernetes와 같은 Container Orchestration 툴이다.


Container Orchestation

Container Orchestration의 기능을 요약하자면 다음과 같다.

  • 한 클러스터 안에 다양한 서비스들이 공존 (DB, Web Service, Backend, ...)
    • 자원 요청을 받으면 마스터가 자원을 할당
  • 다양한 기능 제공
    • 배포 : 개발자가 새로 만든 코드(Docker Image)를 배포, 새로 컨테이너로 실행
    • 스케일링 : 트래픽에 따라 컨테이너의 수를 늘리거나 줄임
      • 한 서비스에 다수의 컨테이너가 있는 경우, 각 서비스 마다 존재하는 로드 밸랜서를 통해 트래픽을 나눠줌
    • 네트워크 : 컨테이너 수나, 배포의 여부와 관계없이 컴포넌트 간의 연결이 매끄럽게 실행
    • 인사이트 : 로그나 실행시간, 실행 효율과 같은 서비스 운영의 인사이트를 제공


소프트웨어 배포

서비스 이미지를 Container로 배포하는 기능을 말한다. 만약 이상이 감지되면 이전 안정 버전으로 롤백한다. 컨테이너의 수가 많을수록 이상 감지와, 롤맥은 큰 이슈가 되기 때문에 DevOps 팀 관점에서 보면 가장 중요한 기능이라고 할 수 있다.


스케일링

트래픽에 따라서 특정 서비스의 Containe 수를 쉽게 늘리고 줄이는 기능을 말한다. 이 때 서버의 utilization도 고려해서 놀고 있는 서버가 없게, 비슷하게 리소스를 할당한다. 이렇게 컨테이너를 추가하면 컴포넌트 간에 통신이 필요할 때, 서버1의 B에 액세스해야 하는지, 서버2의 B에 액세스해야 하는지를 처리하는 기능이 필요하다. 그 기능은 다음에 소개할 네트워크 기능에서 처리한다.


네트워크

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


인사이트

다양한 인사이트를 제공하여 운영을 돕닌 기능을 말한다. 다음과 같은 예를 들 수 있다.

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

이러한 Container Orchestration 툴들은 여러개가 존재한다. 그 중 가장 유명한 툴은 K8s 또는 Kubernetes라고 부르는 툴이다. 워낙 지배적인 점유율을 갖고있기 때문에 현재 Container Orchestration 기술은 K8s를 중심으로 정리가 되고 있고 모든 클라우드 업체들은 K8s 관련 서비스들을 내놓고 있다. (EKS, AKS, GKE)


Kubernetes (K8s)

Kubernetes는 컨테이너 기반 서비스 배포/스케일/관리 자동화를 해주는 오픈소스 프레임워크이다. 어느 컨테이너이던 가능하지만 주로 Docker Container들이 대상이 되고, 클라우드나 On-premis 환경 모두에서 잘 동작한다.

Kubernetes는 다음과 같은 특징이 있다.

  1. 확장성이 좋아서 다양한 환경에서 사용
    • 머신러닝 : Kubeflow
    • CI/CD : Tekton
    • Service Mesh : Istio
    • Serverless : Kubeless

 

  1. 다수의 서버에 컨테이너 기반 프로그램을 실행하고 관리
    • 컨테이너 기반 프로그램 == Docker Container
    • Pod : 같은 디스크와 네트워크를 공유하는 1+ 컨테이너들의 집합

K8s 아키텍처

Kubernetes는 기본적으로 다수의 서버(노드)로 이루어져 있다. 이 서버들은 물리서버나 가상서버로 구성할 수 있다. 이런 1개 이상의 노드들의 집합을 클러스터라고 한다.

 

Master는 클러스터를 관리하는 역할을 수행하는 장치로, Master가 없으면 클러스터가 동작하지 않기 때문에 보통 백업을 같이 만들어서 High Availability를 구현한다. High Availability란 어떤 서비스를 두개 이상의 서버로 구성하여 한 서버가 다운되도 계속해서 서비스가 운영되게 하는 것을 말한다. 사용자는 이 Master를 이용해서 Kubernetes의 다양한 기능들을 사용할 수 있다.

 

Master 안에는 다음과 같은 여러 프로세스들이 동작하고 있다.

  • API Server (컨테이너로 동작) : kube-apiserver
    • Entrypoint of K8s cluster
    • Web UI, CLI(kubectl), API 등을 이용하여 사용
  • Scheduler
    • Pods 생성과 할당 (노드들의 상황 고려 - utilization)
  • Controller Manager
    • 전체 상황을 모니터링하고 falut tolerance 보장
  • etcd
    • Master는 High Availability가 중요함
    • K8s 환경 설정 정보가 저장되는 key/value 스토어로 백업

Pod

Pod란 네트워크 주소를 갖는 self-contained server로, K8s 사용자가 사용하는 가장 작은 빌딩 블록이라 생각하면 된다. Kubernetes를 사용할 때 컨테이너를 바로 다루지는 않고, 이 Pod를 이용해서 컨테이너를 조작할 수 있다.

보통은 1개의 Pod는 1개의 Container로 구성되지만, 하나보다 많은 경우에는 보통 helper container가 같이 사용된다. 같은 Pod 내에서는 디스크와 네트워크가 공유되고, Fail-over를 위해 replicas를 지정하는 것이 일반적이다. 이 말고도 다양한 방법으로 복제본을 유지하는 것이 중요하다.

yml파일에서 Pod를 지정하는 예제는 다음과 같다.

Pod를 CLI(kubectl) 환경에서 생성하는 명령어는 다음과 같다.

  • kubectl create -f pod-definition.yml : yml파일의 내용을 바탕으로 Pod 생성
  • kubectl get pods : 돌고 있는 모든 Pod 출력
  • kubectl describe pod nginx : nginx라는 pod의 정보 출력
  • kubectl run nginx --image nginx : 특정 이미지를 바탕으로 컨테이너를 실행하고 pod로 둘러 쌓음 (pod 이름: nginx)

학습 방향

  • 만들어진 Docker Image를 어떻게 배포하고 스케일할 것인가?
    • Docker를 모르면 K8s를 이해하기 힘듬
  • 먼저 docker-compose를 통해 Multi-Container 관리를 하는 것을 배우는 것이 좋음
  • 다음으로 K8s를 사용하여 Container를 관리하고 배포하기
    • 실습 환경 설정, kubectl 사용, 개념 이해 (pod, deployment, service 등등)
  • 네트워크 관련해서 외부와 연결 설정하기
    • Cluster IP, NodePort, Load Balancer, Ingress, 서비스 타입, 서비스 디스커버리 등등
  • 스케일 아웃하기
    • 부하에 따라서 컨테이너 수 조정 (Auto-Scaling, 최소 리소스 설정 등등)

0개의 댓글