ㅡ.ㅡ

[Gitlab] CD/Helm 본문

WorkFlow

[Gitlab] CD/Helm

ekwkqk12 2021. 9. 25. 14:04

이전에 생성한 gitlab-admin SA와 dtzar/helm-kubectl 이미지를 활용해 Gitlab에서 helm 을 사용하여 CD작업을 진행한다.

helm_charts
저장소에 아래 이미지와 같이 helm_charts 폴더에 생성할 리소스 파일을 준비해놓는다.
values.yaml에 정의된 값들이 templates에 잇는 K8S 리소스 파일에 매핑된다.

.gitlab-ci.yml
kubectl 명령어를 사용하기 위해 k8s api 서버에 인증할 값들을 CI/CD 변수로 등록한다.
배포시 변경되는값(이미지 파일의 태그 값과 환경 등)들을 values파일에 추가하여 배포를 진행한다.

before_script:
  - export

# 스크립트에서 사용할 변수 설정
variables:
  DOCKER_TLS_CERTDIR: ''
  DOCKER_HOST: tcp://localhost:2375
  ECR_TAG_LATEST: latest
  ECR_TAG_COMMIT: $CI_COMMIT_SHORT_SHA  

services:
  - name: docker:19.03.13-dind

stages:
  - deploy

deploy_helm:
  stage: deploy
  image: dtzar/helm-kubectl:3.6.0
  environment:
    name: 1388-1
  script:
    - ls -al    
    - kubectl config set-cluster k8s --server=$K8S_API
    - kubectl config set clusters.k8s.certificate-authority-data $CERTIFICATE_AUTHORITY_DATA_B64
    - kubectl config set-credentials gitlab --token=$USER_TOKEN
    - kubectl config set-context default --cluster=k8s --user=gitlab
    - kubectl config use-context default
    - kubectl config view
    - kubectl get nodes
    - kubectl create secret docker-registry --dry-run=client $KUBE_NAMESPACE-secret 
      --docker-server=$ER 
      --docker-username=AWS 
      --docker-password=test -o yaml | kubectl apply -n $KUBE_NAMESPACE -f -
    - |
      cat >> ./helm_chart/values.yaml<< EOF
      CI_PJ_PATH_SLUG : $CI_PROJECT_PATH_SLUG
      CI_ENV_SLUG : $CI_ENVIRONMENT_SLUG
      IMG : $ER:$ECR_TAG_LATEST
      SECRET : $KUBE_NAMESPACE-secret
      EOF
    - cat ./helm_chart/values.yaml
    - helm upgrade $CI_PROJECT_NAME ./helm_chart --install --values=./helm_chart/values.yaml --namespace $KUBE_NAMESPACE

다른 프로젝트에 저장된 helm chart를 사용시에는 CI 작업 후 git docker image를 통해 values파일의 태그값을 업데이트해주는 작업을 진행 후 CD를 진행하는 워크플로우를 구성하면 된다.

CI/CD 변수
gitlab-runner를 통해 작업 시 CI/CD 변수를 정의하여 파이프라인 작업 실행 시 사용할 수 있다.

변수값 추출 스크립트(kubectl 명령어 되는 환경에서 실행)

echo '[+] ENV K8S_API'
kubectl config view --raw -o=jsonpath='{.clusters[0].cluster.server}'
echo -e '\n\n'

echo '[+] ENV CERTIFICATE_AUTHORITY_DATA_B64'
kubectl config view --raw -o=jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 --decode
echo -e '\n\n'

echo '[+] ENV USER_TOKEN'
GITLAB_SECRET=$(kubectl -n kube-system get secret | grep gitlab-admin-token | awk '{print $1}')
GITLAB_TOKEN=$(kubectl -n kube-system get secret $GITLAB_SECRET -o jsonpath='{.data.token}' | base64 --decode)
echo $GITLAB_TOKEN

PipeLine
gitlab CI/CD pipeline 작업 내역을 보면 helm을 통해 실패없이 배포것을 확인할 수 있고
Deployments 환경쪽을 확인해보면 pod가 정상적으로 배포된것을 확인할 수 있다.

helm 명령어
확인 : helm ls -n 네임스페이스
삭제 : helm uninstall 이름 -n 네임스페이스

'WorkFlow' 카테고리의 다른 글

[Jenkins] Gitlab Repo 연동  (0) 2021.09.28
[Jenkins] Jenkins  (0) 2021.09.26
[Gitlab] CD/Kubectl  (0) 2021.09.25
[Gitlab] CI/ECR  (3) 2021.09.20
[Gitlab] CI/GitLab Container Registry  (0) 2021.09.20