티스토리 뷰

출처: https://wave1994.tistory.com/136 [훈훈훈:티스토리]

Kubernetes 환경의 PostgreSQL 설치하기

 

# Dockerfile  <- 이름 정확하게 기재 하세요 대소문자

FROM java:8
EXPOSE 8080
ARG JAR_FILE=build/libs/rest-exam-0.0.1.jar
ADD ${JAR_FILE} rest-exam.jar
ENTRYPOINT ["java","-jar", "/rest-exam.jar"]
[root@m-k8s home]# docker build -t tommypagy/rest-exam:0.6 .
Sending build context to Docker daemon  1.164GB
Step 1/2 : FROM ubuntu:20.04
 ---> bf40b7bc7a11
Step 2/2 : RUN apt update && apt install -y python3
 ---> Using cache
 ---> ed6a3007afd4
Successfully built ed6a3007afd4
Successfully tagged tommypagy/rest-exam:0.6

Push 하게 되면 docker  Site 에 push 된 상황을 확인할수가 있습니다. 

[root@m-k8s home]# docker push tommypagy/rest-exam:0.6
The push refers to repository [docker.io/tommypagy/rest-exam]
8c261b2ecdee: Mounted from tommypagy/tommypagy-repository 
6c3e7df31590: Mounted from tommypagy/tommypagy-repository 
0.6: digest: sha256:774983c8593c78d15fa5c2e34f82ee3311353673eedffbbaffd2718f3f478b3c size: 741

deployment-postgresql.yaml


apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-server-deployment
  labels:
    app: postgres-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-server
  template:
    metadata:
      labels:
        app: postgres-server
    spec:
      containers:
        - name: postgresql
          image: postgres
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_USER
              value: tommypagy
            - name: POSTGRES_DB
              value: springexam
            - name: POSTGRES_PASSWORD
              value: password

테스트용으로 작성한 코드이기 때문에 replicas 는 1로 설정하였다.
containers 설정을 살펴보면 container port는 postgresql
디폴트 포트로 잡았고 env 설정은 application.yaml 설정과 동일하게 했다.

 

#POD 생성 
[root@m-k8s postgre]# k create -f deployment-postgresql.yaml
deployment.apps/postgres-server-deployment created


#POD 조회
[root@m-k8s postgre]# k get po 
NAME                                          READY   STATUS              RESTARTS   AGE
postgres-server-deployment-644567b566-trmg8   0/1     ContainerCreating   0          2s


#POD 생성완료
[root@m-k8s postgre]# k get po  -w
NAME                                          READY   STATUS    RESTARTS   AGE
postgres-server-deployment-644567b566-trmg8   1/1     Running   0          5s

 

 

# deployment-server.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-server-deployment
  labels:
    app: spring-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-server
  template:
    metadata:
      labels:
        app: spring-server
    spec:
      restartPolicy: Always
      containers:
        - name: spring
          image: tommypagy/rest-exam:0.6
          imagePullPolicy: Always
          ports:
            - containerPort: 8080

 

#deploy Server 생성 
[root@m-k8s postgre]# k create -f  deployment-server.yaml
deployment.apps/spring-server-deployment created

#deploy Server 조회
[root@m-k8s postgre]# k get po 
NAME                                          READY   STATUS              RESTARTS   AGE
spring-server-deployment-54c6c6ccfb-2pmh9     0/1     ContainerCreating   0          2s
[root@m-k8s postgre]# 

#deploy Server 생성완료
[root@m-k8s postgre]# k get po -w
NAME                                          READY   STATUS              RESTARTS   AGE
spring-server-deployment-54c6c6ccfb-2pmh9     1/1     Running             0          59s


# service-postgres.yaml

apiVersion: v1
kind: Service
metadata:
  name: postgres-server-service
spec:
  clusterIP: None
  ports:
    - port: 8080
      targetPort: 5432
      protocol: TCP
      name: db-port
  selector:
    app: postgres-server

 

 

service-postgresql 파일은 위에서 작성한 deployment-postgresql 에서 설정한 label 을 selector로 설정하였다.

그리고 외부에서 로드 밸런싱을 할 필요가 없고 내부 Cluster IP도 필요하지 않아 headless service로 작성하였다. 

포트는 web-server port는 8080 이고 DB port는 5432이기 때문에 위와 같이 작성하였다.

 

# service-server.yaml

apiVersion: v1
kind: Service
metadata:
  name: spring-server-service
spec:
  clusterIP: None
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
      name: server-port
  selector:
    app: spring-server

 

 

서버 파일도 위에서 작성한 postgresql 파일과 거의 동일하게 작성하였다.

 

application.yaml

spring:
  datasource:
    url: jdbc:postgresql://postgres-server-service.default.svc.cluster.local:5432/springexam
    username: kwanghoon.kim
    password: password
    driverClassName: org.postgresql.Driver

 

 

마지막으로 application.yaml에서 DB 서버에 관한 설정을 하였다.

쿠버네티스에서 파드는 영속적인 객체가 아니기 때문에 재시작 하는 경우가 생기는데 이때 IP가 바뀌게 된다.

이에 대한 해결책은 쿠버네티스에서 제공하는 DNS를 사용하여 URL을 만들었다.

파일이 세팅이 되었다면 이제 아래 명령어로 실행시켜 보자

helm install product-api .

 

 

이제 생성된 svc, deployment, pod를 조회해보자

 

❯ kubectl get svc        
NAME                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes                ClusterIP   10.96.0.1    none          443/TCP    19m
postgres-server-service   ClusterIP   None         none          8080/TCP   18m
spring-server-service     ClusterIP   None         none          8080/TCP   18m

❯ kubectl get deployments
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
postgres-server-deployment   1/1     1            1           19m
spring-server-deployment     1/1     1            1           19m

❯ kubectl get pods -o wide
NAME                                          READY   STATUS    RESTARTS   AGE   IP          NODE             NOMINATED NODE   READINESS GATES
postgres-server-deployment-6887b5cdcb-r9ff4   1/1     Running   0          19m   10.1.1.50   docker-desktop   <none>           <none>
spring-server-deployment-5fcc9df984-4svf6     1/1     Running   0          19m   10.1.1.51   docker-desktop   <none>           <none>

 

댓글