[MSA 프로젝트] GKE에서 Kubernetes 매니페스트 파일 배포하기

angie·2024년 5월 23일

실제 작성한 매니페스트 파일이 쿠버네티스 상에서 잘 동작하는지 알아보기 위해 GKE를 사용해보았다.

GKE란 Google Kubernetes Engine으로, GCP(Google Cloud Platform)에서 제공하는 관리형 Kubernetes 서비스이다. 클러스터 관리 및 애플리케이션 배포를 쉽게 할 수 있게 해준다.

1. GKE 클러스터 생성

테스트 용이기 때문에 기본값으로 생성하였다.

클러스터 기본사항

  • 이름: k8s
  • 영역: asia-northease3-a
  • 출시 채널
    • 출시 채널: 채널 없음
    • 버전: 기본값

노드 설정 구성

  • 이미지 유형: containerd를 포함한 Ubuntu
  • 머신 구성: 범용/N1
  • 머신 유형
    • 코어: 1
    • 메모리: 1
    • 부팅 디스크 크기: 10

다음과 같이 클러스터 생성되었다. 노드 수가 3으로 설정되어 있어, VM 인스턴스를 확인해 보면 3개의 인스턴스가 생성된 것을 볼 수 있다. 각 노드는 클러스터 내에서 작업을 수행하는 독립적인 컴퓨팅 자원인 것을 알 수 있다.

2. K8s 클러스터 연결

kubectl 설정
PC에서 클러스터에 연결하기 위해 명령어을 넣으면 kubectl이 없다는 오류가 발생한다. 아래 링크로 들어가 운영환경에 맞게 설치하면 된다.

https://kubernetes.io/ko/docs/tasks/tools/

K8s 클러스터 연결

cmd 창에 명령줄 액세스 부분을 실행하면 클러스터에 연결할 수 있다.

  • 잘 연결되었는지 확인해보자
kubectl config get-contexts  // GKE K8s 클러스터의 컨텍스트 확인

kubectl get node // 노드 목록 보기

3. 매니페스트 파일 준비

이번 프로젝트에서는 Secret, ConfigMap, Deployment, Service 오브젝트를 정의하는 매니페스트 파일을 만들었다.

매니페스트 파일을 각각 분리하여 사용할 수도 있지만, '---' 을 사용하여 하나의 파일에 여러 오브젝트를 정의할 수도 있다. 실제 만든 서비스가 잘 동작하는지 테스트하는 용도이기 때문에 하나로 합쳐서 진행해볼 것이다.

combined-manifest.yaml

#secret
apiVersion: v1
kind: Secret
metadata:
    name: my-secret
type: Opaque
data:
  DATABASE_USERNAME: <base64로_인코딩된_값>
  DATABASE_PASSWORD: <base64로_인코딩된_값>

---

#configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  DATABASE_URL: <값>

---

# deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: <dockerhub-username>/my-app
          ports:
            - containerPort: 8080
          env:
          - name: DATABASE_URL
            valueFrom:
              configMapKeyRef:
                name: notice-config
                key: DATABASE_URL
          - name: DATABASE_USERNAME
            valueFrom:
              secretKeyRef:
                name: notice-secret
                key: DATABASE_USERNAME
          - name: DATABASE_PASSWORD
            valueFrom:
              secretKeyRef:
                name: notice-secret
                key: DATABASE_PASSWORD      

---

# service
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

4. 매니페스트 파일 배포

매니페스트 파일이 있는 경로로 가서 아래 명령어를 입력한다.

kubectl apply -f <매니페스트_파일_이름> 

kubectl apply -f combined-manifest.yaml
  • 이때 오류가 발생했는데, 이는 docker hub 리포지토리를 private으로 설정해두었기 때문이었다. private으로 두면 여러 설정 작업이 필요하여 public으로 변경하였다. 환경 변수를 .env 파일로 관리하고 있기 때문에, public으로 변경할 수 있었다.

  • 오류가 발생한다면, kubectl describe 또는 kubectl logs 를 통해 확인할 수 있다.

매니페스트 파일에서 배포한 리소스 삭제
매니페스트 파일에서 배포한 리소스를 삭제하고 싶다면 아래 명령어를 사용할 수 있다.

kubectl delete -f <매니페스트_파일_이름> 

5. 배포 확인

# 전체 확인
kubectl get all

# 파드 상태 확인
kubectl get po

# 서비스 상태 확인
kubectl get svc
  • Kubernetes 대시보드이다. 컨테이너가 잘 동작하는 것을 확인할 수 있다.

💡사용하지 않는 리소스는 과금방지를 위해 꼭 삭제하자!

profile
열심히 달리는 개발자

0개의 댓글