쿠버네티스 환경에서 설치

설치 순서

쿠버네티스 환경에서 AnyEIMS 설치는 다음과 같은 과정으로 진행됩니다.

설치 파일 준비

AnyEIMS 설치에 필요한 파일을 준비합니다.

  • 필수 파일

    기동을 위한 필수 파일입니다.

    |-- images
        |-- anyeims_backend.<버전>.tar  ....(1)
        |-- anyeims_frontend.<버전>.tar  ....(2)
        |-- redis.latest.tar
    |-- yamls
        |-- be-deployment.yaml  ....(3)
        |-- be-service.yaml  ....(4)
        |-- fe-deployment.yaml  ....(5)
        |-- fe-service.yaml  ....(6)
        |-- redis.yaml  ....(7)
    |-- sqls
        |--  oracle
            |-- create.sql  ....(8)
            |-- insert.sql  ....(9)
    파일 설명

    (1) anyeims_backend.<버전>.tar

    쿠버네티스 환경 위에서 컨테이너를 실행하기 위한 이미지 파일입니다.

    (2) anyeims_frontend.<버전>.tar

    쿠버네티스 환경 위에서 컨테이너를 실행하기 위한 이미지 파일입니다.

    (3) be-deployment.yaml

    백엔드의 디플로이먼트를 생성하기 위한 명령문이 작성된 파일입니다.

    (4) be-service.yaml

    백엔드의 서비스를 생성하기 위한 명령문이 작성된 파일입니다.

    (5) fe-deployment.yaml

    프론트엔드 바이너리, Nginx 설정 파일이 담긴 PV를 설정할 수 있는 파일입니다.

    (6) fe-service.yaml

    프론트엔드의 서비스를 생성하기 위한 명령문이 작성된 파일입니다.

    (7) redis.yaml

    Redis의 디플로이먼트와 서비스를 생성하기 위한 파일입니다.

    (8) create.sql

    AnyEIMS에서 사용될 테이블을 생성하는 SQL 파일입니다.

    (9) insert.sql

    AnyEIMS에서 기본적으로 사용될 값을 넣는 SQL 파일입니다.

  • 추가 설정 파일

    쿠버네티스 환경에 올려놓은 프로그램에서 추가 설정으로 인해 파드를 재기동하여도 그대로 유지되어야 하는 파일들을 외부 디렉터리에 따로 관리합니다. 해당 디렉터리를 Persistent Volume(PV)이라고 합니다.

    |-- libs
        |-- ojdbc8-12.2.0.1.jar  ....(1)
    |-- nginx-conf
        |-- nginx.conf  ....(2)
    |-- properties
        |-- application-extensions.yml  ....(3)
    |-- anyeims_front-<버전>.zip  ....(4)
        |-- favicon.ico
        |-- index.html
        +-- assets
    |-- anyeims-backend.<버전>.zip  ....(5)
        |-- anyeims-backend.jar
    • 백엔드 서버용 파일

      파일 설명

      (1) ojdbc8-12.2.0.1.jar

      사용할 데이터베이스에 맞는 JDBC 파일입니다.

      (3) application-extensions.yml

      백엔드 바이너리의 확장 속성을 정의하는 파일입니다.

      (5) anyeims-backend.<버전>.zip

      백엔드 바이너리 파일을 포함한 ZIP 파일입니다.

    • 프론트엔드 서버용 파일

      파일 설명

      (2) nginx.conf

      Nginx 설정을 변경할 수 있는 파일입니다.

      (4) anyeims_front-<버전>.zip

      프론트엔드 파일입니다.

YAML 파일 설정

쿠버네티스 명령어를 실행하기 위한 파일입니다. 네임스페이스 생성, 서비스 생성, 컨테이너 생성을 하기 위해 만든 명령어 파일입니다.

namespace.yaml

작업할 네임스페이스를 생성하는 yaml 파일입니다.

apiVersion: v1
kind: Namespace
metadata:
  name: eims

redis.yaml

Redis의 디플로이먼트와 서비스를 생성하기 위한 파일입니다.

  • 서비스

    Redis의 서비스를 생성하기 위한 명령문이 작성되어 있습니다. 설치할 네임스페이스, 개방할 포트, 이용할 외부 IP를 설정할 수 있습니다.

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        name: anyeims-redis
      name: anyeims-redis
      namespace: <작업할 네임스페이스>
    spec:
      type: ClusterIP
      ports:
        - name: "http"
          port: <통신할 포트 번호>
          targetPort: 6379
      externalIPs:
        - <통신할 IP 주소>  # 외부에 노출되는 IP
      selector:
        name: anyeims-redis
  • 디플로이먼트

    Redis의 디플로이먼트를 생성하기 위한 명령문이 작성되어 있습니다. 설치할 네임스페이스, 생성에 이용할 이미지를 설정할 수 있습니다. 이때 이미지의 경우 로드한 이미지 이름에 맞춰 변경합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: anyeims-redis
      namespace: <작업할 네임스페이스>
      labels:
        name: anyeims-redis
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: anyeims-redis
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            name: anyeims-redis
        spec:
          containers:
            - image: any-eims:5000/anyeims_redis:7.2.4  # 사용할 이미지
              name: anyeims-reids
              ports:
                - containerPort: 6379
                  protocol: TCP
          restartPolicy: Always

