**흔히 K8s라고 줄여서 부르는 Kubernetes는 컨테이너화된 애플리케이션을 자동화, 확장, 관리하기 위해 설계된 컨테이너 오케스트레이션 플랫폼이다. 컨테이너는 애플리케이션을 위한 가볍고 일관된 환경을 제공하지만, 특히 대규모로 여러 개의 컨테이너를 관리하는 것은 어려울 수 있다. 이것이 바로 Kubernetes가 필요한 이유이다.
로드 밸런싱 및 비밀 관리**: 컨테이너화된 애플리케이션의 균형 잡힌 분산을 지원한다. Kubernetes는 애플리케이션 인스턴스(또는 포드) 간의 트래픽 분산을 처리할 뿐만 아니라 데이터베이스 자격 증명이나 API 키와 같은 민감한 정보를 관리하여 애플리케이션 코드에서 안전하게 보호하는 메커니즘도 내장되어 있다.
로드에 따른 확장**: 부하가 증가할 때 특정 이미지를 사용하여 빠르게 여러 애플리케이션 인스턴스를 디플로이먼트할 수 있다. Kubernetes는 CPU 사용량 또는 네트워크 트래픽과 같은 메트릭을 사용하여 확장에 대한 정보에 기반한 결정을 내린다. 이를 통해 리소스를 효율적으로 사용하고 시스템이 증가하는 수요를 처리할 수 있다.
페일오버**: 인스턴스가 실패하면 다른 인스턴스를 자동으로 생성하므로 몇 초 안에 복구된다. Kubernetes는 애플리케이션의 상태를 지속적으로 확인한다. 애플리케이션 중 하나에서 장애가 감지되면 클러스터의 다른 부분에서 장애 인스턴스를 재시작하여 다운타임을 최소화한다.
유연한 디플로이먼트 전략**: 디플로이먼트가 잘못될 경우, 롤백과 같은 유연한 대처가 가능하다. Kubernetes는 여러 가지 디플로이먼트 전략을 지원한다. 애플리케이션의 새 버전에 문제가 있는 경우 안정적인 상태로 쉽게 롤백할 수 있다.
로드밸런싱은 컴퓨터 네트워크 기술의 일종으로, 여러 서버나 자원에 작업을 분산시키는 것을 의미한다.
클러스터**: Kubernetes 내에서 가장 큰 단위로, 여러 가상 서버들이 결합된 구조를 의미한다. Kubernetes 클러스터는 단순한 단일 머신이 아니라 함께 작동하는 머신(노드)의 집합이다. 이러한 집합적 접근 방식을 통해 Kubernetes는 모든 리소스를 하나의 큰 리소스로 취급할 수 있다.
노드**: 클러스터 내의 가상 서버 혹은 컴퓨팅 엔진 단위이다. Kubernetes 클러스터의 각 머신을 노드라고 한다. 노드는 물리적 머신 또는 가상 머신일 수 있다.
Kubernetes는 컨테이너화된 애플리케이션의 디플로이먼트, 확장 및 관리를 도와주는 강력한 도구이다. 다양한 구성요소를 통해 애플리케이션의 안정성과 확장성을 보장하므로, 컨테이너 기반의 애플리케이션 서비스를 운영하려는 경우 적극적으로 고려해볼 만한 선택이다.
Kubernetes를 사용하면 현재 실행 중인 버전에 영향을 주지 않고 업데이트를 수행할 수 있다. 만약 업데이트된 버전에 문제가 발생한다면, 서비스는 이전 버전으로 복구하여 문제없이 계속 실행될 수 있다. 트래픽은 새 버전이 준비된 후에만 새 버전으로 전달되므로 사용자가 서비스 중단을 경험하지 않는다. 이러한 능력을 제대로 이해하려면 디플로이먼트의 디플로이먼트 방식을 알아야 한다.
Kubernetes에서 파드는 각자 고유한 IP 주소를 갖게 된다. 간단히 말하면, 하나의 어플리케이션에 여러 파드가 있을 경우 각각의 파드는 다른 IP 주소를 가지고 있고 이러한 IP는 클러스터 외부에 노출되지 않는다. 하지만, 사용자는 여러 파드에 대한 단일 IP로의 접근을 원하게 된다.
서비스는 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 리소스다. 서비스는 파드 앞에 위치하는 안정적인 엔드포인트이다. 로드 밸런싱과 일관된 IP 주소를 제공하여 사용자 트래픽이 여러 파드 인스턴스 간에 효율적으로 분산되도록 한다. 따라서 서비스를 사용하면, 여러 파드에 대한 단일 IP 접속이 가능하다.
라벨을 사용하여 특정 애플리케이션 집단의 파드들만을 선택하고 하나의 IP로 연결하는 것이 가능하다. 이를 통해 특정 서비스 오브젝트와 연관된 파드를 정확하게 지정하고 관리할 수 있다. 레이블은 파드와 연관된 키-값 쌍으로 구성되어 있다. 레이블은 버전이나 환경과 같은 특성에 따라 파드를 분류하고 구성할 수 있게 해준다. 서비스는 이러한 레이블에 기반한 셀렉터를 사용하여 트래픽을 전송할 파드를 결정한다.
디플로이먼트는 애플리케이션 디플로이먼트와 업데이트를 수행하는 Kubernetes의 핵심 리소스다. 이를 통해 애플리케이션을 안전하게 업데이트하면서 동시에 서비스 중단 없이 지속적인 서비스를 제공할 수 있다.
롤링 업데이트를 사용하면 새 파드 버전이 점진적으로 디플로이먼트되고 이전 버전은 단계적으로 제거된다. 이 방식의 가장 큰 장점은 서비스 다운타임 없이 애플리케이션을 업데이트할 수 있다는 것이고, 이 과정에서 문제가 발생하면 Kubernetes는 이전 상태로 쉽게 롤백할 수 있다.
컨트롤 플레인의 구성 요소는 클러스터에 대한 전역 결정(예: 스케줄링)을 내리고 클러스터 이벤트(예: 새 파드 시작)를 감지하고 응답한다.
스토리지는 스테이트풀 애플리케이션을 다룰 때 중요한 역할을 한다.
Kubernetes의 뛰어난 기능 중 하나는 파드, 노드 및 외부 세계 간의 통신을 용이하게 하도록 설계된 네트워킹 기능이다.
Kubernetes는 애플리케이션의 최신 버전을 안정 버전과 함께 릴리스하여 트래픽의 일부를 새 버전으로 보내는 카나리아 디플로이먼트를 허용한다. 이는 파드 레이블을 조작하고 여러 디플로이먼트 구성을 사용하여 제어할 수 있다.
블루-그린 디플로이먼트 전략에서는 두 개의 환경(현재 환경은 블루, 새 환경은 그린)이 유지된다. 새 버전을 디플로이할 준비가 되면 트래픽을 파란색 환경에서 녹색 환경으로 전환한다. Kubernetes는 두 개의 별도 파드 세트(블루-그린)를 유지하고 서비스 또는 인그레스 컨트롤러가 원하는 세트를 가리키도록 전환함으로써 이를 지원할 수 있다.
Kubernetes는 특정 메트릭(예: CPU 사용률)에 따라 디플로이먼트 또는 레플리카 세트의 파드 수를 자동으로 확장 및 축소할 수 있다.
프로메테우스는 Kubernetes 에코시스템에서 널리 사용되는 모니터링 도구이다. 지정된 간격으로 구성된 타깃에서 메트릭을 수집하고, 규칙 표현식을 평가하고, 결과를 표시할 수 있다.
로깅의 경우, ELK(Elasticsearch, Logstash, Kibana)가 널리 사용된다. 또는 Kubernetes에 맞게 조정된 Loki-Stack이 로깅을 위한 일련의 솔루션을 제공한다.
패키지 관리를 위한 Helm, 서비스 메시를 위한 Istio, 지속적인 개발을 위한 Skaffold와 같이 Kubernetes 경험을 향상시키기 위해 설계된 수많은 도구가 있다.
결론적으로, Kubernetes는 컨테이너 오케스트레이션에 관한 것이 아니다. 애플리케이션을 디플로이먼트, 확장, 모니터링, 관리하기 위한 전체적인 에코시스템을 제공하여 가동 시간, 확장성, 복원력을 극대화한다. 방대한 에코시스템과 유연성 덕분에 컨테이너화된 애플리케이션과 마이크로서비스를 도입하려는 조직에게 최고의 선택이 될 수 있다.
Kubernetes는 마이크로 서비스 아키텍처의 트렌드와 함께 무중단 디플로이먼트의 중요성이 커지는 현대의 애플리케이션 환경에 아주 적합한 도구다. 이를 통해 안정적이고 지속 가능한 서비스 제공이 가능하다.
reference : https://kubernetes.io/ko/docs/concepts/
좋은 정보 감사합니다