현대 소프트웨어 개발은 빠른 배포 주기, 확장성 및 복원력을 요구합니다. Kubernetes는 확장 가능한 컨테이너화된 애플리케이션 관리가 가능하도록 하는 기본 오케스트레이션 플랫폼으로 자리 잡았습니다. GitLab CI/CD 파이프라인과 결합하면 Kubernetes 배포가 자동화되고 반복 가능하며 신뢰할 수 있게 됩니다.
이 기사는 GitLab CI를 사용하여 Kubernetes에 대한 CI/CD 파이프라인을 설정하는 기술적 세부 사항을 탐구합니다.
전제 조건
CI/CD 파이프라인을 구성하기 전에 다음 요구 사항이 충족되었는지 확인하십시오:
- GitLab 계정: CI/CD 파이프라인이 구성될 GitLab 리포지토리에 대한 액세스 권한이 필요합니다.
- Kubernetes 클러스터: Minikube(로컬 테스트용) 또는 Google Kubernetes Engine(GKE), Amazon EKS, Azure AKS와 같은 관리 클러스터와 같은 기존 Kubernetes 클러스터가 필요합니다.
- kubectl: 클러스터 상호작용을 위해 Kubernetes 명령줄 도구가 설치되고 구성되어 있어야 합니다.
- Helm(선택 사항): 애플리케이션을 배포하고 관리하기 위한 Kubernetes 패키지 관리자입니다.
- GitLab Runner: CI/CD 작업을 실행하기 위해 GitLab Runner가 설치되고 프로젝트에 등록되어 있어야 합니다.
- Docker: 컨테이너 이미지를 빌드하고 컨테이너 레지스트리에 푸시하는 데 필요합니다.
GitLab과 Kubernetes 통합 설정하기
Kubernetes 클러스터 연결
GitLab과 Kubernetes 통합은 파이프라인에서 직접 원활한 배포 및 리소스 관리를 가능하게 합니다. 다음 단계를 따르세요:
- GitLab 프로젝트 대시보드로 이동합니다.
- 인프라 > Kubernetes 클러스터로 이동합니다.
- Kubernetes 클러스터 추가를 클릭하고 기존 클러스터에 연결하거나 클라우드 제공업체를 사용하여 새 클러스터를 생성합니다.
- Role-Based Access Control (RBAC)을 사용하여 GitLab에 적절한 권한을 부여합니다.
RBAC 구성
RBAC은 Kubernetes 리소스에 대한 액세스 권한을 정의합니다. 아래는 RBAC을 설정하기 위한 YAML 구성 예시입니다:
apiVersion v1
kind ServiceAccount
metadata
name gitlab-sa
namespace default
---
apiVersion rbac.authorization.k8s.io/v1
kind ClusterRoleBinding
metadata
name gitlab-cluster-admin
roleRef
apiGroup rbac.authorization.k8s.io
kind ClusterRole
name cluster-admin
subjects
kind ServiceAccount
name gitlab-sa
namespace default
구성 적용
YAML 파일을 kubectl
을 사용하여 적용합니다:
kubectl apply -f gitlab-rbac.yaml
인증을 위한 토큰 생성
GitLab에 필요한 서비스 계정 토큰을 추출합니다:
kubectl -n default get secret $(kubectl -n default get sa/gitlab-sa -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode
이 토큰을 GitLab의 Kubernetes 구성 설정에 붙여넣습니다.
GitLab CI/CD 파이프라인 구성
.gitlab-ci.yml 정의
GitLab CI 구성 파일은 파이프라인 단계, 변수 및 명령을 정의합니다. 아래는 구성 예시입니다:
image docker20.10
stages
build
test
deploy
variables
KUBE_NAMESPACE default
KUBECONFIG"/root/.kube/config"
IMAGE_TAG $CI_COMMIT_SHA
REGISTRY registry.gitlab.com/username/project
services
docker:dind
before_script
apk add --no-cache curl jq bash git
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.22.0/bin/linux/amd64/kubectl
chmod +x ./kubectl && mv ./kubectl /usr/local/bin/kubectl
"$KUBE_CONFIG" | base64 -d > $KUBECONFIG echo
chmod 600 $KUBECONFIG
build
stage build
script
docker build -t $REGISTRY:$IMAGE_TAG .
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
docker push $REGISTRY:$IMAGE_TAG
unit-test
stage test
script
"Running tests..." echo
./run-tests.sh
deploy
stage deploy
script
kubectl set image deployment/my-app my-app=$REGISTRY:$IMAGE_TAG -n $KUBE_NAMESPACE
only
main
구성 설명
- 단계: 파이프라인은 모듈 실행을 위해 빌드, 테스트 및 배포 단계로 나뉩니다.
- 변수: 이미지 태그 및 네임스페이스와 같은 환경 변수는 구성 관리를 단순화합니다.
- before_script: 종속성을 설치하고 Kubernetes 인증을 설정합니다.
- 이미지 태깅: 각 이미지 버전을 고유하게 식별하기 위해 커밋 SHA를 사용합니다.
- 배포: 컨테이너 이미지를 설정하여 Kubernetes 배포를 업데이트합니다.
비밀 관리
GitLab CI는 변수를 사용하여 안전한 비밀 관리를 지원합니다:
- 설정 > CI/CD > 변수로 이동합니다.
- 필요한 변수를 추가합니다:
KUBE_CONFIG
,CI_REGISTRY_USER
,CI_REGISTRY_PASSWORD
.
변수를 추가하기 전에 kubeconfig
를 인코딩합니다:
cat ~/.kube/config | base64 | tr -d '\n'
결과를 GitLab에 KUBE_CONFIG
로 추가합니다.
Helm 배포
Helm은 재사용 가능한 차트를 통해 Kubernetes 배포를 간소화합니다. 예제 Helm 구성:
apiVersion v2
name my-app
version1.0.0
appVersion1.0.0
image
repository registry.gitlab.com/username/project
tag latest
service
type ClusterIP
port80
파이프라인에 Helm 명령을 추가합니다:
deploy
stage deploy
script
helm upgrade --install my-app ./helm-chart --set image.tag=$IMAGE_TAG
모니터링 및 디버깅 도구
GitLab의 CI/CD > 파이프라인에서 파이프라인 상태를 모니터링합니다. 다음과 같은 도구를 사용합니다:
- Prometheus 및 Grafana: 메트릭 및 시각화를 위해.
- Kubernetes 대시보드: 클러스터 관리.
- kubectl logs: 배포 로그 가져오기.
kubectl logs -f deployment/my-app
결론
이 기사는 GitLab CI를 사용하여 Kubernetes의 CI/CD 파이프라인 구성에 대해 설명합니다. 필수 조건, YAML 구성, 비밀 관리, Helm 배포 및 모니터링 도구를 다룹니다. 이 설정으로 개발자는 컨테이너화된 애플리케이션을 효율적이고 신뢰성 있게 빌드, 테스트 및 배포할 수 있습니다.
Source:
https://dzone.com/articles/cicd-pipelines-for-kubernetes-using-gitlab-ci