티스토리 뷰
1. CI/CD 개념
CI(Continuous Intergration) 지속적 통합
개발자가 코드를 지속적으로 통합하고 테스트하는 프로세스를 의미합니다.
CD(Continuous Delivery) 지속적 전달 또는 CD(Continuous Deployment) 지속적 배포
metallb 설치확인
user@myserver01:~$ helm ls --namespace mymetallb
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
metallb-1736923135 mymetallb 1 2025-01-15 06:38:56.19370089 +0000 UTC deployed metallb-0.14.9 v0.14.9
mymetallb라는 네임스페이스에 metallb를 설치되어있는 것을 확인할 수 있습니다.
실행중인 오브젝트 확인
user@myserver01:~$ kubectl get all --namespace mymetallb
NAME READY STATUS RESTARTS AGE
pod/metallb-1736923135-controller-5d7dd5db77-m7q4x 1/1 Running 1 (6h40m ago) 23h
pod/metallb-1736923135-speaker-8bp56 4/4 Running 12 (6h34m ago) 47h
pod/metallb-1736923135-speaker-kc846 4/4 Running 8 (6h38m ago) 47h
pod/metallb-1736923135-speaker-vf27t 4/4 Running 8 (6h40m ago) 47h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/metallb-webhook-service ClusterIP 10.98.156.54 <none> 443/TCP 47h
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/metallb-1736923135-speaker 3 3 3 3 3 kubernetes.io/os=linux 47h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/metallb-1736923135-controller 1/1 1 1 47h
NAME DESIRED CURRENT READY AGE
replicaset.apps/metallb-1736923135-controller-5d7dd5db77 1 1 1 47h
2. github actions 활용
GIT 설치
sudo apt install git-all
github 정보 설정 ("" 쌍따옴표필수)
user@myserver01:~$ git config --global user.name "사용자명"
user@myserver01:~$ git config --global user.email "사용자이메일"
git 초기화
user@myserver01:~$ cd /home/work/
user@myserver01:/home/work$ git init
새 리포지토리 생성
리포지토리명 작성 후 생성
Actions > set up a workflow youself-> 버튼을 클릭합니다.
name: HelloWorld
on: [push]
jobs:
echo:
runs-on: ubuntu-latest
steps:
- name: hello
run: echo "Hello, Gihub Actions!"
입력 후 Commit changes..버튼 클릭
<>Code 버튼 클릭 -> url을 복사합니다.
복사한 URL 실행 후 확인
user@myserver01:/home/work$ sudo git clone https://github.com/사용자아이디/github-actions-practice.git
Cloning into 'github-actions-practice'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (5/5), done.
user@myserver01:/home/work$ ^C
user@myserver01:/home/work$ cd github-actions-practice/
user@myserver01:/home/work/github-actions-practice$ cd .github/workflows/
user@myserver01:/home/work/github-actions-practice/.github/workflows$ ls -al
total 12
drwxr-xr-x 2 root root 4096 Jan 17 07:10 .
drwxr-xr-x 3 root root 4096 Jan 17 07:10 ..
-rw-r--r-- 1 root root 140 Jan 17 07:10 main.yml
깃허브 액션을 통해 도커 이미지를 빌드하고 컨테이너를 실행합니다.
user@myserver01:/home/work/github-actions-practice$ sudo vi Dockerfile
FROM python:3.13.1
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
user@myserver01:/home/work/github-actions-practice$ sudo vi requirements.txt
flask==3.1.0
gunicorn==23.0.0
user@myserver01:/home/work/github-actions-practice$ sudo mkdir myapp
user@myserver01:/home/work/github-actions-practice$ cd myapp/
user@myserver01:/home/work/github-actions-practice/myapp$ sudo vi 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)
flask 파일을 활용해 도커 이미지를 빌드하고 컨테이너를 실행하는 워크플로를 생성하는 파일을 만듭니다.
user@myserver01:/home/work/github-actions-practice/.github/workflows$ sudo vi 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.12'
- name: Run Flask Docker container
run: docker container run -d --name myflask-ac -p 8001:8001 myflask-test
- name: Test Flask app
run: |
sleep 10
curl http://127.0.0.1:8001
- name: Stop and remove Docker container
run: |
docker container stop myflask-ac
docker container rm myflask-ac
Docker Test 은 워크플로명입니다.
on: 워크플로가 실행되는 시점을 지정합니다. main 브랜치에 push 이벤트가 발생할때 워크플로가 실행되도록 설정했습니다.
jobs:는 워크플로에서 실행될 작업들을 정의합니다. ubuntu가 실행되도록 빌드환경을 세팅했습니다.
steps:는 각 세부 작업의 단계를 나타냅니다.
actions/setup-python@v3은 깃허브액션에서 제공하는 check out 액션을 의미하며 @v3는 액션의 버전입니다.
로그인을 위해 github 사이트로 이동합니다.
상단바 프로필 아이콘 클릭
Settings 버튼 클릭
Developer settings 버튼 클릭
Personal access tokens > Tokens(classic) 버튼 클릭
Generate new token > Generate new token(classic) 버튼 클릭
작성 후 하단 Generate Token 버튼 클릭
생성 후 나타나는 토큰은 비밀번호를 입력할 때 비밀번호가 아니라 토큰을 붙여넣기하여 사용합니다.
업로드할 git branch 정보와 remote 정보를 확인합니다.
user@myserver01:/home/work/github-actions-practice$ sudo git branch
* main
user@myserver01:/home/work/github-actions-practice$ sudo git remote
origin
add 명령어로 스테이지 영역에 추가하는 명령어
user@myserver01:/home/work/github-actions-practice$ git add .
user@myserver01:/home/work/github-actions-practice$ sudo git commit -m "flask docker test"
commit 후 push
github의 아이디와 비밀번호를 입력하라고 하는데 반드시 비밀번호는 위에서 생성한 토큰 값으로 입력합니다.
user@myserver01:/home/work/github-actions-practice$ sudo git push
Username for 'https://github.com': 사용자아이디
Password for 'https://이메일아이디@github.com': 발급받은 토큰 붙여넣기!!
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 1.12 KiB | 1.12 MiB/s, done.
Total 9 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/~/github-actions-practice.git
77b6771..af18fa0 main -> main
3. ArgoCD 활용하기
깃허브 액션을 통해 도커 이미지를 빌드하고 컨테이너 실행 테스트는 할 수 있습니다. 그러나 테스트에서 나아가 배포를 하려면 어려움이 있습니다. 이를 해결하기 위해 나온것이 ArgoCD입니다.
ArgoCD는 쿠버네티스 애플리케이션의 자동배포를 가능하게 해주는 오픈소스 소프트웨어입니다. ArgoCD를 이용하면 쿠버네티스 클러스터의 애플리케이션을 지속적으로 관리하고 배포할 수 있습니다.
ArgoCD설치하기
https://argo-cd.readthedocs.io/en/stable/getting_started/
네임스페이스 생성 후 ArgoCD 설치
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
ArgoCD CLI 설치
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64
Argo CD 설치 시, 기본적으로 외부 주소로 노출되지 않기 때문에 외부에서 접속할 수 있게 노트포트로 적용한다.
# NodePort
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
# LoadBalancer
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
# Port Forwarding
kubectl port-forward svc/argocd-server -n argocd 8080:443
Argo 로그인
# admin의 초기 비밀번호 조회
argocd admin initial-password -n argocd
094f0a9mUR-UKYck
# EXTERNAL-IP 조회
kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-applicationset-controller ClusterIP 10.106.184.57 <none> 7000/TCP,8080/TCP 2d15h
argocd-dex-server ClusterIP 10.96.18.18 <none> 5556/TCP,5557/TCP,5558/TCP 2d15h
argocd-metrics ClusterIP 10.101.192.188 <none> 8082/TCP 2d15h
argocd-notifications-controller-metrics ClusterIP 10.97.145.226 <none> 9001/TCP 2d15h
argocd-redis ClusterIP 10.107.61.197 <none> 6379/TCP 2d15h
argocd-repo-server ClusterIP 10.103.9.183 <none> 8081/TCP,8084/TCP 2d15h
argocd-server LoadBalancer 10.103.108.147 10.0.2.21 80:30114/TCP,443:30716/TCP 2d15h
argocd-server-metrics ClusterIP 10.105.94.83 <none> 8083/TCP 2d15h
argocd-server EXTERNAL-IP 의 10.0.2.21 의 TCP 포트 80 열기
고급 > 안전하지 않음 버튼 클릭
admin으로 접속 ($ argocd admin initial-password -n argocd 조회결과 초기비밀번호)
github에 레포지토리 생성 -> 리포지토리명 입력 후 Create Repository 클릭
예시 소스 생성
user@myserver01:/home/work$ sudo mkdir argocd
user@myserver01:/home/work$ cd argocd
user@myserver01:/home/work/argocd$ sudo vi 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
user@myserver01:/home/work/argocd$ sudo vi 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
git 초기화 및 업로드
user@myserver01:/home/work/argocd$ sudo git init
hint: Using 'master' as the name for the initial branch. This default branch name
...생략..
user@myserver01:/home/work/argocd$ sudo git remote add origin https://github.com/깃아이디/argocd-practice.git
user@myserver01:/home/work/argocd$ sudo git add .
user@myserver01:/home/work/argocd$ sudo git commit -m "argocd-practice"
user@myserver01:/home/work/argocd$ sudo git push -u origin main
argo에 접속하여 Settings- > Repositories 클릭
+ CONNECT REPO 버튼 클릭
정보 입력 후 Connect 버튼 클릭
생성 후 Create application 버튼 클릭
Sync -> Synchronize 버튼 클릭하여 동기화 작업을 합니다.
argo cd 사이트에서 생성한 네임스페이스가 추가된 것을 확인 할 수 있습니다.
user@myserver01:/home/work/argocd$ kubectl get namespace
NAME STATUS AGE
argocd Active 2d16h
calico-apiserver Active 5d20h
calico-system Active 5d20h
default Active 6d19h
kube-flannel Active 6d19h
kube-node-lease Active 6d19h
kube-public Active 6d19h
kube-system Active 6d19h
mymetallb Active 4d19h
mynginx Active 4d19h
nginx-argocd-test02 Active 75s
tigera-operator Active 5d20h
user@myserver01:/home/work/argocd$ kubectl get all --namespace nginx-argocd-test02
NAME READY STATUS RESTARTS AGE
pod/deploy-test01-6cdbfdd676-g7cbt 1/1 Running 0 2m13s
pod/deploy-test01-6cdbfdd676-mn84d 1/1 Running 0 2m13s
pod/deploy-test01-6cdbfdd676-xs4pm 1/1 Running 0 2m13s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/web-service ClusterIP 10.106.58.64 <none> 80/TCP 2m14s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deploy-test01 3/3 3 3 2m13s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deploy-test01-6cdbfdd676 3 3 3 2m13s
어플리케이션명 클릭
deployment 클릭
Edit 버튼 클릭 ->replicas :3 을 1로 변경
파드가 3개에서 1개로 변경된 것을 확인 할 수 있습니다.
Delete 버튼 클릭
삭제 확인
user@myserver01:/home/work/argocd$ kubectl get all --namespace nginx-argocd-test02
No resources found in nginx-argocd-test02 namespace.
CI/CD 관련 기초 환경설정 및 설치를 완료하였습니다.
다음 글에서는 쿠버네티스 모니터링에 관하여 작성하겠습니다.
'Server' 카테고리의 다른 글
Docker & Kubernetes 개념 총 정리 7 (0) | 2025.01.16 |
---|---|
Docker & Kubernetes 개념 총 정리 6 (0) | 2025.01.15 |
Docker & Kubernetes 개념 총 정리 5 (0) | 2025.01.15 |
Docker & Kubernetes 개념 총 정리 4 (0) | 2025.01.13 |
Docker & Kubernetes 개념 총 정리 3 (0) | 2025.01.07 |
- Total
- Today
- Yesterday