Ops

k8s 환경에 내 서비스 띄워보기

khjoon 2024. 12. 4. 22:25

Introduce

클라우드 웨이브 활동을 할 때는 eks 클러스터에 내 서비스를 띄워서 테스트 했지만 비용 이슈로 인해 kind 클러스터로 돌아와서 복습과 그 때는 해결하지 못했던 문제들을 해결해보고자 합니다.

 

kind 클러스터는 예전에 구축했으니 클러스터에 바로 서비스를 띄워서 잘 작동하는지 확인해보겠습니다

1. ConfigMap, Secret 띄우기

  • 쿠버네티스에서 사용하는 파라미터와 환경변수를 관리하기 위해 ConfigMap과 Secret을 사용했습니다.
  • Secret은 패스워드 및 인증서 와 같은 중요정보 보관용으로 사용(BASE 64 인코딩)
  • configMap에 immutable:true를 해주면 성능 향상(감시하지 않는다.)
//data 부분에 configMap으로 관리할 변수 추가
apiVersion: v1
kind: ConfigMap
metadata:
  name: spring-configmap
data:
  DB_DRIVER: 'com.mysql.cj.jdbc.Driver'
//secret은 data value 부분에 base64 인코딩을 한 뒤 값을 넣어줘야 합니다.
apiVersion: v1
kind: Secret
metadata:
  name: spring-secret
type: Opaque
data:
  DB_URL:

 

생성 됐는지 확인하기

 

2. deployment 띄우기

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-was
  labels:
    app: spring-was
spec:
  selector:
    matchLabels:
      app: spring-was
  template:
    metadata:
      labels:
        app: spring-was
    spec:

      containers:
        - name: spring-container
          image: hyoungjoon/olivesafety
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
          resources:
            requests:
              memory: "128Mi"
              cpu: "250m"
            limits:
              memory: "512Mi"
              cpu: "500m"
          env:
            - name: DB_URL
              valueFrom:
                secretKeyRef:
                  name: spring-secret
                  key: DB_URL
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: spring-secret
                  key: DB_PASSWORD
            - name: JWT_TOKEN_SECRET
              valueFrom:
                secretKeyRef:
                  name: spring-secret
                  key: JWT_TOKEN_SECRET
            - name: REDIS_HOST
              valueFrom:
                secretKeyRef:
                  name: spring-secret
                  key: REDIS_HOST
            - name: REDIS_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: spring-secret
                  key: REDIS_PASSWORD
            - name: REDIS_PORT
              valueFrom:
                secretKeyRef:
                  name: spring-secret
                  key: REDIS_PORT
            - name: DB_USERNAME
              valueFrom:
                configMapKeyRef:
                  name: spring-configmap
                  key: DB_USERNAME
            - name: DB_DRIVER
              valueFrom:
                configMapKeyRef:
                  name: spring-configmap
                  key: DB_DRIVER

3. service 띄우기

apiVersion: v1
kind: Service
metadata:
  name: spring-service
spec:
  selector:
    app: spring-was
  ports:
    - port: 8080
      targetPort: 8080

 

생성 됐는지 확인하기

 

4. nginx-ingress 설치

  • 로컬에서 ingress를 사용하기 위해서 설치
  • ingress를 사용하는 이유는 내부에 있는 서비스를 접속하기 위해서 외부 요청을 받아서 내부로 전달하는 역할을 합니다.
  • 네트워크 7계층 레벨로 처리 해서 path 라우팅과 ssl 적용 가능
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

//ingress-nginx ns 생김
$ kubectl get ns

$ kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=90s

 

ingress 띄우기

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-ingress
spec:
  rules:
    - http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: spring-service
                port:
                  number: 8080

ingress까지 떴는지 확인하기

5.  pod에 있는 api 서버에 요청을 보낼 수 있는 것을 확인할 수 있습니다.

 

)

다음 작업

로컬에서 모두 띄우는 것은 불가능할 것 같아서 jenkins로 ci/cd를 먼저 구축해보겠습니다.