쿠버네티스 주요 개념 상세 설명

쿠버네티스는 컨테이너화된 애플리케이션을 배포, 관리, 확장하는 데 사용되는 오픈소스 플랫폼입니다. 복잡한 시스템을 관리하고, 자동화된 배포 및 확장 기능을 제공하여 개발자가 애플리케이션 개발에 집중할 수 있도록 돕습니다.

파드 (Pod): 쿠버네티스 배포의 기본 단위

파드는 쿠버네티스에서 배포 및 관리의 가장 작은 단위입니다. 하나 이상의 컨테이너를 묶어서 관리하며, 컨테이너들은 하나의 파드 안에서 네트워크와 스토리지를 공유합니다.

특징

    • 컨테이너 묶음: 일반적으로 하나의 애플리케이션을 구성하는 컨테이너들이 하나의 파드에 속합니다. 예를 들어, 웹 서버 컨테이너와 데이터베이스 컨테이너가 하나의 파드에서 실행될 수 있습니다.
    • 공유 자원: 파드 내의 컨테이너들은 동일한 네트워크 네임스페이스를 공유하므로 localhost를 통해 서로 통신할 수 있습니다. 또한, 공유 볼륨을 통해 데이터를 공유할 수 있습니다.
    • 일시적: 파드는 일시적인 존재입니다. 파드에 오류가 발생하거나, 노드에 문제가 생기면 파드는 삭제되고 재시작될 수 있습니다. 이러한 일시적인 특성을 극복하기 위해 디플로이먼트와 같은 컨트롤러를 사용합니다.

예시 : 웹 서버 컨테이너와 로그 수집 컨테이너를 하나의 파드로 묶어서 배포할 수 있습니다. 이 경우, 웹 서버 컨테이너는 웹 요청을 처리하고 로그 수집 컨테이너는 로그를 수집하여 분석 시스템으로 전송합니다.

디플로이먼트 (Deployment): 파드 관리 및 업데이트 자동화

디플로이먼트는 파드를 원하는 상태로 유지하고 관리하는 쿠버네티스 컨트롤러입니다. 파드의 생성, 업데이트, 복제, 롤백을 자동화하여 애플리케이션 관리를 용이하게 합니다.

특징

    • 파드 복제: 디플로이먼트는 정의된 복제본 수 (replicas) 만큼 파드를 생성하고 관리합니다. 파드에 문제가 발생하면 자동으로 새로운 파드를 생성하여 복제본 수를 유지합니다.
    • 무중단 업데이트: 디플로이먼트는 롤링 업데이트 방식을 통해 애플리케이션을 무중단으로 업데이트할 수 있습니다. 이전 버전의 파드를 새로운 버전으로 순차적으로 교체하면서 서비스를 중단하지 않고 업데이트를 완료합니다.
    • 롤백: 문제가 발생하면 이전 버전으로 쉽게 롤백할 수 있습니다.
    • 선언적 관리: 디플로이먼트는 사용자가 원하는 애플리케이션의 상태를 선언적으로 정의하면, 쿠버네티스가 자동으로 해당 상태를 유지하도록 관리합니다.

예시 : 3개의 파드 복제본을 유지하는 디플로이먼트를 생성하여 웹 서버 애플리케이션을 배포할 수 있습니다. 애플리케이션 업데이트 시에는 디플로이먼트가 롤링 업데이트를 통해 무중단으로 업데이트를 진행합니다.

서비스 (Service): 파드 접근을 위한 추상화된 엔드포인트

서비스는 파드의 집합을 대표하는 추상적인 개념입니다. 동일한 애플리케이션을 제공하는 여러 파드를 하나의 논리적인 엔드포인트로 묶어 클라이언트 애플리케이션이 파드의 위치 변화에 상관없이 안정적으로 서비스에 접근할 수 있도록 합니다.

