Kubernetes(K8s)에 대한 이해와 주요 구성요소

정재현·2023년 8월 8일
0

Development

목록 보기
2/6

0. Docker와 차이점

  • Docker는 컨테이너화 플랫폼 및 런타임이며 Kubernetes는 여러 컨테이너 런타임에서 컨테이너를 실행하고 관리하기 위한 플랫폼이다. Kubernetes는 Docker를 포함한 수많은 컨테이너 런타임을 지원한다.

1. Kubernetes(K8s) 소개

**흔히 K8s라고 줄여서 부르는 Kubernetes는 컨테이너화된 애플리케이션을 자동화, 확장, 관리하기 위해 설계된 컨테이너 오케스트레이션 플랫폼이다. 컨테이너는 애플리케이션을 위한 가볍고 일관된 환경을 제공하지만, 특히 대규모로 여러 개의 컨테이너를 관리하는 것은 어려울 수 있다. 이것이 바로 Kubernetes가 필요한 이유이다.

  • 로드 밸런싱 및 비밀 관리**: 컨테이너화된 애플리케이션의 균형 잡힌 분산을 지원한다. Kubernetes는 애플리케이션 인스턴스(또는 포드) 간의 트래픽 분산을 처리할 뿐만 아니라 데이터베이스 자격 증명이나 API 키와 같은 민감한 정보를 관리하여 애플리케이션 코드에서 안전하게 보호하는 메커니즘도 내장되어 있다.

  • 로드에 따른 확장**: 부하가 증가할 때 특정 이미지를 사용하여 빠르게 여러 애플리케이션 인스턴스를 디플로이먼트할 수 있다. Kubernetes는 CPU 사용량 또는 네트워크 트래픽과 같은 메트릭을 사용하여 확장에 대한 정보에 기반한 결정을 내린다. 이를 통해 리소스를 효율적으로 사용하고 시스템이 증가하는 수요를 처리할 수 있다.

  • 페일오버**: 인스턴스가 실패하면 다른 인스턴스를 자동으로 생성하므로 몇 초 안에 복구된다. Kubernetes는 애플리케이션의 상태를 지속적으로 확인한다. 애플리케이션 중 하나에서 장애가 감지되면 클러스터의 다른 부분에서 장애 인스턴스를 재시작하여 다운타임을 최소화한다.

  • 유연한 디플로이먼트 전략**: 디플로이먼트가 잘못될 경우, 롤백과 같은 유연한 대처가 가능하다. Kubernetes는 여러 가지 디플로이먼트 전략을 지원한다. 애플리케이션의 새 버전에 문제가 있는 경우 안정적인 상태로 쉽게 롤백할 수 있다.

로드밸런싱은 컴퓨터 네트워크 기술의 일종으로, 여러 서버나 자원에 작업을 분산시키는 것을 의미한다.

2. Kubernetes의 주요 구성 요소

2-1. 컨테이너

  • 컨테이너**: 애플리케이션의 실행 단위이다. 이는 완전한 애플리케이션 그 자체일 수도 있고, 부분 기능일 수도 있다.

2-2. 클러스터

  • 클러스터**: Kubernetes 내에서 가장 큰 단위로, 여러 가상 서버들이 결합된 구조를 의미한다. Kubernetes 클러스터는 단순한 단일 머신이 아니라 함께 작동하는 머신(노드)의 집합이다. 이러한 집합적 접근 방식을 통해 Kubernetes는 모든 리소스를 하나의 큰 리소스로 취급할 수 있다.

  • 노드**: 클러스터 내의 가상 서버 혹은 컴퓨팅 엔진 단위이다. Kubernetes 클러스터의 각 머신을 노드라고 한다. 노드는 물리적 머신 또는 가상 머신일 수 있다.

    • 마스터 노드**: 전체 Kubernetes 시스템을 관리 및 통제하는 컨트롤 플레인을 담당한다. 조정 노드이다. 마스터 노드는 Kubernetes 컨트롤 플레인을 관리하여 시스템의 전반적인 상태를 보장한다.
    • 워커 노드**: 디플로이먼트하려는 애플리케이션의 실제 실행을 담당한다. 워커 노드는 마스터 노드로부터 작업을 받아 컨테이너를 실행한다.

2-3. 파드

  • 파드**: Kubernetes에서 생성하고 관리할 수 있는 디플로이먼트 가능한 가장 작은 컴퓨팅 단위이다. 여러 개의 컨테이너를 그룹화한 것이다. 파드를 하나의 디플로이먼트 단위이다. 컨테이너는 단일 애플리케이션을 실행하지만, 파드는 함께 동작해야 하는 여러 컨테이너를 실행할 수 있다. 파드의 모든 컨테이너는 동일한 네트워크 IP, 포트 공간 및 스토리지를 공유한다.

2-4. 레플리카셋

  • 레플리카셋**: 특정 파드의 수를 보장하기 위한 개념이다. 예를 들어, 레플리카 세트를 3으로 설정하면 파드의 수가 항상 3개를 유지하도록 보장된다. 지정된 수의 파드 레플리카가 유지되도록 한다. 파드가 충돌하면, 레플리카셋은 새 파드가 이를 대체하도록 한다.

