Study/CI&CD

spinnaker CD 연동해 보기 - jenkins, kubernetes 연동, pipeline 사용

Bluesky_ 2022. 12. 22. 19:24
반응형

전체 글타래

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.01 - [Study/CI&CD] - spinnaker CD 연동해 보기 (3) - jenkins parameter 사용, kubernetes livenessProbe, readinessProbe 설정

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를 삭제 후 생성하는 방식이 아닌 추가적인 설정을 진행해야 한다.

반응형