특징

    • 로드 밸런싱: 서비스는 여러 파드로 트래픽을 분산시켜 애플리케이션의 가용성을 높입니다.
    • 추상화된 엔드포인트: 서비스는 파드 IP 주소 대신 가상 IP 주소를 제공하므로 파드가 변경되어도 클라이언트 애플리케이션은 서비스에 연결된 IP 주소만 알면 됩니다.
    • 다양한 서비스 타입
      • ClusterIP: 클러스터 내부에서만 접근 가능한 가상 IP 주소를 제공합니다.
      • NodePort: 각 노드의 특정 포트로 서비스를 노출하여 외부에서 접근할 수 있도록 합니다.
      • LoadBalancer: 클라우드 환경에서 외부 로드밸런서를 사용하여 외부에서 서비스를 노출합니다.

예시 : 여러 개의 웹 서버 파드를 묶어서 웹 서비스 서비스를 생성할 수 있습니다. 서비스는 클라이언트 요청을 웹 서버 파드들로 균등하게 분산시키고, 웹 서버 파드가 재시작되거나 새롭게 생성되어도 클라이언트 애플리케이션은 서비스 IP 주소를 통해 서비스를 사용할 수 있습니다.

네임스페이스 (Namespace): 리소스 격리 및 관리

네임스페이스는 쿠버네티스 클러스터 내에서 리소스를 격리하고 관리하는 가상 클러스터입니다. 여러 개의 네임스페이스를 생성하여 팀, 프로젝트, 환경 등을 분리하여 관리할 수 있습니다.

특징

    • 리소스 격리: 각 네임스페이스는 서로 다른 리소스를 가질 수 있으며, 다른 네임스페이스의 리소스에 영향을 주지 않습니다.
    • 이름 충돌 방지: 동일한 리소스 이름이 다른 네임스페이스에 존재할 수 있으므로 리소스 이름 충돌을 방지할 수 있습니다.
    • 접근 권한 제어: 네임스페이스 단위로 사용자 또는 서비스 계정에 접근 권한을 부여하여 보안을 강화할 수 있습니다.

예시 : 개발, 테스트, 운영 환경을 각각 다른 네임스페이스로 분리하여 관리할 수 있습니다. 이렇게 하면 개발 환경에서 발생한 문제가 운영 환경에 영향을 주지 않도록 할 수 있습니다.

레이블 및 셀렉터 (Label & Selector): 리소스 선택 및 관리

레이블 (Label)는 쿠버네티스 리소스에 키-값 쌍으로 할당되는 메타데이터입니다. 리소스를 분류하고 관리하는 데 사용됩니다. 셀렉터 (Selector)는 레이블을 기준으로 리소스를 선택하는 데 사용되는 메커니즘입니다.

특징

    • 리소스 식별: 레이블을 사용하여 리소스를 쉽게 식별하고 검색할 수 있습니다.
    • 유연한 선택: 셀렉터를 사용하여 특정 레이블을 가진 리소스를 유연하게 선택할 수 있습니다.
    • 자동화된 관리: 셀렉터를 서비스 또는 디플로이먼트와 함께 사용하여 자동으로 파드를 관리할 수 있습니다.

예시 : app=webserver 라는 레이블을 가진 파드들을 선택하여 웹 서비스에 연결할 수 있습니다. 또한, environment=production 라는 레이블을 가진 리소스만 선택하여 운영 환경에 배포할 수 있습니다.

볼륨 (Volume): 파드 내 컨테이너 간 공유 스토리지

볼륨은 파드 내의 컨테이너들이 공유하는 저장소입니다. 컨테이너가 재시작되더라도 데이터를 유지할 수 있도록 하며, 컨테이너 간에 데이터를 공유할 수 있도록 합니다.

특징

    • 데이터 유지: 볼륨은 컨테이너가 재시작되더라도 데이터를 유지할 수 있게 합니다.
    • 컨테이너 간 공유: 볼륨은 파드 내의 여러 컨테이너에서 공유할 수 있습니다.
    • 다양한 유형
      • emptyDir: 파드가 생성될 때 생성되고 파드가 삭제될 때 함께 삭제되는 임시 저장소입니다.
      • hostPath: 호스트 노드의 파일 시스템을 파드에 마운트하는 방식입니다.
      • PersistentVolume (PV) 및 PersistentVolumeClaim (PVC): 영구적인 스토리지를 제공하기 위해 사용되는 방식입니다.

