CI & CD

[Kubernetes] 설치 및 실행해보기

코드파고 2025. 4. 3. 18:04

이전 포스팅

[Kubernetes] 개념 및 구성요소

 

이번 포스팅에서는 로컬 환경에서 쿠버네티스를 설치하고 실행해 보도록 한다.

설치

참고) MacOS의 brew를 이용하여 설치를 진행

Docker, Kubectl, Minikube를 설치할 예정이며, 각각의 역할을 간단히 짚고 넘어가자면 다음과 같다

  • Docker : 가상 컨테이너 빌드
  • Kubectl : kubernetes 조작을 위한 CLI
  • Minikube : kubernetes 클러스터 생성

Docker Desktop 혹은 Docker Cli 설치

Docker Desktop

https://www.docker.com/products/docker-desktop/ 로 이동하여 다운로드 및 설치

Docker CLI

brew install docker

Kubectl 설치

brew install kubectl

Minikube 설치

brew install minikube

실행

MiniKube 실행

minikube start

minikube 클러스터를 생성하고 네임스페이스를 설정한 것을 확인할 수 있다.

kubectl 커맨드를 통해 구동중인 노드를 확인해 보자

kubectl get nodes

minkube가 떠 있는 것을 확인할 수 있다

클러스터 구성(Minikube 사용)

api, batch 모듈을 만들고, 각 컨테이너를 생성하기 위한 Dockerfile을 각 모듈 내 생성해 준다.

빨간 박스 - 모듈 / 파랑 박스 - 쿠버 설정 파일 위치
모듈별 도커파일 생성

Dockerfile 설정

설정 파일 보기

더보기

[api 모듈 기준으로 작성]

build.gradle에 다음 bootJar 추가

bootJar {
    archiveFileName = "api.jar"
}

Dockerfile

FROM gradle:7.6-jdk17 AS builder
WORKDIR /app
COPY . .
RUN ./gradlew :api:bootJar --no-daemon
FROM openjdk:17-jdk-slim
WORKDIR /app
EXPOSE 8080
COPY --from=builder /app/api/build/libs/api.jar api.jar
ENTRYPOINT ["java", "-jar", "api.jar"]

K8s 설정 파일

api 모듈 기준으로 총 4개를 설정해 두었다.

service.yaml

더보기
apiVersion: v1
kind: Service
metadata:
  name: api
  namespace: user
spec:
  selector:
    app: api
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30080

deployment.yaml

더보기
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  namespace: user
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: api
          image: api
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
          envFrom:
            - configMapRef:
                name: api-config
            - secretRef:
                name: api-secret

configmap.yaml

더보기
apiVersion: v1
kind: ConfigMap
metadata:
  name: api-config
  namespace: user
data:
  DB_URL: 'db_url'
  DB_USER: 'root'

secret.yaml

더보기
apiVersion: v1
kind: Secret
metadata:
  name: api-secret
  namespace: user
type: Opaque
stringData:
  DB_PASSWORD: 'DB_PASSWORD'

네임스페이스 생성

위 api, batch 모듈은 user를 위한 모듈이라고 가정하고 생성했기에, namespace를 user로 지정해주고자 한다.

namespace.yaml 생성

파일 경로 : 루트프로젝트/k8s/namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: user

파일을 생성해 주고 다음 커맨드를 입력한다. (실행 위치는 루트 프로젝트 내)

kubectl apply -f k8s/namespace.yaml

네임스페이스 생성 확인

kubectl get namespaces

로컬 쉘 환경을 Minikube가 사용하는 Docker 데몬으로 전환

eval $(minikube docker-env)

원래대로 돌리고 싶다면 다음을 수행하자!

eval $(minikube docker-env -u)

이미지 빌드

💡minikube는 이미지를 pull 받아서 사용할 뿐이다. 빌드는 직접 해 주도록 하자!
실무에서는 CI에서 빌드 + Registry push → CD에서 배포 과정을 거치도록 한다.

docker build -f api/Dockerfile -t api .
docker build -f batch/Dockerfile -t batch .

클러스터에 리소스 배포

kubectl apply -f k8s/user/api
kubectl apply -f k8s/user/batch

Minikube 서비스 노출

kubectl expose deployment api --type=NodePort --port=8080 --namespace=user
더보기

[참고] 서비스 관련 커맨드

user namespace의 서비스 확인

kubectl get svc -n user

user namespace의 api 서비스 삭제

kubectl delete service api -n user

URL 확인

eval $(minikube docker-env -u)
// 원래 로컬 도커 환경으로 복귀
minikube service api -n user --url

브라우저로 위 링크에 api 페이지에 접근하면 웹 서버에 접속이 가능하다