Kubernetes 이야기

Argo workflow 를 활용하여 CI/CD 구축하기 (기본설치) 본문

Kubernetes/devops

Argo workflow 를 활용하여 CI/CD 구축하기 (기본설치)

kmaster 2022. 3. 6. 22:44
반응형

Argo Workflow

 

Argo Workflows는 Kubernetes에서 병렬 작업을 오케스트레이션하기 위한 오픈 소스 컨테이너 네이티브 워크플로 엔진입니다. Argo Workflows는 Kubernetes CRD(Custom Resource Definition)로 구현됩니다.

 

  • 워크플로의 각 단계가 컨테이너인 워크플로를 정의합니다.
  • 다단계 워크플로를 작업 시퀀스로 모델링하거나 DAG(방향성 비순환 그래프)를 사용하여 작업 간의 종속성을 캡처합니다.
  • Kubernetes에서 Argo Workflows를 사용하여 짧은 시간 안에 기계 학습 또는 데이터 처리를 위한 컴퓨팅 집약적인 작업을 쉽게 실행할 수 있습니다.
  • 복잡한 소프트웨어 개발 제품을 구성하지 않고도 Kubernetes에서 기본적으로 CI/CD 파이프라인을 실행합ㄴ디ㅏ.

 

왜 사용하는가?

 

  • 레거시 VM 및 서버 기반 환경의 오버헤드와 제한 없이 처음부터 컨테이너용으로 설계되었습니다.
  • 클라우드에 구애받지 않으며 모든 Kubernetes 클러스터에서 실행할 수 있습니다.
  • Kubernetes에서 고도로 병렬화된 작업을 쉽게 오케스트레이션합니다.
  • Argo Workflows는 클라우드 규모의 슈퍼컴퓨터를 손쉽게 사용할 수 있게 해줍니다!

그럼, 이제 argo workflow를 활용하여 만들  CI/CD 프로세스는 아래와 같다.

 

1. git : 소스 저장소

2. SonarQube : 소스 취약성 검사

3. Kaniko : Container Image Build

4. Trivy : Container Image 취약성 검사

5. Container Registry : Image 저장소

6. CD ( B/G or Canary ) : Argo rollout 사용

 

그럼 먼저 argo를 설치해 보자.

 

설치

설치는 아래와 같이 진행한다.

 

# kubectl create ns argo
# kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo-workflows/master/manifests/quick-start-postgres.yaml

 

설치된 내역은 아래와 같다.

# kubectl get all -n argo
NAME                                       READY   STATUS    RESTARTS   AGE
pod/argo-server-5d58f6585d-c5rc5           1/1     Running   1          114s
pod/minio-79566d86cb-rcc7h                 1/1     Running   0          114s
pod/postgres-546d9d68b-bjjcj               1/1     Running   0          114s
pod/workflow-controller-649c5c9cb7-wdr72   1/1     Running   0          114s

NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/argo-server                   ClusterIP   10.104.197.95    <none>        2746/TCP   114s
service/minio                         ClusterIP   10.102.251.224   <none>        9000/TCP   114s
service/postgres                      ClusterIP   10.100.13.178    <none>        5432/TCP   114s
service/workflow-controller-metrics   ClusterIP   10.105.6.14      <none>        9090/TCP   114s

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argo-server           1/1     1            1           114s
deployment.apps/minio                 1/1     1            1           114s
deployment.apps/postgres              1/1     1            1           114s
deployment.apps/workflow-controller   1/1     1            1           114s

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/argo-server-5d58f6585d           1         1         1       114s
replicaset.apps/minio-79566d86cb                 1         1         1       114s
replicaset.apps/postgres-546d9d68b               1         1         1       114s
replicaset.apps/workflow-controller-649c5c9cb7   1         1         1       114s

 

argo-server의 service를 nodePort로 변경 후 https:// 로 접근하면 아래와 같이 보인다.

 

kind를 사용하는 경우는 ingress로 등록하여 접속한다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argo-ingress
  namespace: argo
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: https
    cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
spec:
  rules:
  - host: "argo.10.10.100.10.nip.io"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argo-server
            port:
              number: 2746
  tls:
  - hosts:
    - argo.10.10.100.10.nip.io
    secretName: argo-cert​

 

 

그럼 이제, Pipeline의 첫단계인 git repostiry에서 소스를 받아오는 샘플을 만들어보자.

 

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: input-artifact-git-
spec:
  entrypoint: git-clone
  templates:
  - name: git-clone
    inputs:
      artifacts:
      - name: argo-source
        path: /src
        git:
          repo: git://github.com/kmaster8/kubernertes.git
          revision: "main"
    container:
      image: busybox
      command: [sh, -c]
      args: ["ls -al"]
      workingDir: /src

 

실행을 하면 아래와 같이 실행결과를 조회할 수 있다.

 

 

 

위의 로그는 argo workflow에서 실행하였던 git clone 결과를 보여주는 것이다.

 

* Argo 실행 시 Container는 정상 종료되었으나 실패로 표기되는 경우가 있다.



위 에러는 workflow 컨트롤러가 default 계정을 사용하는데 이 default 계정으로는 pod의 로그 조회 등 충분한 권하니 없어서이다.

아래와 같이 ServiceAccount를 생성하고 workflow 실행 시 serviceaccout를 지정하여 준다.

export NAMESPACE=argo
kubectl apply -n ${NAMESPACE} -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: workflow
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - "*"
- apiGroups:
  - "apps"
  resources:
  - deployments
  verbs:
  - "*"
- apiGroups:
  - ""
  resources:
  - pods/log
  verbs:
  - "*"
- apiGroups:
  - machinelearning.seldon.io
  resources:
  - "*"
  verbs:
  - "*"
EOF

kubectl create -n ${NAMESPACE} serviceaccount workflow

kubectl create rolebinding -n ${NAMESPACE} workflow --role=workflow --serviceaccount=${NAMESPACE}:workflow​

 

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: input-artifact-git-
spec:
  serviceAccountName: workflow
  entrypoint: git-clone
  ...

 

이제 다음 글에 두번째 pipeline 절차인 Sonarqube 연동하는 방법을 테스트해 보겠다.

반응형
Comments