예시 : 웹 서버 컨테이너와 로그 수집 컨테이너가 로그 파일을 공유하기 위해 볼륨을 사용할 수 있습니다. 웹 서버 컨테이너는 로그 파일을 볼륨에 쓰고, 로그 수집 컨테이너는 볼륨에서 로그 파일을 읽어서 수집합니다.

설정맵 및 시크릿 (ConfigMap & Secret): 환경 설정 및 비밀 정보 관리

설정맵 (ConfigMap)은 애플리케이션의 설정 정보 (환경 변수, 설정 파일 등)를 키-값 쌍으로 저장하는 쿠버네티스 객체입니다. 시크릿 (Secret)은애플리케이션의 비밀 정보 (API 키, 비밀번호 등)를 안전하게 저장하는 쿠버네티스 객체입니다.

특징

    • 외부 설정: 설정맵과 시크릿을 사용하면 컨테이너 이미지에 설정 정보를 포함시키지 않고 별도로 관리할 수 있습니다.
    • 보안: 시크릿은 암호화된 방식으로 저장되어 민감한 정보를 안전하게 관리할 수 있습니다.
    • 동적 변경: 설정맵과 시크릿을 변경하면 파드를 재시작하지 않고도 애플리케이션 설정을 동적으로 변경할 수 있습니다.

예시 : 데이터베이스 연결 정보를 시크릿으로 저장하고, 데이터베이스 주소 및 기타 설정을 설정맵으로 저장하여 파드에 제공할 수 있습니다. 이렇게 하면 애플리케이션 설정 정보를 변경할 때 컨테이너 이미지를 다시 빌드할 필요가 없습니다.

더불어 알아야 할 쿠버네티스 개념 상세 설명

1. 롤링 업데이트 (Rolling Update): 무중단 애플리케이션 업데이트 전략

롤링 업데이트는 애플리케이션을 새로운 버전으로 업데이트할 때, 기존 애플리케이션의 서비스를 중단시키지 않고 점진적으로 업데이트하는 방식입니다.

동작 방식

    • 새로운 버전의 파드가 지정된 수만큼 생성됩니다.
    • 새로운 파드가 정상적으로 작동하는지 확인합니다.
    • 정상 작동 확인 후, 기존 버전의 파드를 한 개씩 삭제하고 새로운 파드로 교체합니다.
    • 이 과정을 반복하여 모든 파드가 새로운 버전으로 교체될 때까지 진행합니다.

특징

    • 무중단 서비스: 업데이트 과정 중에도 기존 서비스가 정상적으로 제공됩니다. 사용자는 서비스 중단 없이 새로운 버전의 애플리케이션을 이용할 수 있습니다.
    • 점진적 업데이트: 한 번에 모든 파드를 업데이트하는 것이 아니라 점진적으로 업데이트하므로 문제 발생 시 빠르게 롤백할 수 있습니다.
    • 디플로이먼트 사용: 롤링 업데이트는 주로 디플로이먼트 리소스를 통해 관리됩니다.

예시 : 웹 서버 애플리케이션을 업데이트할 때, 롤링 업데이트를 사용하면 사용자는 서비스 중단 없이 새로운 기능이 적용된 웹 사이트를 이용할 수 있습니다.

2. 헬름 (Helm): 쿠버네티스 패키지 관리 도구

헬름은 쿠버네티스 애플리케이션을 패키징하고 배포하는 데 사용하는 패키지 관리 도구입니다. 복잡한 쿠버네티스 설정을 단순화하고 재사용 가능한 패키지 형태로 관리할 수 있도록 지원합니다.

주요 기능

    • 차트 (Chart): 쿠버네티스 리소스 (디플로이먼트, 서비스 등)를 정의하는 설정 파일들을 템플릿화하여 패키징한 것입니다.
    • 릴리스 (Release): 헬름 차트를 설치하고 관리할 때 생성되는 인스턴스입니다.
    • 템플릿 엔진: 차트는 템플릿 엔진을 사용하여 사용자 정의 변수를 삽입하고 재사용 가능한 코드를 만들 수 있습니다.
    • 패키지 저장소: 헬름 차트들을 저장하고 공유할 수 있는 저장소를 제공합니다.

