DevOps/Helm, K8S

[Helm] Spring Batch Helm으로 GKE Job 배포(젠킨스에서 배포)

코딩콩 2023. 10. 15. 14:05

* 배치 잡을 GKE 파드 생성해서 돌리기 위한 여정 중🏃‍♀️

 

TODO

https://juyeonee826.tistory.com/188

 

[Helm] Spring Batch Helm으로 GKE Job 배포(로컬 테스트)

* 배치 잡을 GKE 파드 생성해서 돌리기 위한 여정 중🏃‍♀️ TODO https://juyeonee826.tistory.com/187 [GKE/K8S] GKE 생성, Spring batch job 실행(Cloud Shell 사용) * 배치 잡을 GKE 파드 생성해서 돌리기 위한 여정 중

juyeonee826.tistory.com

이것을 젠킨스에서 해내야한다.

  • helm 차트 배포
  • jenkins 다시 띄우기
    • helm, gcloud, google-cloud-sdk-gke-gcloud-auth-plugin 설치

 

Helm 차트 패키징

  • 차트 패키징
helm package my-chart
  • index.yaml 생성

차트에 관한 인덱스 파일을 생성해준다.

helm repo index ./

index.yaml에는 아래와 같은 내용이 적혀있다.

apiVersion: v1
entries:
  my-chart:
  - apiVersion: v2
    appVersion: 1.16.0
    created: "2023-10-12T00:07:32.605503+09:00"
    description: MY CHART !!
    digest: 7##############
    name: my-chart
    type: application
    urls:
    - my-chart-0.1.0.tgz
    version: 0.1.0
generated: "2023-10-12T00:07:32.604764+09:00"

결과적으로 .tgz 와 index.yaml이 생성됐다.

tree
.
├── README.md
├── my-chart
│   ├── Chart.yaml
│   ├── charts
│   ├── templates
│   │   └── job.yaml
│   └── values.yaml
├── my-chart-0.1.0.tgz
└── index.yaml

 

Github Private Repository에 배포

이제 github에 push 하면 된다. 그것이 배포 끝

 

 

Jenkins 다시 띄우기

Jenkins에서 helm을 쓰기 위해서 helm 플러그인을 설치하라는데 난 없다.

그래서 Jenkins 이미지에 Helm, gcloud, google-cloud-sdk-gke-gcloud-auth-plugin를 설치한 이미지를 다시 생성해서 띄웠다.

Dockerfile

FROM jenkins/jenkins:lts

USER root

RUN apt-get update && \
    apt-get install -y apt-transport-https && \
    apt-get install -y gnupg && \
    curl -fsSL https://baltocdn.com/helm/signing.asc | apt-key add - && \
    echo "deb https://baltocdn.com/helm/stable/debian/ all main" > /etc/apt/sources.list.d/helm-stable-debian.list && \
    apt-get update && \
    apt-get install -y helm

RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    apt-get install -y apt-transport-https ca-certificates && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update -y && \
    apt-get install google-cloud-sdk -y

RUN apt-get install google-cloud-sdk-gke-gcloud-auth-plugin

USER jenkins
docker build -t jenkins-helm .
docker run -d -p 8080:8080 -p 50000:50000 -v /var/lib/jenkins:/var/jenkins_home --name jenkins jenkins-helm

 

jenkins credential 추가

  • helm github repository 접근을 위한 github personal access token
  • gcloud 접근을 위한 gcloud json key

두개를 등록해줘야 한다.

  • github personal access token(PAT)

PAT 발급 과정은 패스하고 발급 받은 PAT를 secret text로 등록해준다.

  • gcloud json key

마찬가지로 json key 발급 과정은 패스하고 발급 받은 json key를 secret file로 등록해준다.

 

 

jenkins Freestyle project 생성

helm에 변수를 넘겨주는 과정에서 내가 설정한 변수 이외의 젠킨스 기본 변수까지 넘어가는 것이 Jenkinsfile에서 처리하는 과정이 깔끔하지 않다고 생각해서 pipeline은 쓰지 않기로 결정

  • 매개변수 추가
    • 해당 잡은 JOB_NAME, REQUEST_DATE, VERSION을 넘겨주고 있다.

 

  • 빌드 환경 -> Use secret text or file 추가

Execute shell에 쓰일 credential을 변수로 추가해둔다.

 

  • Execute shell 추가

gcloud 인증 shell

# GKE 인증
gcloud auth activate-service-account --key-file=${GCP_KEY}
gcloud container clusters get-credentials CLUSTER_NAME \
--zone asia-northeast3-a \
--project PROJECT_NAME

helm shell

# helm install
helm install $HELM_NAME my-helm/my-chart --set \
"env.activeProfiles=dev,\
env.jobName=${JOB_NAME},\
args={requestDate=${REQUEST_DATE},version=${VERSION}}" \
--replace# helm repo add
helm repo add my-helm \
"https://$PAT@raw.githubusercontent.com/GIT_/my-helm/main/"
helm repo update

# helm release name 생성
camelToKebab() {
  local input="$1"
  # 대문자 앞에 하이픈(-)을 추가하여 카멜 케이스를 케밥 케이스로 변환
  echo "$input" | sed 's/\([a-z0-9]\)\([A-Z]\)/\1-\2/g' | tr '[:upper:]' '[:lower:]'
}
KEBAB_CASE=$(camelToKebab $JOB_NAME)
HELM_NAME="my-chart-dev-$KEBAB_CASE"

# helm install
helm install $HELM_NAME my-helm/my-chart --set \
"env.activeProfiles=dev,\
env.jobName=${JOB_NAME},\
args={requestDate=${REQUEST_DATE},version=${VERSION}}" \
--replace

상세설명

helm repo add my-helm \
"https://$PAT@raw.githubusercontent.com/GIT_/my-helm/main/"

private repository에 배포한 차트 저장소를 추가하기 위한 커맨드이다.

index.yaml 파일의 raw view 경로 앞에 발급 받은 PAT를 넣어줘야 접근이 가능하다.(참고)

# helm release name 생성
camelToKebab() {
  local input="$1"
  # 대문자 앞에 하이픈(-)을 추가하여 카멜 케이스를 케밥 케이스로 변환
  echo "$input" | sed 's/\([a-z0-9]\)\([A-Z]\)/\1-\2/g' | tr '[:upper:]' '[:lower:]'
}
KEBAB_CASE=$(camelToKebab $JOB_NAME)
HELM_NAME="my-chart-dev-$KEBAB_CASE"

helm release name은 만들기 위한 코드이다. 카멜 케이스인 잡 네임을 케밥 케이스로 변환해주었다.

# helm install
helm install $HELM_NAME my-helm/my-chart --set \
"env.activeProfiles=dev,\
env.jobName=${JOB_NAME},\
args={requestDate=${REQUEST_DATE},version=${VERSION}}" \
--replace

동적으로 환경변수를 전달해주기 위해 set 플래그를 사용했고,

이전에 같은 이름으로 release 된 것이 있다면 덮어쓰기 위해 replace 플래그를 추가했다.

 

끝이다.

불안정하던 배치 잡 실행을 위해 Jenkins, Docker, GCP, Helm까지 다양하게 써먹었다,,,,