쿠버네티스 환경에서 설치
설치 파일 준비
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)
|-- AnyEIMS-stream-wrapper-<버전>.jar ....(2)
|-- AnyEIMS-export-model-<버전>.jar ....(3)
|-- AnyEIMS-custom-notification-<버전>.jar ....(4)
|-- AnyEIMS-custom-action-<버전>.jar ....(5)
|-- AnyEIMS-custom-deployment-notification-<버전>.jar ....(6)
|-- AnyEIMS-encrypt-<버전>.jar ....(7)
|-- AnyEIMS-adapter-lib-<버전>.jar ....(8)
|-- nginx-conf
|-- nginx.conf ....(9)
|-- properties
|-- application-extensions.yml ....(10)
|-- anyeims_front-<버전>.zip ....(11)
|-- favicon.ico
|-- index.html
+-- assets
|-- anyeims-backend.<버전>.zip ....(12)
|-- anyeims-backend.jar
-
백엔드 서버용 파일
파일 설명 (1) ojdbc8-12.2.0.1.jar
데이터베이스에서 사용할 JDBC 드라이버 파일입니다.
(2) AnyEIMS-stream-wrapper-<버전>.jar
InputStream, OutputStream 조작을 위한 인터페이스를 제공하는 파일입니다.
(3) AnyEIMS-export-model-<버전>.jar
어댑터 및 사용자 정의 기능에 사용되는 모델 객체를 정의한 파일입니다.
(4) AnyEIMS-custom-notification-<버전>.jar
결재 관련 사용자 정의 알림 기능 추가를 위한 파일입니다.
(5) AnyEIMS-custom-action-<버전>.jar
VO 다운로드 및 사용자 정의 기능 추가를 위한 파일입니다.
(6) AnyEIMS-custom-deployment-notification-<버전>.jar
배포 관련 사용자 정의 알림 기능 추가를 위한 파일입니다.
(7) AnyEIMS-encrypt-<버전>.jar
YAML 값 암호화 입력 기능 추가를 위한 파일입니다.
(8) AnyEIMS-adapter-lib-<버전>.jar
어댑터 기능을 수행하는 파일입니다.
(10) application-extensions.yml
백엔드 바이너리의 확장 속성을 정의한 파일입니다.
(12) anyeims-backend.<버전>.zip
백엔드 바이너리 파일을 포함한 ZIP 파일입니다.
-
프론트엔드 서버용 파일
파일 설명 (9) nginx.conf
Nginx 설정을 변경할 수 있는 파일입니다.
(11) anyeims_front-<버전>.zip
프론트엔드 파일입니다.
YAML 파일 설정
쿠버네티스 명령어를 실행하기 위한 파일입니다. 네임스페이스 생성, 서비스 생성, 컨테이너 생성을 하기 위해 만든 명령어 파일입니다.
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문을 실행합니다.
이때 데이터베이스의 아이디, 비밀번호는 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:init을 true로 설정하고, 데이터를 입력합니다. 그 이후에는 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
DB와 Redis의 비밀번호는 기본적으로 평문으로 저장됩니다. 보안을 위해 AES256 방식으로 암호화할 수 있습니다.
암호화 적용 절차는 다음과 같습니다.
-
AnyEIMS 설치 파일에 포함된 AnyEIMS-encrypt.jar 파일을 libs 폴더에 넣습니다.
-
aes-key.bin 파일을 생성하여 아래와 같이 비밀 키를 설정하고, 원하는 위치에 배치합니다.
rUj4irjV3WD9JYokcTQ/ag==12312311
-
application-extensions.yml 파일의 "password:" 부분을 https://anycript.com/crypto에서 암호화한 값으로 변경하고, 아래 내용을 추가합니다.
## 암호화 적용 값 spring: datasource: password: iRtb0kwvxdWy1w7bPQ+r1g== redis: password: "3KbQuLF9uSH8cCKe8xOg6Q==" ## AnyEIMS-encrypt.jar 및 aes-keys.bin 파일 적용 eims: encrypted-properties: spring.redis.password,spring.datasource.password encryption: decrypt: ## 파일이 위치한 절대 경로 입력 key: "/home/eims/properties/aes-keys.bin" class-name: com.tmax.anyeims.encryption.sample.AES256Decrypt
-
프론트엔드 서버
프론트엔드 이미지 파일(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 파일을 차례대로 실행합니다.
-
네임스페이스 생성
$ kubectl apply -f namespace.yaml
-
Redis 생성
$ kubectl apply -f redis.yaml -n eims
-
백엔드 디플로이먼트 생성
$ kubectl apply -f be-deployment.yaml -n eims
-
백엔드 서비스 생성
$ kubectl apply -f be-service.yaml -n eims
-
프론트엔드 디플로이먼트 생성
$ kubectl apply -f fe-deployment.yaml -n eims
-
프론트엔드 서비스 생성
$ kubectl apply -f fe-service.yaml -n eims