특징

    • 복잡성 감소: 복잡한 쿠버네티스 설정을 단순화하고, 배포를 자동화합니다.
    • 재사용성: 패키지화된 차트를 재사용하여 일관된 배포를 보장합니다.
    • 버전 관리: 릴리스를 통해 애플리케이션 버전 관리를 쉽게 할 수 있습니다.

예시 : 웹 애플리케이션, 데이터베이스, 캐시 서버 등 다양한 쿠버네티스 리소스를 포함하는 헬름 차트를 만들어서 한 번에 배포할 수 있습니다.

3. PersistentVolume (PV) & PersistentVolumeClaim (PVC): 영구 스토리지 관리

PersistentVolume (PV)는 쿠버네티스 클러스터 내에서 사용할 수 있는 영구적인 스토리지 자원을 정의합니다. 물리적인 스토리지 위치, 크기, 접근 모드 등을 설정합니다. PersistentVolumeClaim (PVC)는 파드에서 필요한 스토리지 자원을 요청하는 쿠버네티스 객체입니다. PV의 상세 정보(용량, 접근 모드 등)를 명시하여 필요한 스토리지를 요청합니다.

동작 방식

    • 관리자가 PV를 생성하여 클러스터에 사용 가능한 스토리지를 정의합니다.
    • 개발자는 PVC를 생성하여 필요한 스토리지를 요청합니다.
    • 쿠버네티스는 PVC와 호환 가능한 PV를 찾아서 연결합니다.
    • 파드는 PVC를 통해 스토리지를 사용할 수 있습니다.

특징

    • 추상화된 스토리지: 파드는 PVC를 통해 스토리지를 사용하므로, 스토리지를 실제로 어디에 저장하는지 알 필요가 없습니다.
    • 영구적 저장: 파드가 삭제되거나 재시작되더라도 데이터는 영구적으로 유지됩니다.
    • 동적 프로비저닝: PVC를 생성할 때 PV를 자동으로 생성할 수 있도록 동적 프로비저닝 기능을 제공합니다.

예시 : 데이터베이스 파드에서 데이터를 저장하기 위해 PVC를 사용하여 PV를 연결할 수 있습니다. 파드가 삭제되어도 데이터는 PV에 유지되므로 데이터 손실을 방지할 수 있습니다.

4. 인그레스 (Ingress): 외부 HTTP/HTTPS 트래픽 라우팅

인그레스는 클러스터 외부에서 들어오는 HTTP/HTTPS 트래픽을 클러스터 내부의 서비스로 라우팅하는 규칙을 정의하는 쿠버네티스 객체입니다.

동작 방식

    • 사용자는 인그레스 컨트롤러 (ex. Nginx Ingress Controller)를 클러스터에 배포합니다.
    • 인그레스를 정의하여 외부 트래픽이 특정 호스트, 경로에 따라 어떤 서비스로 라우팅될지 설정합니다.
    • 인그레스 컨트롤러는 인그레스 설정을 기반으로 외부 트래픽을 내부 서비스로 라우팅합니다.

특징

    • 단일 엔드포인트: 여러 서비스에 대한 라우팅을 하나의 엔드포인트 (IP 주소)로 관리할 수 있습니다.
    • TLS/SSL Termination: 인그레스 컨트롤러에서 SSL/TLS 인증서를 설정하여 암호화된 통신을 제공할 수 있습니다.
    • 로드 밸런싱: 인그레스 컨트롤러는 여러 파드로 트래픽을 분산시켜 로드 밸런싱 기능을 제공할 수 있습니다.

예시 : 여러 개의 웹 서비스를 하나의 인그레스를 통해 서로 다른 도메인 또는 경로로 접근할 수 있도록 설정할 수 있습니다. 예를 들어, example.com은 웹 서비스 A로, api.example.com은 API 서비스 B로 라우팅할 수 있습니다.

5. 네트워크 정책 (NetworkPolicy): 파드 간 네트워크 트래픽 제어

