(멋쟁이사자처럼_백엔드스쿨플러스) 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에 등록한다.
- 깃허브에 푸쉬하면 자동으로 배포가 진행된다.