spinnaker CD 연동해 보기 - jenkins, kubernetes 연동, pipeline 사용
전체 글타래
2022.12.18 - [Study/CI&CD] - 로컬 kubernetes에 Spinnaker 설치해 보기
2022.12.22 - [Study/CI&CD] - spinnaker CD 연동해 보기 - jenkins, kubernetes 연동, pipeline 사용
2022.12.26 - [Study/CI&CD] - spinnaker CD 연동해 보기 (2) - deploy manifest artifact 사용, SpEL 사용
2023.01.10 - [Study/CI&CD] - spinnaker CD 연동해 보기 (4) - pipeline template 사용해 보기
Jenkins 연동하기
jenkins의 빌드가 성공한 이후 트리거로 spinnaker가 실행되어야 하기 때문에 spinnaker에 jenkins 연동이 필요하다.
jenkins 사용을 활성화하고 주소를 추가한다.
hal config ci jenkins enable
hal config ci jenkins master add bluesky-jenkins --address http://jenkins-service.default:8080
Kubernetes docker registry secret 설정하기
http로 docker push를 하는 insecure registries 설정을 이전 글에서 진행하였었다.
2022.12.21 - [Study/CI&CD] - (Docker Desktop & Rancher Desktop) docker insecure registries 설정하기
kubernetes에서 deployment를 만들어 image를 호출할 때 privatge repository에서 이미지를 가져와야 한다.
이때 priavte repository의 계정 정보를 설정해야 한다.
https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
해당 설정을 추가한 후 kubernetes deployment yaml 파일에 해당 secret 사용 설정을 추가하면 가져올 수 있게 된다.
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regcred
예를 들면 image는 내 경우 192.168.0.9:8083/test/testImage:latest와 같은 주소이다.
(Rancher Desktop 사용 시엔 localhost 도메인 사용이 가능하였는데 Docker Desktop 사용 시엔 localhost를 사용할 수 없었고 ip로 지정하여 사용하였다. 환경 차이인지 두 app의 차이인지 확인하지 못하였음)
Spinnaker Application의 pipeline 사용해 보기
이제 본격적으로 spinnaker를 사용할 차례가 되었다.
Project와 Application이 있는데 여러 Application을 만들고 그걸 Project로 묶어 관리할 수 있다.
Application 생성하기
https://spinnaker.io/docs/guides/user/applications/create/
Application 탭을 선택하고 Create Application 버튼을 클릭하여 Application을 만든다.
Pipeline 생성하기
https://spinnaker.io/docs/guides/user/pipeline/managing-pipelines/
만들어진 Application의 Pipelines 메뉴에서 Configure a new pipeline을 클릭하여 적당한 이름의 pipeline을 생성한다.
Pipeline의 Automated Trigger 설정하기
생성된 pipeline의 Automated Triggers에서 Add Trigger를 선택한 후 Jenkins를 선택하여 Trigger를 유발할 job을 선택한다.
이제 jenkins의 해당 job이 실행된 이후 spinnaker의 이 pipeline이 시작된다.
다음으로 Add Stage로 pipeline의 다음 단계를 추가한다.
Pipeline의 Deploy Manifest 설정하기
Deploy (Manifest)를 선택하고 Deploy Configuration에 배포할 Kubernetes Deployment를 설정한다.
내 경우 대략 다음과 같이 추가하였다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: bluesky-cloud-netflix-eureka-server-deployment
namespace: default
labels:
app: bluesky-cloud-netflix-eureka-server
spec:
replicas: 1
selector:
matchLabels:
app: bluesky-cloud-netflix-eureka-server
template:
metadata:
labels:
app: bluesky-cloud-netflix-eureka-server
spec:
containers:
- args:
- '--spring.profiles.active=k8sdev'
image: '192.168.0.9:8083/luversof/bluesky-cloud-netflix-eureka-server:latest'
name: spring
ports:
- containerPort: 30100
imagePullSecrets:
- name: regcred
---
apiVersion: v1
kind: Service
metadata:
labels:
app: bluesky-cloud-netflix-eureka-server
name: bluesky-cloud-netflix-eureka-server-service
namespace: default
spec:
ports:
- nodePort: 30100
port: 30100
protocol: TCP
targetPort: 30100
selector:
app: bluesky-cloud-netflix-eureka-server
type: NodePort
간단하게 Trigger로 deployment를 수행하는 pipeline이 구성되었다.
jenkins에 trigger 될 job을 수행하여 spinnaker까지 정상적으로 동작하는지 확인하면 된다.
C:\Users\bluesky>kubectl get po -l app=bluesky-cloud-netflix-eureka-server
NAME READY STATUS RESTARTS AGE
bluesky-cloud-netflix-eureka-server-deployment-66cb4cd747-qqgnk 1/1 Running 0 79s
pipeline의 Deploy Manifest 앞에 Delete Manifest 추가해 보기
이제 재 배포 시 기존 배포를 삭제하고 배포하도록 pipeline을 수정해 보았다.
Add Stage로 Delete Manifest를 추가하고 Deploy Manifest의 Depends On을 Delete Manifest로 지정하면 각 Stage의 순서를 지정할 수 있다.
Delete Manifest를 추가하고 설정한 후
Deploy Manifest의 Depends On을 Delete Manifest로 지정하면
pipeline 순서를 지정하고 Delete Manifest의 항목을 다음과 같이 설정하였다.
kuberentes pods의 label이 해당 값인 deployment와 service를 삭제하도록 설정하였다.
(이건 개인적으로 공부하면서 진행한 설정이기 때문에 이 방법을 추천하는 것은 아니다.)
trigger를 설정했기 때문에 jenkins에서 job이 실행돼도 해당 spinnaker의 pipeline이 실행되고
pipeline 메뉴의 Start Manual Execution을 실행해서 직접 해당 pipeline을 실행해볼 수도 있다.
(맨 위에 있는 Start Manual Execution은 여러 pipeline 중 하나를 선택하고 실행하도록 하는 버튼이고 아래의 경우 해당 pipeline을 바로 선택하여 실행하도록 하는 버튼이다.
하나의 application에 여러 pipeline이 존재하기 때문에 이렇게 메뉴가 제공된다.)
여기까지 간단하게 spinnaker를 통해 jenkins의 job이 빌드된 후 trigger 되어 kubernetes로 배포하는 pipeline을 만들어보았다.
위 배포의 경우 사실 실제로 사용할 수 있는 형식은 아니다.
기존 deployment와 service를 삭제 후 재 등록을 하는 식이기 때문이다.
무중단을 위해서는 latest 이미지를 가진 deployment를 삭제 후 생성하는 방식이 아닌 추가적인 설정을 진행해야 한다.