be-deployment.yaml

백엔드 바이너리, 설정 파일이 담긴 PV를 설정할 수 있습니다. 내부에서 외부와 연동하고 싶은 mountPath를 정의하고, 해당 부분을 volumes에서 로컬 머신의 물리 디렉터리와 연동합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: anyeims-backend
  namespace: <작업할 네임스페이스>
  labels:
    name: anyeims-backend
spec:
  replicas: 1
  selector:
    matchLabels:
      name: anyeims-backend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        name: anyeims-backend
    spec:
      containers:
        - env:
            - name: ANYEIMS_REDIS_HOST
              value: <Redis IP 주소>  # redis.yaml에서 설정한 IP
            - name: ANYEIMS_REDIS_PORT
              value: <Redis 포트 번호>  # redis.yaml에서 설정한 포트
          image: any-eims:5000/anyeims_backend:1.0.0-r1 # 사용할 이미지
          name: anyeims-backend
          ports:
            - containerPort: 8080
              protocol: TCP
          volumeMounts:
            - mountPath: /home/eims
              name: anyeims-backend

      restartPolicy: Always
      volumes:
        - name: anyeims-backend
          # 아래 내용을 알맞은 PVC로 변경 필요
          hostPath:
            type: Directory
            path: /home/eims/

be-service.yaml

백엔드의 서비스를 생성하기 위한 명령문이 작성되어 있습니다. 설치할 네임스페이스, 개방할 포트, 이용할 외부 IP를 설정할 수 있습니다.

apiVersion: v1
kind: Service
metadata:
  labels:
    name: anyeims-backend
  name: anyeims-backend
  namespace: <작업할 네임스페이스>
spec:
  type: ClusterIP
  ports:
    - name: "http"
      port: <통신할 포트 번호>
      targetPort: 8080
  externalIPs:
    - <통신할 IP 주소>  # 외부에 노출되는 IP
  selector:
    name: anyeims-backend

fe-deployment.yaml

프론트엔드 바이너리, Nginx 설정 파일이 담긴 PV를 설정할 수 있습니다. 내부에서 외부와 연동하고 싶은 mountPath를 정의하고, 해당 부분을 volumes에서 로컬 머신의 물리 디렉터리와 연동합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    name: anyeims-frontend
  name: anyeims-frontend
  namespace: <작업할 네임스페이스>
spec:
  replicas: 1
  selector:
    matchLabels:
      name: anyeims-frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        name: anyeims-frontend
    spec:
      containers:
        - image: any-eims:5000/anyeims_frontend:1.0.0-r1  # 사용할 이미지
          name: anyeims-frontend
          ports:
            - containerPort: 80
              protocol: TCP
          volumeMounts:
            - mountPath: /home/eims/nginx
              name: anyeims-frontend
      restartPolicy: Always
      volumes:
        - name: anyeims-frontend
          # 아래 내용을 알맞은 PVC로 변경 필요
          hostPath:
            type: Directory
            path: /home/eims/nginx

fe-service.yaml

프론트엔드의 서비스를 생성하기 위한 명령문이 작성되어 있습니다. 설치할 네임스페이스, 개방할 포트, 이용할 외부 IP를 설정할 수 있습니다.

apiVersion: v1
kind: Service
metadata:
  labels:
    name: anyeims-frontend
  name: anyeims-frontend
  namespace: <작업할 네임스페이스>
spec:
  type: ClusterIP
  ports:
    - name: "http"
      port: <통신할 포트 번호>
      targetPort: 80
  externalIPs:
    - <통신할 IP 주소>  # 외부에 노출되는 IP
  selector:
    name: anyeims-frontend

데이터베이스 설정

데이터베이스 서버에서 AnyEIMS이 사용할 데이터베이스를 설정하는 SQL문을 실행합니다.

이때 데이터베이스의 ID, PW는 application-extension.yml 파일에 작성되어 있는 값과 일치해야 합니다.

  • AnyEIMS에서 사용될 테이블을 생성하는 SQL

    $ create.sql
  • AnyEIMS에서 기본적으로 사용될 값을 넣는 SQL

    $ insert.sql

이미지 로드

워커 노드의 로컬 리포지터리에 이미지를 로드합니다.

  • 컨테이너 런타임이 DOCKER인 경우

    $ docker load -i <파일명>.tar
  • 컨테이너 런타임이 CRI-O인 경우

    $ podman load -u <파일명>.tar

