티스토리 뷰

Server

Docker & Kubernetes 개념 총 정리 8

마시멜로co. 2025. 1. 17. 17:20

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 클릭

https://github.com/new

 

예시 소스 생성

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 관련 기초 환경설정 및 설치를 완료하였습니다.

 

다음 글에서는 쿠버네티스 모니터링에 관하여 작성하겠습니다.

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크