본문 바로가기
BackEnd

도커와 쿠버네티스 - (h2+config+eureka+gateway+item)

by mizuiro 2024. 10. 25.

0. 네트워크 구성 정보

h2 : h2-version2

jdbc:h2:tcp://172.20.0.2:1521/test

172.20.0.2:8081

config: config-server

eureka

gateway

item

1. network 설정

docker network create msa-version2
docker network ls
docker network inspect msa-version2

2. H2 생성

컨테이너 다운 받아 생성

docker run --network msa-version2 -d -p 1521:1521 -p 8081:81 -e H2_OPTIONS="-ifNotExists" --name=h2-version2 oscarfonts/h2

데이터베이스 기본 설정

docker exec -it h2-version2 /bin/bash
cd /opt/h2/bin
ls
java -cp h2-2.1.214.jar org.h2.tools.Shell

⇒ 생성된 데이터베이스 Host os 위치 주소 : jdbc:h2:tcp://localhost:1521/test

네트워크에 붙어서 주소 할당이 되었는지 확인

docker network inspect msa-version2

⇒ "IPv4Address": "172.20.0.2/16",

개별 네트워크 접속이 가능한지 확인

localhost:8081 로 접속 ⇒ jdbc:h2:tcp://localhost:1521/test or jdbc:h2:tcp://172.20.0.2:1521/test 접속

3. 각 Server yaml 주의점

파일명 규칙:

  • Spring Boot는 프로파일에 따라 application-{profile}.yaml 또는 application-{profile}.properties 파일을 자동으로 로드합니다.
  • 여기서 {profile}은 docker와 같은 프로파일 이름입니다. 따라서 application-docker.yaml 파일은 docker 프로파일이 활성화될 때 자동으로 로드됩니다.
  • 현재 각 server에 존재하는 yaml 파일은 로컬 환경에 작동하도록 설정이 되어 있다
  • spring.profiles.active : local 이므로 docker 버전 yaml을 생성한다
  • 각 서버 별로 생성한 docker 용 yaml 파일을 가지고 Dockerfile에서 설정을 한다
  • 각각의 서버는 network로 연결되어 있기에 서로의 네트워크 값을 순서대로 넣어서 yaml 파일을 생성해야 한다
  • 순서
    • config → eureka → gateway→ item
  • 단, 각 서버의 yaml에는 서로의 주소가 존재한다 이때 각 주소를 서로 참조하고 있으므로 한꺼번에 변경하지 못한다
  • 그렇기에 각 주소 이름을 컨테이너의 이름으로 설정하면 연결이 된다고 한다

4. Config server yaml 파일들

application.yaml

각 설정이 다른 것은 eureka, gateway, item이므로 application.yaml은 변경하지 않는다

eureka-server-docker.yaml

유레카 자기자신이지만 새로운 network 망에 들어가게 되므로 defaultZone 설정을 바꾼다

네트워크 주소는 생성한 네트워크의 gateway 주소를 넣는다

# logging 관련 설정
logging:
  file:
    name: logs/api.log
    max-size: 500MB
    max-history: 10
  level:
    root: info
    org.msa.eurekaserver: debug

# spring 관련 설정
spring:
  application:
    name: eureka-server
server:
  port: 8761

eureka:
  instance:
    hostname: eureka-server # 유레카의 서비스명을 의미
  client:
    serviceUrl:
      defaultZone: <http://172.20.0.1>:${server.port}/eureka/
    register-with-eureka: false
    fetch-registry: false

gateway-server-docker.yaml

유레카의 주소를 컨테이너의 주소로 변경한다

logging:
  file:
    name: logs/gateway.log
    max-size: 500MB
    max-history: 10
  level:
    root: info
    org.msa.gatewayserver: debug