워커 노드의 리포지터리에서 이미지를 로드하는 이유는 파드가 스케쥴링된 노드의 리포지터리에서 이미지를 불러와서 사용하기 때문입니다.

볼륨 설정

워커 노드의 디렉터리에 파드의 볼륨을 마운트합니다.

본 안내서에서는 호스트의 특정 디렉터리를 스토리지로 사용하는 방식인 hostPath 방식을 사용합니다.

백엔드 서버

백엔드 이미지 파일(anyeims_backend.<버전>.tar)을 사용하여 컨테이너 실행 시 컨테이너 디렉터리 구조는 아래와 같습니다.

/home/eims/
|-- applications
    |-- anyeims_backend.jar
|-- libs
    |-- ojdbc8-12.2.0.1.jar
|-- local-storage
|-- properties
    |-- application-extensions.yml

파드의 볼륨을 마운트 하기 위해 be_deployment.yaml 파일에 설정한 호스트 경로(hostPath)로 워크 노드에 관련 파일 및 디렉터리를 구성합니다.

  • anyeims_backend.jar

    '{호스트 경로}/applications' 하위에 위치시킵니다.

  • ojdbc8-12.2.0.1.jar

    '{호스트 경로}/libs' 하위에 위치시킵니다.

  • local-storage

    '{호스트 경로}' 하위에 디렉터리만 생성합니다. 해당 디렉터리에는 사용자가 결재 시 올리는 파일 같은 데이터가 저장됩니다.

  • application-extensions.yml

    '{호스트 경로}/properties' 하위에 위치시킵니다.

    application-extensions.yml 파일 설정을 통해 백엔드 바이너리의 확장 속성을 정의할 수 있습니다. 만약 최초 실행 시 미리 값을 설정하려면 sample:inittrue로 설정하고, 데이터를 입력합니다. 그 이후에는 false로 설정 변경이 필요합니다.

    sample:
      init: false  # UI나 API로 설정할 수 없는 값을 넣으려면 true로 변경
    
    
    spring:
      datasource:
        driver-class-name: oracle.jdbc.driver.OracleDriver
        url: jdbc:oracle:thin:@<DB의 IP 주소>:<포트 번호>/<DB 이름>
        username: <DB 사용자 이름>
        password: <DB 사용자 비밀번호>
      jpa:
        defer-datasource-initialization: true
        show-sql: true
        database-platform: org.hibernate.dialect.Oracle12cDialect
        hibernate:
          ddl-auto: none
    
    # 로그 설정
    logging:
      file:
        name: /home/eims/log/eims.log  # 로그 파일의 이름 및 경로
        max-size: 500MB
        max-history: 10
      level:
        org : info

프론트엔드 서버

프론트엔드 이미지 파일(anyeims_frontend.<버전>.tar)을 사용하여 컨테이너 실행 시 컨테이너 디렉터리 구조는 아래와 같습니다.

/home/eims/
|-- nginx
    |-- html
        |-- assets
        |-- favicon.ico
        |-- index.html
    |-- conf.d
        |-- nginx.conf

파드의 볼륨을 마운트 하기 위해 fe-deployment.yaml 파일에 설정한 호스트 경로(hostPath)로 워크 노드에 관련 파일 및 디렉터리를 구성힙니다.

  • anyeims_front-<버전명>.zip

    '{호스트 경로}/html' 하위에 해당 파일의 압축을 해제합니다.

  • nginx.conf

    '{호스트 경로}/conf.d' 하위에 위치시킵니다.

    nginx.conf 파일 설정을 통해 Nginx의 속성을 정의할 수 있습니다. 이때 proxy_pass 값을 be-deployment.yaml에서 설정한 'externalIP:port’로 설정합니다. 백엔드의 IP/Port가 변경될 때 수정해야 합니다.

    server {
        listen  80;  # 프론트 포트 설정 가능
        client_max_body_size 20M;
    
        location /v1 {
            proxy_pass  http://<백엔드 접근 IP 주소>:<백엔드 접근 포트 번호>;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    
        location / {
            root   /home/eims/nginx/html;  # 연결할 Root 경로
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
    
        error_page 500 502 503 504 /50x.html;
    }

YAML 파일 실행

설정한 YAML 파일을 차례대로 실행합니다.

  1. 네임스페이스 생성

    $ kubectl apply -f namespace.yaml
  2. Redis 생성

    $ kubectl apply -f redis.yaml -n eims
  3. 백엔드 디플로이먼트 생성

    $ kubectl apply -f be-deployment.yaml -n eims
  4. 백엔드 서비스 생성

    $ kubectl apply -f be-service.yaml -n eims
  5. 프론트엔드 디플로이먼트 생성

    $ kubectl apply -f fe-deployment.yaml -n eims
  6. 프론트엔드 서비스 생성

    $ kubectl apply -f fe-service.yaml -n eims