Kubernetes 통합 테스트
Kubernetes 통합 테스트는 GitLab Runner의 CI/CD 파이프라인에서 실행됩니다. 테스트 인프라는 다음에 호스팅됩니다: 인프라는 다운타임 없는 업데이트를 위해 두 개의 별도 클러스터로 구성된 블루-그린 배포 모델을 사용합니다.
Kubernetes 통합 테스트는 GitLab Runner의 CI/CD 파이프라인에서 실행됩니다. 이 테스트는 GitLab Runner가 Kubernetes 클러스터와 올바르게 작동하는지 검증합니다. 테스트는 runner-Kubernetes-infra 리포지터리에서 관리하는 전용 Kubernetes 클러스터에서 실행됩니다.
테스트 인프라#
Runner Kubernetes 인프라 리포지터리#
테스트 인프라는 다음에 호스팅됩니다:
- 리포지터리: https://gitlab.com/gitlab-org/ci-cd/runner-tools/runner-kubernetes-infra
- 목적: GitLab Runner 통합 테스트를 위한 전용 Kubernetes 클러스터 관리
- 클러스터: GCP의
runner-k8s(프로젝트 세부 정보와 영역에 대해서는 내부 문서 참고)
인프라는 다운타임 없는 업데이트를 위해 두 개의 별도 클러스터로 구성된 블루-그린 배포 모델을 사용합니다.
클러스터 구성#
노드 풀, 리소스 제한, 오토스케일링 설정을 포함한 자세한 클러스터 구성은 인프라 리포지터리의 클러스터 구성 섹션을 참고하세요.
파이프라인 구조#
테스트 파이프라인 스테이지#
통합 테스트는 다음 GitLab CI/CD 스테이지를 통해 실행됩니다:
-
통합 Kubernetes 프로비저닝 (
provision integration kubernetes):- 테스트 전용 RBAC 리소스 프로비저닝
- 서비스 어카운트
k8s-runner-integration-tests-runner-$CI_PIPELINE_ID생성 mage k8s:provisionIntegrationKubernetes $CI_PIPELINE_ID실행
-
통합 테스트 작업 (병렬 실행):
integration kubernetes: 표준 통합 테스트integration kubernetes exec legacy: 레거시 실행 전략 테스트integration kubernetes attach: attach 실행 전략 테스트
-
정리 (
destroy integration kubernetes):- 테스트 전용 리소스 삭제
mage k8s:destroyIntegrationKubernetes $CI_PIPELINE_ID실행
파이프라인 구성#
파이프라인은 .gitlab/ci/test-kubernetes-integration.gitlab-ci.yml에 정의되어 있습니다:
.integration kubernetes:
extends:
- .rules:merge_request_pipelines:no_docs:no-community-mr
tags:
- $KUBERNETES_RUNNER_INTEGRATION_TAG
stage: test kubernetes integration
variables:
KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: "k8s-runner-integration-tests-runner-$CI_PIPELINE_ID"
테스트 실행#
통합 테스트는 gotestsum을 사용하여 실행됩니다:
gotestsum --format=testname --format-hide-empty-pkg --rerun-fails=3 \
--hide-summary=output --packages=gitlab.com/gitlab-org/gitlab-runner/executors/kubernetes \
--junitfile=junit_report.xml --junitfile-hide-empty-pkg -- \
-timeout=10m -parallel=20 $EXTRA_GO_TEST_FLAGS \
-tags=integration,kubernetes ./executors/kubernetes/...
주요 파라미터:
- 타임아웃: 테스트당 10분
- 병렬 실행: 최대 20개 테스트 동시 실행
- 재시도 로직: 실패한 테스트는 최대 3번 재시도
- 빌드 태그:
integration,kubernetes
테스트 범주#
표준 통합 테스트#
- 작업:
integration kubernetes - 목적: 주요 통합 테스트 스위트
- 기능 플래그: 기본 기능 플래그 구성 사용
- 필터:
-skip=TestRunIntegrationTestsWithFeatureFlag로 기능 플래그별 테스트 제외
레거시 실행 전략 테스트#
- 작업:
integration kubernetes exec legacy - 기능 플래그:
FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY=true - 필터:
TestRunIntegrationTestsWithFeatureFlag만 실행 - 목적: 이전 버전과의 호환성 검증
Attach 전략 테스트#
- 작업:
integration kubernetes attach - 기능 플래그:
FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY=false - 필터:
TestRunIntegrationTestsWithFeatureFlag만 실행 - 목적: 새로운 attach 기반 실행 전략 테스트
RBAC 및 권한#
동적 권한 프로비저닝#
프로비저닝 시스템(mage k8s:provisionIntegrationKubernetes)은 코드베이스를 분석하여 필요한 최소 RBAC 권한을 생성합니다:
- 코드 분석: Kubernetes API 호출을 위해
/executors/kubernetes/를 스캔 - 권한 생성: 필요한 권한만 포함된 role YAML 생성
- 리소스 생성: 생성된 RBAC를
k8s-runner-integration-tests네임스페이스에 적용
이 시스템은 테스트가 테스트 대상 코드와 동일한 권한을 사용하도록 보장합니다.
테스트별 서비스 어카운트#
각 파이프라인은 고유한 리소스를 생성합니다:
- 서비스 어카운트:
k8s-runner-integration-tests-runner-$CI_PIPELINE_ID - Role: 코드 분석을 기반으로 생성
- Role binding: 서비스 어카운트를 생성된 role에 연결
관리자 권한#
통합 테스트는 테스트 관리를 위한 관리자 RBAC도 사용합니다:
- 서비스 어카운트:
integration-tests-admin - 목적: 테스트 리소스 생성/삭제, 클러스터 상태 관찰
- 범위: 일반 러너 작업을 넘어선 추가 권한
테스트 구현#
테스트 환경#
테스트는 다음 환경 변수와 함께 실행됩니다:
KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: 파이프라인별 서비스 어카운트- 기능 플래그 변수 (기능 플래그 테스트용)
- 클러스터 연결 세부 정보 (인프라에서 관리)
리소스 관리#
자동 정리#
인프라에는 자동 정리 메커니즘이 포함되어 있습니다. CronJob, 스케줄링 및 구성에 대한 자세한 내용은 인프라 리포지터리의 운영 자동화 섹션을 참고하세요.
리소스 격리#
테스트는 충돌을 방지하기 위해 리소스 그룹을 사용합니다:
"$CI_COMMIT_REF_SLUG-k8s-integration""$CI_COMMIT_REF_SLUG-k8s-integration-exec-legacy""$CI_COMMIT_REF_SLUG-k8s-integration-attach"
모니터링 및 관측 가능성#
메트릭 및 로깅#
테스트 인프라에는 포괄적인 모니터링 및 로깅이 포함되어 있습니다. Grafana 액세스, Prometheus 대시보드,
Loki를 이용한 로그 집계, 사용 가능한 make 명령에 대한 자세한 내용은 인프라 리포지터리의
메트릭 및
로그 수집
섹션을 참고하세요.
트러블슈팅#
일반적인 문제#
- 테스트 타임아웃:
- 클러스터 리소스 가용성을 확인하세요.
- 워커 풀 스케일링을 확인하세요 (0~6개 노드).
- 테스트 병렬 처리 설정을 검토하세요.
- RBAC 권한:
- 프로비저닝 작업이 성공했는지 확인하세요.
- 서비스 어카운트 생성을 확인하세요.
- 생성된 Role이 코드 요구 사항과 일치하는지 확인하세요.
- 리소스 충돌:
- 리소스 그룹 격리를 확인하세요.
- 정리 작업 실행을 확인하세요.
- 파이프라인별 이름 지정을 검토하세요.
디버깅 단계#
-
인프라 상태를 확인합니다.
make명령과 인프라 관리에 대한 자세한 내용은 블루-그린 배포를 참고하세요. -
테스트 로그를 검토합니다:
- 특정 실패에 대한 파이프라인 작업 로그를 확인하세요.
- 집계된 로그를 위해 Grafana 대시보드를 사용하세요. 자세한 내용은 로그 수집을 참고하세요.
- 테스트별 이슈를 위해
gotestsum출력을 검토하세요.
-
RBAC 검증:
kubectl get sa,role,rolebinding -n k8s-runner-integration-tests kubectl describe role k8s-runner-integration-tests-runner-$CI_PIPELINE_ID -n k8s-runner-integration-tests
로컬에서 테스트 실행#
통합 테스트는 전용 인프라를 갖춘 CI/CD 환경에서 실행하도록 설계되었습니다. 로컬 실행에는 다음이 필요합니다:
- GKE 클러스터에 대한 액세스.
- 적절한 RBAC 권한.
- CI/CD 구성과 일치하는 환경 변수.
로컬 개발의 경우, 유닛 테스트나 적절한 설정을 갖춘 로컬 Kubernetes 클러스터(kind/minikube)를 사용하세요.