# gateway 의 proxy 설정
spring:
  cloud:
    gateway:
      # routes 는 클라이언트의 요청 URI 에 대해서
      # 어떤 마이크로 서비스로 요청 데이터를 전달할 것인지와 같은
      # 라우팅 관련 설정
      routes:
        # id 는 라우팅을 위한 식별 id 임.
        - id: item-service
          # uri 는 이동할 마이크로 서비스 명임.
          # lb 는 load balancing 의 약자임.
          # item-service 는 유레카 서버에 등록된 마이크로 서비스명임.
          uri: lb://item-service
          # predicates 의 path 설정은 실제 요청 들어온 uri 주소임.
          # /v1/item/ 으로 시작하는 요청이 들어왔을 때
          # item-servoce 마이크로 서비스로 요청을 전달하겠다는 의미임.
          predicates:
            - Path=/v1/item/**

eureka:
  instance:
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: <http://eureka-server:8761/eureka>

item-service-docker.yaml

h2의 정보 (db address, id, password), 유레카 주소를 변경해준다

logging:
  file:
    name: logs/api.log
  level:
    root: info
    org.msa.item: debug
  logback:
    rolling policy:
      max-file-size: 500MB
      max-history: 10

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:tcp://172.20.0.2:1521/test
    username: sa
    password:
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: create
    show-sql: true
    properties:
      hibernate:
        format_sql: true

eureka:
  instance:
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-register: true
    service-url:
      defaultZone: <http://eureka-server:8761/eureka>

5. Config Server docker 생성

Dockerfile

FROM openjdk:17-jdk-alpine AS builder

COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src

RUN chmod +x ./gradlew
RUN dos2unix ./gradlew
RUN ./gradlew bootJar

FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=builder build/libs/*.jar /app/app.jar

EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

dockerfile로 이미지를 생성한다

docker build -f <Dockerfile 경로> -t <이미지 이름> <빌드 컨텍스트 경로>

docker build -f Dockerfile.config -t config-server-image .

container 생성

docker run --network msa-version2 -d -p 8080:8080 --name=config-server config-server-image

로그 파일 확인

docker logs -f config-server

네트워크 설정 확인

  • h2, config server가 네트워크에 붙어 있는지 확인
docker network inspect msa-version2

6. Eureka Server

bootstrap-docker.yaml

  • docker용 버전을 생성이때 yaml에서 active 설정을 없애야 Dockerfile과 충돌이 일어나지 않는다
  • uri는 네트워크에 설정된 config의 주소(config의 컨테이너 명)로 바꾼다
  • spring.profile.active는 파일 이름에 명시하면 도커에서 알아서 인식을 하기 때문에 이름에 active 명을 적고 dockerfile에서 active 명을 실행하라고 명령한다
spring:
  application:
    name: eureka-server
  cloud:
    config:
      uri: <http://172.20.0.3:8080>
    loadbalancer:
      ribbon:
        enabled: false

Dockerfile

#
# docker build -t eureka-server-image:1.0 .
#
FROM openjdk:17-jdk-alpine AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN rm src/main/resources/bootstrap.yaml
RUN mv src/main/resources/bootstrap-docker.yaml src/main/resources/bootstrap.yaml
RUN chmod +x ./gradlew
RUN dos2unix ./gradlew
RUN ./gradlew bootJar

FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=builder build/libs/*.jar /app/app.jar
EXPOSE 8761
ENTRYPOINT ["java", "-jar", "app.jar"]

dockerfile로 이미지를 생성한다

docker build -f <Dockerfile 경로> -t <이미지 이름> <빌드 컨텍스트 경로>

docker build -f Dockerfile -t eureka-server-image .

container 생성

docker run --network msa-version2 -d -p 8070:8070 --name=eureka-server eureka-server-image

로그 파일 확인

docker logs -f eureka-server

네트워크 설정 확인

  • h2, config server가 네트워크에 붙어 있는지 확인
docker network inspect msa-version2

7. Gateway Server

bootstrap-docker.yaml

  • docker용 버전을 생성이때 yaml에서 active 설정을 없애야 Dockerfile과 충돌이 일어나지 않는다
  • uri는 네트워크에 설정된 config의 주소(config의 컨테이너 명)로 바꾼다
  • spring.profile.active는 파일 이름에 명시하면 도커에서 알아서 인식을 하기 때문에 이름에 active 명을 적고 dockerfile에서 active 명을 실행하라고 명령한다
server:
  port: 8070
spring:
  application:
    name: gateway-server
  profiles:
    # config-server 의 config 폴더 아래에 있는 설정파일 참조시
    # gateway-server-local.yaml 파일이 아니라
    # gateway-server-docker.yaml 파일을 사용하게 됨.
    active: docker
  cloud:
    config:
      # config-server 는 docker 컨테이너명으로서
      # docker network 를 사용하게 되면, 컨테이너명을 사용해서
      # 동일 도커 네트워크에 있는 서버를 참조할 수 있게 됨.
      uri: <http://config-server:8080>
    # bootstrap.yaml 의 uri 로는 접속이 되지 않음.
    #uri: <http://localhost:8080>
    loadbalancer:
      ribbon:
        enabled: false

Dockerfile

FROM openjdk:17-jdk-alpine AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN dos2unix ./gradlew
RUN ./gradlew bootJar

FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=builder build/libs/*.jar /app/app.jar
EXPOSE 8070
ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","app.jar"]

dockerfile로 이미지를 생성한다

docker build -f <Dockerfile 경로> -t <이미지 이름> <빌드 컨텍스트 경로>

docker build -f Dockerfile -t gateway-server-image .

container 생성

docker run --network msa-version2 -d -p 8070:8070 --name=gateway-server gateway-server-image

로그 파일 확인

docker logs -f gateway-server

네트워크 설정 확인

  • h2, config server가 네트워크에 붙어 있는지 확인
docker network inspect msa-version2

8. item service Server

bootstrap-docker.yaml

  • docker용 버전을 생성이때 yaml에서 active 설정을 없애야 Dockerfile과 충돌이 일어나지 않는다
  • uri는 네트워크에 설정된 config의 주소(config의 컨테이너 명)로 바꾼다
  • spring.profile.active는 파일 이름에 명시하면 도커에서 알아서 인식을 하기 때문에 이름에 active 명을 적고 dockerfile에서 active 명을 실행하라고 명령한다
server:
  port: 0 # 사용 가능한 port 를 random 하게 설정.
spring:
  application:
    name: item-service
  cloud:
    config:
      uri: <http://config-server:8080>
    loadbalancer:
      ribbon:
        enabled: false

Dockerfile

FROM openjdk:17-jdk-alpine AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN dos2unix ./gradlew
RUN ./gradlew bootJar

FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=builder build/libs/*.jar /app/app.jar
EXPOSE 8070
ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","app.jar"]

dockerfile로 이미지를 생성한다

docker build -f <Dockerfile 경로> -t <이미지 이름> <빌드 컨텍스트 경로>

docker build -f Dockerfile.item -t item-service-image .

container 생성

docker run --network msa-version2 -d -p 0:0 --name=item-service item-service-image

로그 파일 확인

docker logs -f item-service

네트워크 설정 확인

  • h2, config server가 네트워크에 붙어 있는지 확인
docker network inspect msa-version2

9. 통신

eureka server 에 config, item이 넣어 졌다면 post man으로 통신을 한다

locahost/8080/v1/item