포스트

(멋쟁이사자처럼_백엔드스쿨플러스) Day14 Kubernetes를 이용한 자동배포

K8S 배포에 맞춰진, DB와 세션저장소로 REDIS를 사용하는 스프링부트 프로젝트로 세팅

github actions 설정

  • deploy.yml파일을 생성하여 push시 자동으로 배포하는지 테스트를 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
name: 'deploy'
on:
  push:
    paths:
      - '.github/workflows/**'
      - 'src/**'
      - 'build.gradle'
      - 'Dockerfile'
      - 'readme.md'
    branches:
      - 'main'
jobs:
  makeTagAndRelease:
    runs-on: ubuntu-latest
    outputs:
      tag_name: $
    steps:
      - uses: actions/checkout@v4
      - name: Create Tag
        id: create_tag
        uses: mathieudutour/github-tag-action@v6.1
        with:
          github_token: $
      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: $
        with:
          tag_name: $
          release_name: Release $
          body: $
          draft: false
          prerelease: false
  buildImageAndPush:
    name: 도커 이미지 빌드와 푸시
    needs: makeTagAndRelease
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Docker Buildx 설치
        uses: docker/setup-buildx-action@v2
      - name: 레지스트리 로그인
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: $
          password: $
      - name: set lower case owner name
        run: |
          echo "OWNER_LC=${OWNER,,}" >> ${GITHUB_ENV}
        env:
          OWNER: "$"
      - name: application-secret.yml 생성
        env:
          ACTIONS_STEP_DEBUG: true
          APPLICATION_SECRET: $
        run: echo "$APPLICATION_SECRET" > src/main/resources/application-secret.yml
      - name: 빌드 앤 푸시
        uses: docker/build-push-action@v3
        with:
          context: .
          push: true
          tags: |
            ghcr.io/$/저장소명:$,
            ghcr.io/$/저장소명:latest

kube 클러스터 생성

kubeadm을 이용한 클러스터 생성

  • Day12 파일 참고하여 클러스터를 생성한다.
  • 마스터 노드와 워커 노드를 생성한다.

DB 설정, REDIS 설정

  • Day 12일 파일을 참고 하여 설정한다.
  • DB용도 : 클라이언트가 요청한 데이터를 저장하는 용도
    • DB 연결후 spring에서 접속할 DataBase를 설정한다.
  • REDIS용도 : 세션을 저장하는 용도
    • kubenetes를 사용하면 pod 접근을 round-robin 방식으로 접근하기 때문에 세션을 저장할 때 문제가 발생할 수 있다.
    • 이를 해결하기 위해 REDIS에 세션을 저장하고, 클라이언트가 요청할 때 REDIS에 저장된 세션을 가져오는 방식으로 해결한다.

Nginx Proxy Manager설정

  • Day 12일 파일을 참고 하여 마스터 노드에 Nginx Proxy Manager 서비스를 생성한다.
  • Nginx Proxy Manager는 클라이언트가 요청한 데이터를 받아서, 해당 데이터를 전달해주는 역할을 한다.
  • DB stream설정
    • mysql 설정은 도메인:3306으로 들어오는 경로에 대해 Service:3306으로 포트포워딩을 해준다.
    • redis 설정은 도메인:6379으로 들어오는 경로에 대해 Service:6379으로 포트포워딩을 해준다.(세션정보가 담기기 때문에 기본적으로 disable해준다.)
  • proxy 설정
    • 도메인:80으로 들어오는 경로에 대해 Service:80으로 포트포워딩을 해준다.
    • 도메인:443으로 들어오는 경로에 대해 Service:443으로 포트포워딩을 해준다.

배포 파일 설정

  • github-registry-secret 생성
    • github에서 발급받은 토큰을 이용하여 docker login 정보를 생성한다.
    • 후에 pod에서 깃허브 서버에 접속하여 이미지를 받아올 때 사용한다.
    1
    2
    3
    4
    5
    
    kubectl create secret docker-registry github-registry-secret \
        --docker-server=ghcr.io \
        --docker-username=GITHUB_ID \
        --docker-password=ACCESS_TOKEN \
        --docker-email=GITHUB_EMAIL
    

CI/CD 설정

파일 생성

  • 워커노드에서 pod를 생성하여 컨테이너 구동을 하는 설정 파일을 생성한다.

    1
    2
    3
    
    mkdir -p /kube/sb-k8s-2501
    cd /kube/sb-k8s-2501
    vi sb-k8s-2501.yaml
    
  • 설정 파일에는 컨테이너 생성시 이미지를 받아올 주소를 입력한다.

    ```yml apiVersion: apps/v1 kind: Deployment metadata: name: sb-k8s-2501 spec: replicas: 2 selector: matchLabels: app: sb-k8s-2501 template: metadata: labels: app: sb-k8s-2501 spec: imagePullSecrets: - name: github-registry-secret containers: - name: sb-k8s-2501 image: ghcr.io/깃헙아이디/저장소명:latest ports: - containerPort: 8080 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 30 periodSeconds: 20 livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 initialDelaySeconds: 30 periodSeconds: 20


apiVersion: v1 kind: Service metadata: name: sb-k8s-2501-service spec: selector: app: sb-k8s-2501 ports: - port: 8080 targetPort: 8080

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- ``kubectl apply -f sb-k8s-2501.yaml`` 명령어를 통해 pod를 생성한다.
- 설정한 도메인으로 접속하면 Spring Boot 프로젝트가 실행되는 것을 확인할 수 있다.
- 해당 방식으로 수동 업데이트를 진행 할 수 있다.

  <img width="398" alt="Image" src="https://github.com/user-attachments/assets/e2af836f-b314-410d-85a5-0afd7370209d" />

#### 자동배포
- deploy.yml파일을 생성하여 push시 자동으로 배포하는지 테스트를 한다. 

  ```yml
  deploy:
      name: 쿠버네티스 배포
      needs: [makeTagAndRelease, buildImageAndPush]
      runs-on: ubuntu-latest
      steps:
        - uses: azure/k8s-set-context@v2
          with:
            method: kubeconfig
            kubeconfig: $
        - name: set lower case owner name
          run: |
            echo "OWNER_LC=${OWNER,,}" >> ${GITHUB_ENV}
          env:
            OWNER: '$'
        - run: |
            kubectl set image deployment/디플로이먼트 컨테이너명=ghcr.io/$/이미지명:$
  • github 접속방식 변경
    • 기존 방식은 aws ssm을 이용하여 접속하는 방식이었다.
    • 이번에는 github actions를 이용하여 마스터 노드에 접근하여 자동배포를 진행한다.
    1
    
    cat /root/.kube/config
    
  • config 파일은 다음과 같은 구조를 가지고있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    apiVersion: v1
    kind: Config
      
    clusters:    # 클러스터 정보
    - name: cluster-name
      cluster:
        server: https://kubernetes-api-server:6443
        certificate-authority-data: [인증기관 인증서]
      
    users:       # 사용자 정보
    - name: user-name
      user:
        client-certificate-data: [클라이언트 인증서]
        client-key-data: [클라이언트 키]
      
    contexts:    # 컨텍스트 (클러스터와 유저 연결)
    - name: context-name
      context:
        cluster: cluster-name
        user: user-name
        namespace: default
      
    current-context: context-name   # 현재 사용 중인 컨텍스트
    
  • api에 접속하기 위한 정보를 복사하여 github secrets에 등록한다.
  • 깃허브에 푸쉬하면 자동으로 배포가 진행된다. Image
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.