기타/kubernetes

[k3s] k3s로 서버 배포하기

닉네임없음ㅎ 2024. 11. 14. 19:14

지난번에 우분투에 k3s를 설치했다

 

*우분투에 k3s 설치하기 

 

[kubernetes] ubuntu에 k3s 설치하기 (삭제)

[kubernetes] ubuntu에 k3s 설치하기  K3S란? -> K3s는 경량화된 Kubernetes 배포판으로, CNCF(Cloud Native Computing Foundation)에서 공식적으로 지원한다. 원래 Kubernetes는 클러스터 관리에 필요한 기능

anjelaaaaaaaa.tistory.com

 

 

이번엔 설치해둔 k3s에 프로젝트 서버를 배포하려고 함.

 

OS : Ubuntu 24.04.LTS

 

사전 작업..

프론트엔드, 백엔드 코드를 도커 이미지로 빌드해서 도커 로컬 레지스트리에 이미지 보관해둔 상태임 

 

* 프론트엔드

- React

- nginx로 프록시

 

* 백엔드

- NestJS

 

k3s라는 폴더 생성 

 

필요한 파일들을 미리 만들어뒀다.

 

backend-hpa.yaml -> 오토스케일링을 위한 yaml

backend.yaml -> backend 서버 정보와 service 정의 해둔 yaml

frontend.yaml -> frontend 서버 정보와 service 정의해둠

mariadb.yaml -> mariadb 서버 정의

original-pv.yaml / original-pvc.yaml -> NAS 연결할 예정이었어서 pv, pvc 미리 만들어둠

 

<backend.yaml>

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
spec:
  replicas: 2  # 기본 파드 수 (HPA에서 이 값을 변경할 수 있음)
  selector:
    matchLabels:
      app: backend-app   # 레이블을 통해 파드와 연결
  template:
    metadata:
      labels:
        app: backend-app   # 파드에 적용할 레이블
    spec:
      containers:
        - name: backend
          image: 127.0.0.1:5000/backend:latest   # 도커이미지 이름 
          resources:
            requests:
              memory: "2Gi"
              cpu: "1"  # CPU 요청 추가
            limits:
              memory: "4Gi"
              cpu: "2"
          env:
            - name: DB_HOST
              value: mariadb-service
            - name: DB_PORT
              value: "3306"
            - name: DB_USER
              value: root
            - name: DB_PASSWORD
              value: root
            - name: DB_DATABASE
              value: new_database
            - name: JWT_SECRET
              value: secret
            - name: JWT_EXPIRE_IN
              value: 1d
          livenessProbe:
            httpGet:
              path: /app/health
              port: 3001
            initialDelaySeconds: 60
            periodSeconds: 5
          readinessProbe:
            httpGet:
              path: /app/ready
              port: 3001
            initialDelaySeconds: 60
            periodSeconds: 5
          volumeMounts:
            - name: public-volume
              mountPath: /app/public
            - name: original-volume
              mountPath: /app/original  # 나스 연결
      volumes:
        - name: public-volume
          hostPath:
            path: /home/user/images/public
            type: Directory
        - name: original-volume  # 나스 연결
          persistentVolumeClaim:
            claimName: original-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend-app
  ports:
    - protocol: TCP
      port: 3001
      targetPort: 3001
  type: ClusterIP

 

 

<frontend.yaml>

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  replicas: 1  # 원하는 복제본 수
  selector:
    matchLabels:
      app: frontend-app
  template:
    metadata:
      labels:
        app: frontend-app
    spec:
      containers:
        - name: frontend
          image: localhost:5000/frontend:latest		# 도커 이미지 이름
          env:
            - name: BACKEND_URL
              value: http://backend-service:3001  # 백엔드 서비스의 URL
---
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: NodePort # if no type, clusterIP is default type.
  ports:
    - protocol: TCP
      port: 5173        
      targetPort: 80 # Nginx  
      nodePort: 31000
  selector:
    app: frontend-app

 

 

<mariadb.yaml>

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb-deployment # deployment name
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb # should be same with selector
    spec:
      containers:
        - name: mariadb
          image: mariadb:latest
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "root"
            - name: MYSQL_DATABASE
              value: "new_database"
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mariadb-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mariadb-storage
          hostPath:
            path: /home/user/mariadb
            type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: mariadb-service
spec:
  selector:
    app: mariadb
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306

env의 값들을 env.yaml 파일을 따로 만들어서 관리하면 되는데 일단은 하드코딩 했슴다.. 

 

 

<backend-hpa.yaml>

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: backend-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: backend-deployment
  minReplicas: 2  # 최소 파드 수
  maxReplicas: 8 # 최대 파드 수 (트래픽 증가 시 최대 10개 파드까지 자동 생성)
  targetCPUUtilizationPercentage: 90  # CPU 사용률이 90%를 넘으면 파드를 추가

 

 

<original-pv.yaml>

apiVersion: v1
kind: PersistentVolume
metadata:
  name: original-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /home/dos # nfs server path
    server: 192.168.20.22 	# NAS server IP
  storageClassName: nfs
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: original-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: nfs

 

이렇게 정의해두고 

yaml파일이 있는 경로로 가서 

$ kubectl apply -f 파일이름

적용하면 파드들이 생성된다 ! 

 

파드 조회

$ kubectl get po