Kubernetes에서 사용자 정의 API로 컨테이너 체크포인팅

문제 설명

도전 과제

Kubernetes에서 컨테이너화된 애플리케이션을 운영하는 조직은 종종 다음을 위해 실행 중인 컨테이너의 상태를 캡처하고 보존해야 합니다:

  • 재해 복구
  • 애플리케이션 마이그레이션
  • 디버깅/문제 해결
  • 상태 보존
  • 환경 재현

그러나 다음을 수행할 수 있는 간단하고 자동화된 방법은 없습니다:

  1. 요청 시 컨테이너 체크포인트 생성
  2. 이 체크포인트를 표준화된 형식으로 저장
  3. 클러스터 간에 쉽게 접근 가능하게 만들기
  4. 표준 인터페이스를 통해 체크포인트 트리거

현재의 한계

  • 수동 체크포인트 생성은 클러스터에 직접 접근해야 함
  • 체크포인트에 대한 표준화된 저장 형식이 없음
  • 컨테이너 레지스트리와의 제한된 통합
  • 자동화를 위한 프로그래밍 접근 부족
  • containerd와 저장 시스템 간의 복잡한 조정

해결책

Kubernetes 사이드카 서비스가:

  1. REST API를 통해 체크포인트 기능을 노출
  2. 체크포인트를 OCI 호환 이미지로 자동 변환
  3. 이미지를 ECR에 저장하여 쉽게 배포
  4. 기존 Kubernetes 인프라와 통합
  5. 자동화를 위한 표준화된 인터페이스 제공

이것은 다음을 통해 핵심 문제를 해결합니다:

  • 체크포인트 프로세스 자동화
  • 체크포인트 저장소 표준화
  • 체크포인트의 이동성 확보
  • 프로그램적 접근 가능성 활성화
  • 기존 워크플로와의 통합 간소화

대상 사용자:

  • DevOps 팀
  • 플랫폼 엔지니어
  • 애플리케이션 개발자
  • 사이트 신뢰성 엔지니어(SRE)

포렌식 컨테이너 체크포인팅은 사용자 공간에서 체크포인트/복원 (CRIU)를 기반으로 하며, 컨테이너가 체크포인트가 생성되고 있다는 사실을 인식하지 못한 채 실행 중인 컨테이너의 상태 저장 복사본을 생성할 수 있도록 합니다. 컨테이너의 복사본은 원본 컨테이너가 인식하지 못하는 상태에서 샌드박스 환경에서 여러 번 분석하고 복원할 수 있습니다. 포렌식 컨테이너 체크포인팅은 Kubernetes v1.25에서 알파 기능으로 도입되었습니다.

이 문서에서는 API를 사용하여 컨테이너 체크포인트를 생성하는 데 사용할 수 있는 Golang 코드 배포 방법을 안내합니다.

코드는 포드 식별자를 가져오고, 입력으로부터 containerd에서 컨테이너 ID를 검색한 후, ctr 명령을 사용하여 containerd의 k8s.io 네임스페이스에서 특정 컨테이너의 체크포인트를 생성합니다:

필수 조건

  • Kubernetes 클러스터
  • ctr commandline 도구를 설치하십시오. kubelet 또는 워커 노드에서 ctr 명령을 실행할 수 있는 경우; 그렇지 않은 경우 AMI를 설치하거나 조정하여 ctr을 포함하십시오.
  • kubectl이 클러스터와 통신하도록 구성됨
  • 로컬에 Docker가 설치되어 있어야 함
  • 컨테이너 레지스트리에 액세스할 수 있어야 함(Docker Hub, ECR 등)
  • Nginx Ingress Controller를 설치하기 위해 Helm이 필요함

단계 0: GO를 사용하여 컨테이너 체크포인트 생성하는 코드

다음 내용으로 checkpoint_container.go라는 파일을 생성하십시오:

Go

 

단계 1: go 모듈을 초기화하십시오

Shell

 

go.mod 파일을 수정하십시오:

Go

 

다음 명령을 실행하십시오:

Shell

 

단계 2: Docker 이미지 빌드 및 게시

같은 디렉토리에 Dockerfile을 생성하십시오:

Dockerfile

 

이 Dockerfile은 다음을 수행합니다:

  1. golang:1.20을 빌드 단계로 사용하여 Go 애플리케이션을 컴파일함
  2. 최종 베이스 이미지로 amazonlinux:2를 사용함
  3. AWS CLI, Docker(포함하여 containerd), skopeo를 yum과 amazon-linux-extras를 사용하여 설치함
  4. 빌드 단계에서 컴파일된 Go 이진 파일을 복사함
Shell

 

<your-docker-repo>를 실제 Docker 저장소로 교체하십시오

단계 3: RBAC 리소스 적용

rbac.yaml이라는 파일을 생성하십시오:

YAML

 

RBAC 리소스를 적용하십시오:

Shell

 

단계 4: 쿠버네티스 배포 생성

deployment.yaml이라는 파일을 만듭니다:

YAML

 

배포를 적용합니다:

Shell

 

deployment.yaml에서 다음을 업데이트합니다:

YAML

단계 5: 쿠버네티스 서비스

service.yaml이라는 파일을 만듭니다:

YAML

 

서비스를 적용합니다:

Shell

 

단계 6: Ngnix Ingress Controller 설치

Shell

 

단계 7: 인그레스 리소스 생성

ingress.yaml이라는 파일을 만듭니다:

YAML

 

인그레스를 적용합니다:

Shell

 

단계 8: API 테스트

Shell

 

Shell

 

<EXTERNAL-IP>를 실제 외부 IP로 대체합니다.

추가 고려 사항

  1. 보안.
    • TLS 인증서 설정을 통한 HTTPS 구현
    • API에 인증 추가
  2. 모니터링. API 및 체크포인트 프로세스에 대한 로깅 및 모니터링 설정
  3. 리소스 관리. 사이드카 컨테이너에 대한 리소스 요청과 제한 구성
  4. 에러 처리. Go 애플리케이션에서 견고한 에러 처리 구현
  5. 테스트. 프로덕션 환경에 배포하기 전에 비 프로덕션 환경에서 설정을 철저히 테스트
  6. 문서화. 체크포인트 API 사용 방법에 대한 명확한 문서 유지

결론

이 설정은 체크포인트 컨테이너를 쿠버네티스의 사이드카로 배포하고 클러스터 외부에서 접근 가능한 API를 통해 그 기능을 노출합니다. 이는 쿠버네티스 환경에서 컨테이너 체크포인트를 관리하기 위한 유연한 솔루션을 제공합니다.

AWS/EKS 특정

7단계: AWS 로드 밸런서 컨트롤러 설치

우리는 Nginx Ingress Controller 대신 AWS 로드 밸런서 컨트롤러를 사용할 것입니다. 이 컨트롤러는 우리의 Ingress 리소스를 위한 ALB를 생성하고 관리합니다.

1. EKS 차트 저장소를 Helm에 추가합니다:

Shell

 

2. AWS 로드 밸런서 컨트롤러를 설치합니다:

Shell

 

<your-cluster-name>을 EKS 클러스터 이름으로 대체합니다.

참고: AWS 로드 밸런서 컨트롤러에 필요한 IAM 권한이 설정되어 있는지 확인하세요. 자세한 IAM 정책은 AWS 문서에서 확인할 수 있습니다.

8단계: Ingress 리소스 생성

ingress.yaml라는 파일을 생성합니다:

YAML

 

Ingress를 적용합니다:

Shell

 

9단계: API 테스트

1. ALB DNS 이름 가져오기:

Shell

 

ADDRESS 필드를 찾아보세요. 이는 ALB의 DNS 이름이 될 것입니다.

2. 테스트 요청 보내기:

Shell

 

<ALB-DNS-NAME>을 1단계에서 가져온 ALB의 실제 DNS 이름으로 대체합니다.

AWS ALB에 대한 추가 고려 사항

1. 보안 그룹. ALB에는 자동으로 생성된 보안 그룹이 있습니다. 80번 포트로 들어오는 트래픽을 허용하도록 설정하세요 (HTTPS를 설정했으면 443포트도).

2. SSL/TLS: HTTPS를 활성화하려면 다음 주석을 Ingress에 추가할 수 있습니다:

YAML

 

3. 액세스 로그. 다음을 추가하여 ALB에 액세스 로그를 활성화하세요:

YAML

 

4. WAF 통합. ALB에 AWS WAF를 사용하려면 다음을 추가할 수 있습니다:

YAML

 

5. 인증. 적절한 ALB Ingress Controller 주석을 사용하여 Amazon Cognito 또는 OIDC를 사용하여 인증을 설정할 수 있습니다.

이러한 변경 사항은 Nginx 대신 AWS 애플리케이션 로드 밸런서를 사용하여 Ingress를 설정합니다. ALB Ingress Controller는 Ingress 리소스를 기반으로 ALB를 자동으로 프로비저닝하고 구성합니다.

결론

EKS 클러스터가 ALB를 생성하고 관리할 수 있는 필요한 IAM 권한을 보장해야 합니다. 일반적으로 적절한 권한을 가진 IAM 정책과 서비스 계정을 생성하는 것이 포함됩니다.

이 설정은 이제 AWS의 네이티브 로드 밸런싱 솔루션을 사용하며 다른 AWS 서비스와 통합이 잘되어 AWS 환경에서 더 효율적 일 수 있습니다.

Source:
https://dzone.com/articles/container-checkpointing-kubernetes-api