네트워크 정책은 파드 간의 네트워크 트래픽을 제어하고 보안을 강화하는 쿠버네티스 객체입니다. 특정 파드에서 다른 파드로의 접근을 허용하거나 차단하는 규칙을 정의합니다.

특징

    • 네트워크 격리: 네트워크 정책을 사용하여 파드를 격리하여 보안을 강화할 수 있습니다.
    • 액세스 제어: 특정 파드에서 특정 파드로의 네트워크 접근을 제어할 수 있습니다.
    • 네임스페이스 레벨: 네트워크 정책은 네임스페이스 단위로 적용되며, 특정 네임스페이스 내에서 파드 간의 통신을 제어할 수 있습니다.

예시 : 데이터베이스 파드가 특정 웹 서버 파드에서만 접근할 수 있도록 네트워크 정책을 설정할 수 있습니다. 이렇게 하면 권한 없는 파드가 데이터베이스에 접근하는 것을 방지할 수 있습니다.

6. Horizontal Pod Autoscaler (HPA): 파드 자동 스케일링

HPA는 파드의 CPU 사용률, 메모리 사용률 등의 지표를 기반으로 파드의 복제본 수를 자동으로 조절하는 쿠버네티스 컨트롤러입니다. 트래픽 부하에 따라 파드 수를 늘리거나 줄여서 애플리케이션의 가용성과 성능을 유지합니다.

동작 방식

    • HPA는 파드의 리소스 사용률을 지속적으로 모니터링합니다.
    • 사용자가 설정한 임계값을 기준으로 파드 복제본 수를 자동으로 늘리거나 줄입니다.

특징

    • 자동 스케일링: 트래픽 부하 변동에 따라 자동으로 파드를 스케일링하여 안정적인 서비스 제공을 보장합니다.
    • 리소스 효율성: 필요에 따라 파드 수를 조절하므로 클러스터 리소스 사용률을 최적화할 수 있습니다.
    • 다양한 지표 지원: CPU, 메모리 외에도 사용자 정의 지표를 기반으로 스케일링을 할 수 있습니다.

예시 : 웹 서버 파드가 트래픽 증가로 CPU 사용률이 높아지면 HPA가 자동으로 파드를 추가하여 트래픽을 처리합니다. 트래픽 감소 시에는 파드 수를 줄여 리소스를 절약합니다.

7. Operator: 쿠버네티스 애플리케이션 관리 자동화 패턴

오퍼레이터는 쿠버네티스 애플리케이션의 배포, 업데이트, 관리, 모니터링 등의 작업을 자동화하는 패턴입니다. 사용자 정의 컨트롤러를 사용하여 복잡한 애플리케이션의 상태를 관리하고 자동화된 운영을 구현합니다.

동작 방식

    • 오퍼레이터는 특정 애플리케이션에 대한 사용자 정의 리소스 정의 (Custom Resource Definition, CRD)를 생성합니다.
    • 오퍼레이터 컨트롤러는 CRD에 정의된 상태를 지속적으로 모니터링하고, 목표 상태에 도달하도록 필요한 작업을 수행합니다.

특징

    • 애플리케이션 특화 관리: 특정 애플리케이션에 특화된 자동화된 관리를 제공합니다.
    • 운영 자동화: 애플리케이션 배포, 업데이트, 백업, 복구 등의 운영 작업을 자동화합니다.
    • 확장 가능성: 오퍼레이터를 사용하면 애플리케이션의 복잡한 관리 요구 사항을 효과적으로 해결할 수 있습니다.

예시 : 데이터베이스 오퍼레이터는 데이터베이스 배포, 복제, 백업, 복원 등을 자동화하여 데이터베이스 운영을 단순화합니다.

마무리

이 설명이 쿠버네티스 핵심 개념들을 이해하는 데 도움이 되기를 바랍니다. 쿠버네티스는 복잡하지만, 위에서 설명된 기본적인 개념들을 잘 이해하고 있으면 효과적으로 애플리케이션을 배포하고 관리할 수 있습니다. 추가적으로 궁금한 점이 있다면 언제든지 질문해주세요.