2-5. 디플로이먼트

  • 디플로이먼트**: 애플리케이션을 디플로이먼트하고 업데이트하는 리소스이다. 디플로이먼트는 레플리카셋을 제어하므로, 레플리카셋을 생성하는 역할도 한다. 디플로이먼트는 단순히 파드를 생성하는 것 외에도 다운타임 없이 파드를 업데이트하고 필요한 경우 이전 버전으로 롤백하는 데 도움을 준다. 이것은 레플리카셋을 제어하고 파드에 선언적 업데이트를 제공하는 상위 레벨 구조이다.

Kubernetes는 컨테이너화된 애플리케이션의 디플로이먼트, 확장 및 관리를 도와주는 강력한 도구이다. 다양한 구성요소를 통해 애플리케이션의 안정성과 확장성을 보장하므로, 컨테이너 기반의 애플리케이션 서비스를 운영하려는 경우 적극적으로 고려해볼 만한 선택이다.

3. Kubernetes와 디플로이먼트 전략

3-1. 제로 다운타임(무중단) 디플로이먼트

Kubernetes를 사용하면 현재 실행 중인 버전에 영향을 주지 않고 업데이트를 수행할 수 있다. 만약 업데이트된 버전에 문제가 발생한다면, 서비스는 이전 버전으로 복구하여 문제없이 계속 실행될 수 있다. 트래픽은 새 버전이 준비된 후에만 새 버전으로 전달되므로 사용자가 서비스 중단을 경험하지 않는다. 이러한 능력을 제대로 이해하려면 디플로이먼트의 디플로이먼트 방식을 알아야 한다.

3-2. Kubernetes 서비스 및 IP 할당

Kubernetes에서 파드는 각자 고유한 IP 주소를 갖게 된다. 간단히 말하면, 하나의 어플리케이션에 여러 파드가 있을 경우 각각의 파드는 다른 IP 주소를 가지고 있고 이러한 IP는 클러스터 외부에 노출되지 않는다. 하지만, 사용자는 여러 파드에 대한 단일 IP로의 접근을 원하게 된다.

3-3. 서비스의 이해

서비스는 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 리소스다. 서비스는 파드 앞에 위치하는 안정적인 엔드포인트이다. 로드 밸런싱과 일관된 IP 주소를 제공하여 사용자 트래픽이 여러 파드 인스턴스 간에 효율적으로 분산되도록 한다. 따라서 서비스를 사용하면, 여러 파드에 대한 단일 IP 접속이 가능하다.

3-4. 레이블을 통한 파드 관리

라벨을 사용하여 특정 애플리케이션 집단의 파드들만을 선택하고 하나의 IP로 연결하는 것이 가능하다. 이를 통해 특정 서비스 오브젝트와 연관된 파드를 정확하게 지정하고 관리할 수 있다. 레이블은 파드와 연관된 키-값 쌍으로 구성되어 있다. 레이블은 버전이나 환경과 같은 특성에 따라 파드를 분류하고 구성할 수 있게 해준다. 서비스는 이러한 레이블에 기반한 셀렉터를 사용하여 트래픽을 전송할 파드를 결정한다.

3-5. 디플로이먼트와 및 롤링 업데이트

디플로이먼트는 애플리케이션 디플로이먼트와 업데이트를 수행하는 Kubernetes의 핵심 리소스다. 이를 통해 애플리케이션을 안전하게 업데이트하면서 동시에 서비스 중단 없이 지속적인 서비스를 제공할 수 있다.

롤링 업데이트를 사용하면 새 파드 버전이 점진적으로 디플로이먼트되고 이전 버전은 단계적으로 제거된다. 이 방식의 가장 큰 장점은 서비스 다운타임 없이 애플리케이션을 업데이트할 수 있다는 것이고, 이 과정에서 문제가 발생하면 Kubernetes는 이전 상태로 쉽게 롤백할 수 있다.

4. Kubernetes 아키텍처 심층 분석

4-1. 컨트롤 플레인

컨트롤 플레인의 구성 요소는 클러스터에 대한 전역 결정(예: 스케줄링)을 내리고 클러스터 이벤트(예: 새 파드 시작)를 감지하고 응답한다.

  • API 서버**: 명령과 쿼리를 위한 진입점 역할을 하며 사용자와 클러스터 간의 통신을 보장한다.
  • 에트시디**: Kubernetes가 모든 클러스터 데이터에 사용하는 일관되고 가용성이 높은 키-값 저장소이다.
  • 컨트롤러 매니저**: 백그라운드 작업을 처리하는 컨트롤러를 조절한다.
  • 스케줄러**: 워커 노드에 파드와 같은 작업을 할당한다.

4-2. Kubernetes의 스토리지

스토리지는 스테이트풀 애플리케이션을 다룰 때 중요한 역할을 한다.

  • 볼륨**: 물리 스토리지에서 추상화된 스토리지 계층을 제공한다.
  • 퍼시스턴트 볼륨(PV) 및 퍼시스턴트 볼륨 클레임(PVC)**: 이는 스토리지 오케스트레이션을 용이하게 하여 파드가 종료된 후에도 데이터가 남아 있는지 확인한다.
  • 스토리지 클래스**: 스토리지 볼륨 세트가 동적으로 프로비저닝되는 방법을 설명한다.

