ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6. 컨테이너 오케스트레이션 - Docker Swarm & Kubernetes
    DevOps/Docker 2023. 5. 31. 15:47

    1. 컨테이너 오케스트레이션

    - 프로덕션 환경에서 컨테이너를 호스팅하는 데 도움을 주는 도구와 스크립트로 구성

    - 컨테이너 오케스트레이션 솔루션은 컨테이너를 호스팅할 수 있는 여러 개의 Docker 호스트로 구성된다.

    - 이렇게 하면 하나가 실패하더라도 다른 컨테이너를 통해 애플리케이션에 액세스할 수 있다.

    - 컨테이너 오케스트레이션 솔루션을 이용하면 수많은 애플리케이션 인스턴스를 명령어 하나로 간단히 배포할 수 있다.

     

    - 어떤 오케스트레이션 솔루션은 사용자가 늘어남에 따라 자동으로 인스턴스 수를 늘린다.

    - 수요가 감소하면 인스턴스 수도 함께 줄인다.

    - 심지어 사용자 로드 지원을 위해 자동으로 추가 호스트를 생성하는 솔루션도 있다.

    - 클러스터링과 스케일링에 국한되지도 않는다.

    - 다른 호스트에서 컨테이너 간의 향상된 네트워킹과 다른 호스트에서의 사용자 요청 로드 밸런싱도 지원한다.

    - 호스트 간의 스토리지 공유 지원과 클러스터 내부 구성 관리 및 보안에도 도움을 준다.

    - 컨테이너 오케이스트레이션 솔루션은 여러가지가 있다.

        ㆍDocker - Docker Swarm

             ○ 설정과 시작은 아주 쉬운데, 복잡한 프로덕션 애플리케이션에 필요한 고급 오토 스케일링 기능 부족

        ㆍGoogle - Kubernetes

              설정과 시작이 어렵지만, 다양한 사용자 정의 배포 옵션을 제공하며 여러 벤더를 지원

              GCP, Azure, AWS 등의 공용 클라우드 서비스 제공업체에서도 지원된다.

        ㆍApache - MESOS

              설정과 시작이 어렵지만, 여러가지 고급 기능을 지원한다.

     

    2. Docker Swarm

    - Docker Swarm을 사용하면 여러 Docker Machine을 단일 클러스터로 결합할 수 있다.

    - Docker Swarm은 높은 가용성과 다른 시스템 및 하드웨어 사이의 로드 밸런싱을 위해 서비스나 애플리케이션 인스턴스를 여러 개의 호스트로 배포해준다.

     

    - Docker Swarm을 설정하려면 Docker가 설치된 여러 호스트가 있어야 한다.

    - 그런 다음 하나의 호스트를 Swarm Manager 라고 불리는 관리자, 마스터로 지정하고 나머지는 슬레이브(slave)나 작업자(worker)로 지정해준다.

    - 지정이 끝나면 Swarm Manager에서  docker swarm init 명령을 실행해 Swarm Manager를 초기화한다.

    - 그럼 작업자에서 실행할 명령어가 출력되는데, 복사한 명령어를 작업자 노드에서 실행해 관리자와 연결 

    - Swarm에 연결되면 작업자는 노드가 되며 서비스를 생성하고 Swarm 클러스터에 배포할 준비가 끝난 것이다.

     

    - 웹 서버의 인스턴스를 실행하려면 docker run 명령어를 실행하고 실행할 이미지의 이름을 지정해야 한다.

    - 이렇게 하면 애플리케이션의 새 컨테이너 인스턴스가 생성되어 웹 서버에 제공된다.

     

    웹 서버의 여러 인스턴스를 실행하려면 클러스터를 어떻게 활용해야 할까?

    - 각 작업자 노드에서 docker run 명령어를 실행하는 것도 한 방법일 수도 있다.

    - 하지만 수백 개의 노드에 각각 로그인해서 일일이 명령어를 실행하는 건 비효율적이다.

    - 직접 로드 밸런싱을 설정하고 직접 각 인스턴스의 상태를 모니터링하고 인스턴스가 실패하면 직접 다시 시작해주고 어떻게 일일하겠는가?

        ㆍ그래서 Docker Swarm 오케스트레이션이 필요

    - Swarm 오케스트레이션의 핵심 요소는 바로 Docker 서비스이다.

    - Docker 서비스는 Swarm 클러스터의 노드 간의 실행되는 단일 애플리케이션 혹은 서비스의 하나 이상의 인스턴스이다.

    - 예를 들면 Swarm 클러스터의 작업자 노드에서 웹 서버 애플리케이션의 여러 인스턴스를 실행하기 위해 Docker 서비스를 생성할 수 있다.

    - 그러려면 관리자 노드에서 이미지 이름이 지정된 docker service create 명령어를 실행해주면 된다.

    - replicas 옵션을 사용해 클러스터에서 실행할 웹 서버의 인스턴스 개수를 지정한다.

        ㆍ각기 다른 작업자 노드에 분산된 웹서버 인스턴스를 개수 만큼 얻는다.

    - docker service 명령어는 작업자 노드가 아니라 관리자 노드에서 실행한다는 점 잊지말고, docker service create 명령어는 환경 변수 -e 나  포트를 퍼블리싱하는 -p 등의 옵션을 전달하는 점, 컨테이너를 네트워크에 연결하는 네트워크 옵션이 있다는 부분 등이  docker run 명령어와 비슷하다.

     

    3. Kubernetes Introduction

    - Docker 에서는 docker run 명령어를 실행함으로써 Docker CLI를 이용해 애플리케이션의 단일 인스턴스를 실행할 수 있었다.

        ㆍ그 어느 때보다 간단히 애플리케이션을 실행했다.

    - Kubernetes에서는 Kube Control이라고 하는Kubernetes CLI를 사용해 한 번의 명령으로 동일한 애플리케이션의 인스턴스를 천 개나 실행할 수 있다.

        ㆍ다른 명령어를 이용하면 2,000개까지 늘릴 수 있다.

        ㆍ심지어 인스턴스와 인프라 자체가 사용자 로드에 따라 자동으로 늘었다가 줄었다가 하게끔 만들 수 있다.

        ㆍ단 하나의 명령만으로도 롤링 업그레이드 방식으로 애플리케이션 인스턴스 2,000개를 차례대로

            업그레이드하는 것도 가능

        ㆍ문제가 발생했을 때도 명령어 한 줄로 이미지 복구를 도울 수 있다.

    - Kubernetes는 AB 테스트 기법을 통해 인스턴스 일부만 업그레이드함으로써 애플리케이션의 신기능 테스트에도 도움을 준다.

    - Kubernetes 개방형 아키텍처는 다양한 네트워크와 스토리지 렌더링도 지원한다.

        ㆍ모든 네트워크 및 스토리지 브랜드가 Kubernetes 용 플러그인을 제공한다.

    - Kubernetes 는 다양한 인증 및 권한 매커니즘도 지원한다.

    - 모든 유명 클라우드 서비스 제공업체는 기본으로 Kubernetes를 지원한다.

     

    - Kubernetes는 Docker 호스트를 사용해 Docker 컨테이너 형태로 애플케이션을 호스팅한다.

        ㆍ꼭 Docker일 필요는 없다.

        ㆍKubernetes는 Docker 외에도 RKT이나 CRI-O 등을 지원한다.

     

    - Kubernetes 클러스터는 노드의 집합으로 구성된다.

        ㆍ노드는 Kubernetes 소프트웨어 도구가 설치된 물리 혹은 가상 머신을 말한다.

        ㆍ작업자 머신인 노드에 Kubernetes가 컨테이너를 실행한다.

     

    그런데 애플리케이션이 실행 중인 노드에 문제가 발생하면 어떻게 될까요?

    - 애플리케이션이 중단되기 때문에 하나 이상의 노드가 필요하다.

     

    - 클러스터는 그룹화된 노드의 집합이다

        ㆍ한 노드에 문제가 생겨도 다른 노드를 통해 애플리케이션에 액세스할 수 있다.

     

    그렇다면 이 클러스터는 누가 관리할까? 클러스터 구성원의 정보는 어디에 저장되고 노드는 어떻게 모니터링되고 노드에 문제가 생기면 실패한 노드의 워크로드는 어떻게 다른 작업자 노드로 이동하나?

    - 여기서 필요한 게 바로 마스터이다.

    - Kubernetes 컨트롤 플레인 컴포넌트가 설치된 노드를 마스터라고 한다.

    - 마스터는 클러스터 내부의 노드를 감시하고 작업자 노드의 컨테이너 오케스트레이션을 실질적으로 관리한다.

     

    - Kubernetes를 시스템에 설치할 때 다음과 같은 컴포넌트가 설치된다.

        ㆍAPI 서버, etcd 서버, kubelet 서비스, 컨테이너 런타임, Docker 등의 엔진 다양한 컨트롤러와 스케줄러 등이 있다.

    - API 서버는 Kubernetes의 프론트엔드 역할을 한다.

        ㆍ사용자, 관리 장치, 명령줄 인터페이스 이 모두가 API 서버와의 통신을 통해 Kubernetes 클러스터와 상호작용한다.

    - etcd 키값 저장소

        ㆍKubernetes가 클러스터를 관리할 때 사용하는 모든 데이터가 etcd라는 분산 키값 저장소에 저장된다.

        ㆍ클러스터에 여러 노드와 복수의 마스터가 있을 때 etcd는 클러스터의 모든 노드에 대한 모든 정보를 분산해서 저장

        ㆍetcd를 통해 마스터 사이에 충돌이 일어나지 않도록 클러스터 내부에 로그를 구현할 수 있다.

    - 스케줄러

        ㆍ작업이나 컨테이너를 여러 노드에 배포해준다.

        ㆍ새로 생성된 컨테이너를 찾아 노드에 할당한다.

    - 컨트롤러

        ㆍ오케스트레이션의 두뇌

        ㆍ노드, 컨테이너, 엔드포인트가 닫힐 때 이를 감지하고 반응하는 역할을 한다.

        ㆍ이럴 때 컨테이너는 새 컨테이너를 띄우겠다고 결정한다.

        ㆍ컨테이너 런타임은 컨테이너 실행에 필요한 기본 소프트웨어이다. -> Docker

    - kubelet

        ㆍ클러스터의 각 노드에서 실행되는 에이전트

        ㆍ에이전트는 컨테이너가 노드에서 예상대로 실행되고 있는지 확인해준다.

    - kube 명령줄 도구, kube 제어 도구, kubectl 등으로 불리는 명령줄 유틸리티

        ㆍkube 제어 도구는 Kubernetes 클러스터에서 애플리케이션 배포 및 관리에 사용하는 Kubernetes CLI 이다.

        ㆍ클러스터에 관련된 정보와 클러스터 내부의 노드 상태 등 여러 정보를 얻는데 쓰인다.

        ㆍkubectl run 명령어는 클러스터에 애플리케이션을 배포할 때 사용된다.

        ㆍkubectl cluster-info 명령어로는 클러스터 정보를 확인할 수 있고,

            kubectl get nodes 명령어는 클러스터의 모든 노드를 나열해준다.

    댓글

Designed by Tistory.