본 글을 쿠버네티스 환경에서 진행합니다.
앞선 K8s 시리즈를 읽고 오시면 실습에 대한 이해가 수월합니다!
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
# 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/
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에서 파드 수 줄이기
'Cloud' 카테고리의 다른 글
[K8s] Kubernetes 활용한 웹 서비스 배포 (0) | 2024.11.05 |
---|---|
[K8s] Kubernetes Ingress 및 Helm (2) | 2024.11.05 |
[K8s] Kubernetes Service (1) | 2024.11.05 |
[K8s] kubectl과 Workload (0) | 2024.10.25 |
[K8s] K8s 구조 및 실습 환경 구축 (0) | 2024.10.01 |