4-3. Kubernetes의 네트워킹

Kubernetes의 뛰어난 기능 중 하나는 파드, 노드 및 외부 세계 간의 통신을 용이하게 하도록 설계된 네트워킹 기능이다.

  • 서비스**: Kubernetes 서비스는 파드 집합과 파드에 액세스하기 위한 정책에 대한 논리적 추상화이다. 서비스 유형에는 클러스터IP, 노드포트, 로드밸런서, 외부 이름이 포함된다.
  • 접근**: 클러스터의 서비스에 대한 외부 액세스를 관리하는 API 오브젝트(일반적으로 HTTP)이다.
  • 네트워크 정책**: 파드가 서로 및 다른 네트워크 엔드포인트와 통신하는 방법에 대한 규칙을 정의한다.

4-4. 구성 및 시크릿

  • 컨피그맵**: 애플리케이션의 외부 구성을 허용하여 구성을 이미지 콘텐츠와 분리한다.
  • 비밀**: 비밀번호, OAuth 토큰, SSH 키와 같은 민감한 데이터를 저장하는 데 사용한다. 컨피그맵과 달리 시크릿 데이터는 암호화된다.

5. 어드밴스 디플로이먼트 패턴

5-1. 카나리아 디플로이먼트

Kubernetes는 애플리케이션의 최신 버전을 안정 버전과 함께 릴리스하여 트래픽의 일부를 새 버전으로 보내는 카나리아 디플로이먼트를 허용한다. 이는 파드 레이블을 조작하고 여러 디플로이먼트 구성을 사용하여 제어할 수 있다.

5-2. 블루-그린 디플로이먼트

블루-그린 디플로이먼트 전략에서는 두 개의 환경(현재 환경은 블루, 새 환경은 그린)이 유지된다. 새 버전을 디플로이할 준비가 되면 트래픽을 파란색 환경에서 녹색 환경으로 전환한다. Kubernetes는 두 개의 별도 파드 세트(블루-그린)를 유지하고 서비스 또는 인그레스 컨트롤러가 원하는 세트를 가리키도록 전환함으로써 이를 지원할 수 있다.

5-3. 수평 파드 자동 스케일링

Kubernetes는 특정 메트릭(예: CPU 사용률)에 따라 디플로이먼트 또는 레플리카 세트의 파드 수를 자동으로 확장 및 축소할 수 있다.

6. 모니터링 및 로깅

6-1. 프로메테우스를 사용한 모니터링

프로메테우스는 Kubernetes 에코시스템에서 널리 사용되는 모니터링 도구이다. 지정된 간격으로 구성된 타깃에서 메트릭을 수집하고, 규칙 표현식을 평가하고, 결과를 표시할 수 있다.

6-2. ELK 스택 또는 로키 스택으로 로깅

로깅의 경우, ELK(Elasticsearch, Logstash, Kibana)가 널리 사용된다. 또는 Kubernetes에 맞게 조정된 Loki-Stack이 로깅을 위한 일련의 솔루션을 제공한다.

7. Kubernetes 예시

  • 보안**: 항상 역할 기반 액세스 제어(RBAC)를 사용하여 액세스를 제한한다. 네트워크 정책을 사용하여 파드 통신을 제한한다.
  • 리소스 관리**: 항상 CPU와 메모리에 대한 리소스 요청과 제한을 정의하여 파드가 필요한 리소스를 얻을 수 있도록 한다.
  • 상태 확인**: 애플리케이션이 원활하게 실행되고 있고 건강한지 확인하기 위해 활성 및 준비 상태 프로브를 구현한다.
  • 백업 및 재해 복구**: 정기적으로 etcd 데이터 저장소를 백업한다. 재해 복구 계획이 마련되어 있는지 확인한다.

8. Kubernetes 에코시스템 및 도구

패키지 관리를 위한 Helm, 서비스 메시를 위한 Istio, 지속적인 개발을 위한 Skaffold와 같이 Kubernetes 경험을 향상시키기 위해 설계된 수많은 도구가 있다.

결론적으로, Kubernetes는 컨테이너 오케스트레이션에 관한 것이 아니다. 애플리케이션을 디플로이먼트, 확장, 모니터링, 관리하기 위한 전체적인 에코시스템을 제공하여 가동 시간, 확장성, 복원력을 극대화한다. 방대한 에코시스템과 유연성 덕분에 컨테이너화된 애플리케이션과 마이크로서비스를 도입하려는 조직에게 최고의 선택이 될 수 있다.

9. 마치며

Kubernetes는 마이크로 서비스 아키텍처의 트렌드와 함께 무중단 디플로이먼트의 중요성이 커지는 현대의 애플리케이션 환경에 아주 적합한 도구다. 이를 통해 안정적이고 지속 가능한 서비스 제공이 가능하다.

reference : https://kubernetes.io/ko/docs/concepts/

profile
BlockChain Engineer

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

좋은 정보 감사합니다

답글 달기