본문 바로가기

PrivateCloud/CI CD (지속적인 통합, 배포 파이프라인 구축)

2. (CI/CD) Argocd를 활용한 배포 with Github, Jenkins

728x90
반응형

# 이전 버전과 다른 내용은 아래와 같다. Harbor → ECR

1. ECR 사용을 위한 자격증명 생성

AWS 자격증명 설정

가장 쉽게 credentials을 알아내는 방법은. cat ~/.aws/credentials 명령어로 이미 설정되어 있는 credentials 을 얻는 것이다.

만약 자격증명 설정을 하지 않았다면 없는 파일이라고 나올수 있다.

아니면, IAM > Users > Security credentials > Create Access Key 를 생성할수 있다.

그래서 필요한건 ACCESS KEY 그리고 SECRET KEY 두개다.

- Jenkins에서 설정은 다음과 같다.

Dashboard > Manage Jenkins > Manage Credentials

아래와 같은 화면에서 Stores > (global) 클릭 > 누르면 왼쪽에 Add Credentials 을 클릭한다.

생성은 아래의 내용을 참고하여 만든다.
ID (jenkins-aws-zzanggu-credentials) 는 Jenkins Pipeline에서 다시 사용 된다.

2. ECR 사용을 위한 로그인 (Github 로그인 하는것과 비슷)

- 로그인은 아래의 명령어를 활용하여 진행한다.

- 만약에 다른 리전의 EC2 환경이나, 다른 계정의 EC2 환경 및 리소스에서 접근 시 aws configure를 통해

Access Key ID 와 Secret Access Key 값을 입력하여 로그인을 진행해야 한다. 그 후 아래의 작업을 진행하면 된다.

sudo aws ecr get-login --no-include-email --region ap-northeast-2

- ECR login 수행

sudo $(aws ecr get-login --no-include-email --region ap-northeast-2)

- login에 성공하면 아래와 같이 화면이 나온다.

- deployment.yaml 파일과 service.yaml 파일을 생성

- deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-app
  namespace: example
  labels:
    app: example-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example-app
  strategy: {}
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - name: bcheck-api
        image: {ecr주소}/repo-example-jenkins:v47
        ports:
         - containerPort: 8080
        resources: {}

- service.yaml

apiVersion: v1
kind: Service
metadata:
  name: example-service
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: "/healthy"
  namespace: example
spec:
  selector:
     app: example-app
  type: NodePort
  ports:
  - port: 9991
    protocol: TCP
    targetPort: 8080

- 서비스 확인

3. Github와 argocd 연동 with 자동배포

- Github에 Private Repository를 생성 argocd에서 레포지토리 파일에 변동사항이 생기면 새롭게 배포 하는 방식

예) 예를들어 deployment.yaml 파일에 replicas가 3으로 설정되어 있다가 10으로 변경 후 업로드 시 argocd는 이를 반응하고 자동으로 배포를 수행한다.

https://may9noy.tistory.com/345

 

ArgoCD + Docker hub 를 활용하여 Kubernetes에 배포하기

# 새로운 CI 방법과 CD방법이 계속해서 등장한다. 새로운 기술들이 그것도 오픈소스로 지속적으로 등장하기 때문에 트랜드를 빨리 파악하고 테스트 해보고 적용하여 필요한 부분을 적용하는 것

may9noy.tistory.com

- Git 레포지토리를 연동해보자.

설정 > 레포지토리 클릭

- HTTPS 방식으로 해보자

- 타입은 Git이고, Repository URL에는 본인이 사용할 레포지토리 주소를 넣어주면 된다.

- 연동 성공

* 만약 argocd에서 Github Repository가 연동이 되지 않는다면, sudo reboot 및 서버를 재부팅 하여 다시 시도하는것이 필요하다.

Github의 Repository 연동은 어려운것이 아니기 때문에 연동이 되어야 한다.

- 애플리케이션 배포하기

ArgoCD의 Applications 탭에서 NEW APP 을 클릭하자

간단하게 nginx를 배포하는 Manifest 파일을 git 레포지토리에 올려두고 ArgoCD로 배포해보자

- 2개의 파일이 생성 되어 있어야 한다.

- deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: mynginx
  template:
    metadata:
      labels:
        run: mynginx
    spec:
      containers:
      - image: nginx
        name: mynginx
        ports:
        - containerPort: 80

- service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mynginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: mynginx

- Application Name : nginx를 배포할거니까 간단하게 nginx라고 지정
- Project : ArgoCD에서 애플리케이션을 구분하고 관리하기 위한 논리적인 그룹
- SYNC POLICY : Git의 환경과 비교하는 것을 수동으로 할지 자동으로 할지 선택
- Prune Resources : 변경 사항에 기준 리소스를 업데이트할 때, 기존의 리소스를 삭제하고 새로운 리소스를 생성
- Self Heal : ArgoCD가 지속적으로 Git 레포지토리의 설정값과 싱크를 맞춤

- Repository URL : 사용할 레포지토리 URL
- Revision : Git의 Revision (HEAD , Master branch 등)을 선택
- Path : Git의 저장소의 주소
- Cluster URL  : Kubernetes의 어느 클러스터에 배포할지 결정
- Namespace : Kubernetes 클러스터의 어느 Namespace에 배포할지 결정

모든것을 설정하고 나서 Create 를 클릭해주면, 아래와 같이 Kubernetes 클러스터의 리소스들을 시각화하여 한눈에 알기 쉽도록 볼수 있다. nginx 라는 애플리케이션에 나의 Git 레포지토리에 올려두었던 deployment.yaml와 service.yaml이 배포되어 한개의 pod가 생성되어 있는 모습이다.

deployment의 replicas를 1에서 5으로 수정해보았다.

그 결과, ArgoCD에서도 파드가 5개로 늘어나는 모습을 보여주었다.

메뉴의 HISTORY AND ROLLBACK을 클릭하면 git의 수정사항도 볼 수 있고 이전 버전으로 롤백까지 쉽게 할 수 잇다.
ArgoCD를 사용하여 Kubernetes를 관리함으로써 더욱 쉽게 배포하고 관리할 수 있다.

4. Jenkinsfile에서 github로 파일 push 하기

- 현재 유저는 코드를 Gitlab에 업로드 하고 업로드 되는 순간 Webhook이 동작하여 Jenkinsfile이 실행되어 코드 파이프라인이 동작한다. 코드 파이프라인에서 dockerfile과 jenkinsfile을 기반으로 이미지를 생성하고 해당 이미지를 ECR에 저장한다. 저장된 ECR 이미지를 배포를 하는데 배포의 기준은 Github에 내용이 변경될때 이다. Github은 argocd와 연동되어 있으므로 Github에 deployment.yaml이나 service.yaml 등 변경이되면 argocd는 바로 즉각 반응하여 배포를 수행한다.

- 지금은 Jenkinsfile에서 Github으로 파일을 push하여 argocd가 push된 파일을 배포하도록 하는 작업을 수행한다.

- Github에서 토큰을 발급받고 Jenkins Credential에 등록 후 Jenkinsfile로 연동을 수행한다.

Github Settings > Developer settings > Personal access token 로 들어간다.

- Tokens (classic)을 클릭하여 이전의 토큰을 받는 방식으로 토큰을 생성한다.

- 아래 처럼 토큰의 목적을 선택 후 생성 한다.

- 토큰이 발급 되었다. 어딘가에 잘 적어 두자.

5. Jenkins로 이동하여 발급받은 토큰을 등록

Jenkins > Jenkins 관리 > Manage Credential > System으로 이동

Global credential을 클릭하여 Credential을 추가하는 창으로 이동 > Add Credencials를 클릭하여 새로운 자격증명을 생성

- 아래의 내용에 맞춰 입력

Kind는 Username with password 를 선택

Username 은 본인의 깃허브 아이디를 선택

Password는 이전에 발급받은 Github Token 값을 복사후 붙여널기

ID값은 원하는 값으로 설정해주시면 되며, git 이 jenkins에게 Credential을 줄 때 인식할 수 있도록 한다.

- 이제 Credencials가 생성이 되었고 Jenkinsfile에 적용을 하면된다.

- 에러 발생 시 해결

 

728x90
반응형