DevOps

[CI/CD] Github Actions와 ArgoCD를 활용한 CI/CD

혬수 2024. 11. 5. 20:56

 

본 글을 쿠버네티스 환경에서 진행합니다.

앞선 한 권으로 배우는 도커&쿠버네티스 시리즈를 읽고 오시면 실습에 대한 이해가 수월합니다!

 

Github Actions 📌

소프트웨어 워크플러 자동화를 쉽게 만들어주는 CI/CD 도구

개발의 work flow를 자동화할 수 있게 도와주는 툴

 

구성요소

 

  • Workflow
    • 하나 이상의 Job으로 구성
    • Event에 의해 트리거될 수 있는 자동화된 프로세스
    • .github/workflows 디렉토리에 저장
  • Event
    • Workflow 실행을 트리거하는 저장소의 특정 활동
    • REST API에 게시하거나, 수동으로 schedule에 따라 트리거 될 수 O
  • Job
    • 동일한 Runner에서 실행되는 Steps의 집합
    • 기본적으로 병렬로 실행되지만, 종속성 설정 가능
  • Step
    • Task들의 집합
    • 커맨드 날리거나, action을 실행할 수 있다.
      • run: 커맨드 날릴때 사용
      • uses: 어떤 액션을 사용할지 지정 → 이미 만들어진 액션을 사용할 때 지정
  • Action
    • Workflow의 가장 작은 블럭(smallest portable building block)
    • 자주 반복되는 작업을 수행
    • 직접 작성하거나, Marketplace에 있는 공용 Action을 사용할 수도 있음
  • Runner
    • Workflow를 실행하는 인스턴스
    • 각 Runner는 한 번에 하나의 Job을 실행

 

실습

사전 준비 사항 : Github에 github-actions-practice repo 생성

https://github.com/ShimHyesu/github-actions-practice

 

GitHub - ShimHyesu/github-actions-practice: 한 권으로 배우는 도커 & 쿠버네티스 chapter11

한 권으로 배우는 도커 & 쿠버네티스 chapter11. Contribute to ShimHyesu/github-actions-practice development by creating an account on GitHub.

github.com

 

# myserver01

sudo apt install git-all

git config --global user.name <gitHub 이름>
git config --global user.email <gitHub 이메일>

cd ~/work/ch11/ex01

git clone <github URL>

cd github-actions-practice

 

Dockerfile 및 프로젝트 생성

# ~/work/ch11/ex01/github-actions-practice/Dockerfile

FROM python:3.11.2

WORKDIR /usr/src/app

COPY . .

RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt

WORKDIR ./myapp

CMD gunicorn main:app --bind 0.0.0.0:8001

EXPOSE 8001
# ~/work/ch11/ex01/github-actions-practice/requirements.txt

flask==2.3.1
gunicorn==20.1.0
# ~/work/ch11/ex01/github-actions-practice/myapp/main.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'hello world!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8001)

 

Github Actions 파일 생성 및 push

# ~/work/ch11/ex01/github-actions-practice/.github/workflows/flask-test.yml

name: Docker Test

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout#v3

      - name: Set up Python
        uses: actions/setup-python@v3
        with:
          python-version: '3.11'

      - name: Build Flask Docker image
        run: docker build -t myflask-test .

      - name: Run Flask Docker container
        run: docker run -d -p 8001:8001 --name myflask-ac myflask-test

      - name: Test Flask app
        run: |
          sleep 10
          curl http://127.0.0.1:8001

      - name: Stop and remove Docker container
        run: |
          docker stop myflask-ac
          docker rm myflask-ac
cd ~/work/ch11/ex01/github-actions-practice

git add .
git commit -m "Flask Docker test"

git push
## Github 해당 repo Actions 탭에 성공적으로 빌드된 것 확인

 

 

 

ArgoCD 📌

쿠버네티스 애플리케이션의 자동 배포를 가능하게 해주는 오픈소스 소프트웨어

 

ArgoCD 설치

https://argoproj.github.io/argo-helm/

 

Argo Helm Charts

ArgoProj Helm Charts

argoproj.github.io

cd ~

helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

helm search repo argo
## 여기서 argo/argo-cd 설치할거임

cd ~/work/app
mkdir argocd
cd argocd

helm pull argo/argo-cd

ls
## argo-cd-7.7.0.tgz
tar xvfz argo-cd-7.7.0.tgz
mv argo-cd argo-cd-7.7.0
cd argo-cd-7.7.0

cp values.yaml my-values.yaml
k create namespace myargocd
k get ns

helm install -n myargocd --generate-name argo/argo-cd -f my-values.yaml


k get all -n myargocd
## 파드 모두 Running -> 원활하게 실행중
## argocd server 서비스 타입이 ClusterIP -> 외부에서 접근할 수 있도록 변경

k patch svc argo-cd-1730803969-argocd-server -n myargocd -p '{"spec": {"type": "LoadBalancer"}}'

# 로그인을 위한 비밀번호 확인
k -n myargocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
## 0sKyncY5kBk...

k port-forward -n myargocd service/argo-cd-1730803969-argocd-server 2001:80 --address 0.0.0.0

 

ArgoCD 접속

  • 아이디: admin
  • 비밀번호: 0sKyncY5kBk...

Deployment, Service 생성

# ~/work/ch11/ex02/deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-test01
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: web-deploy
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web-deploy
    spec:
      containers:
        - name: nginx
          image: nginx:1.24
# ~/work/ch11/ex02/service.yml

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app.kubernetes.io/name: web-deploy
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80

 

Github 연동

사전 세팅 : Github repo 생성 → argocd-practice

https://github.com/ShimHyesu/argocd-practice

 

git remote add origin <Github repo URL>
git branch -M main
git push -u origin main

git add .
git commit -m "ArgoCD practice"

git push -u origin main

 

ArgoCD 대시보드 세팅

  • Settings
    • VIA HTTPS
    • Project : default
    • Repository URL 작성

 

  • Applications
    • Application Name: nginx-test02
    • Project Name: default
    • SYNC POLICY: Manual
    • SYNC OPTIONS - AUTO CREATE NAMESPACE
    • SOURCE - Repository URL 선택
    • SOURCE - Revision: HEAD
    • SOURCE - Path: .
    • DESTINATION - Cluster URL → 선택
    • DESTINATION - Namespace: nginx-argocd-test02

 

  • Syncornize

 

k get namespace

k get all -n nginx-argocd-test02

 

ArgoCD에서 파드 수 줄이기