REST 서비스를 하는 두개의 마이크로서비스 (Consumer, Provider)를 샘플로 구현합니다. Consumer : 외부의 요청을 받아서 Provider를 호출하고 그 결과값을 외부 요청자에게 전달해 주는 서비스 Provider : 자체적인 서비스를 제공하는 벡엔드 서비스
샘플 Application 다운로드 : 샘플 Git 주소
샘플 Application을 Zip 파일로 다운로드 합니다.
Project Explore 에서 Import
Git에서 다운 받은 bwce_provider_consumer-main.zip
파일을 Import 합니다.
bwce_provider_consumer-main.zip
파일에 Consumer 와 Provider 두개의 Application이 존재합니다.
Consumer REST 서비스 보기
Consumer가 호출하는 Provider의 HOST와 Port정보가 Module Property(PROVIDER_HOST, PROVIDER_PORT) 로 정의 되어 있습니다.
Provider의 Port정보가 Module Property - PROVIDER_PORT로 정의 되어 있습니다.
Property 정보는 Applicatoin구동시 파라미터 정보로 변경 가능합니다.
Consumer 와 Provider 두개의 Application을 체크 합니다.
lrestdoc
을 입력합니다. Consumer 와 Provider Application의 REST Discovery Url (Swagger UI) 을 얻습니다.
브라우저에서 Provider Application의 REST Discovery Url (Swagger UI) 입력
Provider -> Try it out -> RequestID 입력 -> Execute 클릭 -> Server Response 결과 값 확인
Consumer Application의 Swagger UI를 통한 REST 서비스 테스트
브라우저에서 Consumer Application의 REST Discovery Url (Swagger UI) 입력
Consumer -> Try it out -> RequestID 입력 -> Execute 클릭 -> Server Response 결과 값 확인
Consumer와 Provider Application의 EAR 파일을 생성합니다.
각 Provider.application_1.0.0.ear와 Consumer.application_1.0.0.ear 파일이 생성됩니다.
$ cat <<EOF | tee Dockerfile_Provider
#BWCE Base Docker 이미지 태그 네임
FROM tibco/bwce:latest
#Base Docker에 Copy할 EAR 파일 이름
ADD Provider.application_1.0.0.ear /
#외부 오픈 포트 이름
EXPOSE 8000
#환경변수 BWCE Module Property에 값 전달
ENV BW_PROFILE Docker
ENV PROVIDER_PORT 8000
EOF
ENV 환경 변수는
docker run -e
옵션을 통해서도 전달 가능하며, BWCE에서 기본으로 사용되는 환경 변수는 https://docs.tibco.com/pub/bwce/2.6.1/doc/html/GUID-25BD2BA4-6BA4-418C-98D4-6EB3C9196399.html 를 참조하시기 바랍니다.
$ docker build -t provider:latest -t provider:1.0 -f Dockerfile_Provider .
$ docker images
$ cat <<EOF | tee Dockerfile_Consumer
#BWCE Base Docker 이미지 태그 네임
FROM tibco/bwce:latest
#Base Docker에 Copy할 EAR 파일 이름
ADD Consumer.application_1.0.0.ear /
#외부 오픈 포트 이름
EXPOSE 7000
#환경변수 BWCE Module Property에 값 전달
ENV BW_PROFILE Docker
ENV PROVIDER_PORT 8000
#PROVIDER_HOST (Docker Host IP 혹은 Docker Link의 이름 )
ENV PROVIDER_HOST provider-host
ENV CONSUMER_PORT 7000
EOF
ENV 환경 변수는
docker run -e
옵션을 통해서도 전달 가능하며, BWCE에서 기본으로 사용되는 환경 변수는 https://docs.tibco.com/pub/bwce/2.6.1/doc/html/GUID-25BD2BA4-6BA4-418C-98D4-6EB3C9196399.html 를 참조하시기 바랍니다.
$ docker build -t consumer:latest -t consumer:1.0 -f Dockerfile_Consumer .
$ docker images
Docker Image가 Build 된 노드와 해당 Docker Image를 이용하여 Container가 구동되는 노드 환경이 다를 경우, 해당 노드에서 Docker Image를 참조하기 위해서는 Docker Registry에 해당 Docker Image를 배포해 주어야 합니다.
Docker Registry는 크게 아래 종류로 나뉠수 있으며, 그 종류에 상관없이 동일한 명령 (docker login
, docker pull
docker push
)을 사용할 수 있습니다.
Public Docker Registry https://hub.docker.com/ 에 무료 가입 후 해당 Registry를 활용할 수 있습니다.
Private Docker Registry
자체 구성 Private Docker Registry
https://landscape.cncf.io/ 에서 Container Registry 영역을 참조하실수 있습니다. 대표적으로 HARBOR 혹은 Docker Registry(https://docs.docker.com/registry/)를 통해 나만의 Private Docker Registry환경을 구축하실수 있습니다.
Cloud 벤더 제공 Docker Registry
본 블로그에서는 https://hub.docker.com/ 의 Public Docker Registry를 사용합니다. hub.docker.com에 가입한 ID와 Password를 사용하여 docker login
을 합니다. 본 블로그에서는 User ID를 chungsju
로 사용하였습니다.
$ sudo docker login -u chungsju -p xxxx
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
Repository
이름으로 변경합니다. $ sudo docker tag provider:latest chungsju/provider:latest
$ sudo docker tag provider:1.0 chungsju/provider:1.0
$ sudo docker tag consumer:latest chungsju/consumer:latest
$ sudo docker tag consumer:1.0 chungsju/consumer:1.0
$ sudo docker tag tibco/bwce-mon:latest chungsju/bwce-mon:latest
docker push
를 통한 Docker Image push $ sudo docker push chungsju/provider
$ sudo docker push chungsju/consumer
$ sudo docker push chungsju/bwce-mon
샘플 Application을 Kubernetes 환경하에서 실행하기 위해 Kubernetes의 핵심적인 Deployment
와 Service
Resource를 생성합니다.
Deployment
: 실 Container가 운영되는 워크로드 Resource로 Pod
와 ReplicaSet
를 정의합니다. 상세 내역은 https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/를 참조하시기 바랍니다.Service
: 실행중인 Pod
에 접근하는 정책과 네트워크 서비스로 노출시키는 방법을 정의합니다. 상세 내역은 https://kubernetes.io/ko/docs/concepts/services-networking/service/를 참조하시기 바랍니다.Service
resource를 외부 네트워크에서 접근하기 위해서는 type: LoadBalancer
혹은 type: NodePort
를 사용합니다. 본 블로그에서는 NodePort
를 사용하였으며, NodePort
로 접근하기 위해서는 Kubernetes Worker Node 중 하나의 Host IP가 필요합니다. 하나의 Woker Node의 IP 및 NodePort로 접근하면, Kubernetes 내부의 Cluster IP로 라우팅 되면서 내부 로드벨런싱 됩니다.$ for kind in `kubectl api-resources | tail +2 | awk '{ print $1 }'`; do kubectl explain $kind; done | grep -e "KIND:" -e "VERSION:"
postgres-bwce-mon-service.yaml 파일 생성
apiVersion: v1
kind: Service
metadata:
name: postgres-bwce-mon-svc
labels:
app: postgres-bwce-mon
spec:
type: NodePort
ports:
- port: 5432
targetPort:5432
nodePort:30432
selector:
app: postgres-bwce-mon
postgres-bwce-mon-service.yaml 파일 적용
$ kubectl create -f postgres-bwce-mon-service.yaml
service/postgres-bwce-mon-svc created
postgres-bwce-mon-deployment.yaml 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-bwce-mon
spec:
replicas: 1
selector:
matchLabels:
app: postgres-bwce-mon
template:
metadata:
labels:
app: postgres-bwce-mon
spec:
containers:
- name: postgres-bwce-mon
image: postgres:latest
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 5432
env :
- name: POSTGRES_USER
value: bwuser
- name: POSTGRES_PASSWORD
value: bwuser
postgres-bwce-mon-deployment.yaml 파일 적용
$ kubectl create -f postgres-bwce-mon-deployment.yaml
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45d
postgres-bwce-mon-svc NodePort 10.99.130.39 <none> 5432:30432/TCP 2d12h
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
postgres-bwce-mon 1/1 1 1 27m
bwce-mon-service.yaml 파일 생성
apiVersion: v1
kind: Service
metadata:
name: bwce-mon-svc
labels:
app: bwce-mon
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30080
selector:
app: bwce-mon
bwce-mon-service.yaml 파일 적용
$ kubectl create -f bwce-mon-service.yaml
service/bwce-mon-svc created
bwce-mon-deployment.yaml 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: bwce-mon
spec:
replicas: 1
selector:
matchLabels:
app: bwce-mon
template:
metadata:
labels:
app: bwce-mon
spec:
containers:
- name: bwce-mon
image: chungsju/bwce-mon:latest
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 8080
resources:
limits:
memory: 512Mi
requests:
memory: 512Mi
env:
- name: PERSISTENCE_TYPE
value: postgres
- name: DB_URL
value: postgres://bwuser:bwuser@postgres-bwce-mon-svc:5432/postgres
image: chungsju/bwce-mon:latest
는 public docker hub에 push한 Image repository 이름입니다.value: postgres://bwuser:bwuser@postgres-bwce-mon-svc:5432/postgres
에서 앞서 Monitoring 결과 DB에서 설정한 ID/PW 및 Service resource의 이름(postgres-bwce-mon-svc) 및 port를 입력합니다.
bwce-mon-deployment.yaml 파일 적용
$ kubectl create -f bwce-mon-deployment.yaml
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bwce-mon-svc NodePort 10.99.135.150 <none> 8080:30080/TCP 4m7s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45d
postgres-bwce-mon-svc NodePort 10.99.130.39 <none> 5432:30432/TCP 2d14h
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
bwce-mon 1/1 1 1 70s
postgres-bwce-mon 1/1 1 1 173m
provider-service.yaml 파일 생성
apiVersion: v1
kind: Service
metadata:
name: provider-svc
labels:
app: provider
spec:
type: NodePort
ports:
- port: 8000
targetPort: 8000
nodePort: 30800
selector:
app: provider
provider-service.yaml 파일 적용
$ kubectl create -f provider-service.yaml
service/provider-svc created
provider-deployment.yaml 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: provider
spec:
replicas: 1
selector:
matchLabels:
app: provider
template:
metadata:
labels:
app: provider
spec:
containers:
- name: provider
image: chungsju/provider:1.0
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 8000
env:
- name: BW_PROFILE
value: Docker
- name: PROVIDER_PORT
value: "8000"
- name: BW_APP_MONITORING_CONFIG
value: '{"url":"http://bwce-mon-svc:8080"}'
image: chungsju/provider:1.0
는 public docker hub에 push한 Image repository 이름입니다.BW_APP_MONITORING_CONFIG
의 값으로 앞서 Monitoring Service resource의 이름(bwce-mon-svc) 및 port를 입력합니다.
provider-deployment.yaml 파일 적용
$ kubectl create -f provider-deployment.yaml
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bwce-mon-svc NodePort 10.99.135.150 <none> 8080:30080/TCP 58m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45d
postgres-bwce-mon-svc NodePort 10.99.130.39 <none> 5432:30432/TCP 2d15h
provider-svc NodePort 10.102.243.120 <none> 8000:30800/TCP 26m
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
bwce-mon 1/1 1 1 55m
postgres-bwce-mon 1/1 1 1 3h48m
provider 1/1 1 1 11m
consumer-service.yaml 파일 생성
apiVersion: v1
kind: Service
metadata:
name: consumer-svc
labels:
app: consumer
spec:
type: NodePort
ports:
- port: 7000
targetPort: 7000
nodePort: 30700
selector:
app: consumer
consumer-service.yaml 파일 적용
$ kubectl create -f consumer-service.yaml
service/consumer-svc created
consumer-deployment.yaml 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: consumer
spec:
replicas: 1
selector:
matchLabels:
app: consumer
template:
metadata:
labels:
app: consumer
spec:
containers:
- name: consumer
image: chungsju/consumer:1.0
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 7000
env:
- name: BW_PROFILE
value: Docker
- name: PROVIDER_HOST
value: provider-svc
- name: PROVIDER_PORT
value: "8000"
- name: CONSUMER_PORT
value: "7000"
- name: BW_APP_MONITORING_CONFIG
value: '{"url":"http://bwce-mon-svc:8080"}'
image: chungsju/consumer:1.0
는 public docker hub에 push한 Image repository 이름입니다.BW_APP_MONITORING_CONFIG
의 값으로 앞서 Monitoring Service resource의 이름(bwce-mon-svc) 및 port를 입력합니다.PROVIDER_HOST
의 값으로 앞서 Provider Service resource의 이름(provider-svc)을 입력합니다.
consumer-deployment.yaml 파일 적용
$ kubectl create -f consumer-deployment.yaml
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bwce-mon-svc NodePort 10.99.135.150 <none> 8080:30080/TCP 89m
consumer-svc NodePort 10.98.151.184 <none> 7000:30700/TCP 93s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45d
postgres-bwce-mon-svc NodePort 10.99.130.39 <none> 5432:30432/TCP 2d15h
provider-svc NodePort 10.102.243.120 <none> 8000:30800/TCP 57m
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
bwce-mon 1/1 1 1 86m
consumer 1/1 1 1 79s
postgres-bwce-mon 1/1 1 1 4h19m
provider 1/1 1 1 43m
$ kubectl get services
$ kubectl get deployments
$ kubectl get pods
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImVrLS1aVDRURnNnNFVZMTRuMXhXeFZhVWtzbzVTYU01YjUzYVh3dVNFSG8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWw2azh0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI0YzkwNTI0Mi05YzM2LTQ2ZjMtYjA0Yi04MjYzZmM0OWYyNjEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.l3g6OmUqJxN3ulB32P9OEWW6Qg31j9MQ4rYFgj6yujPoUHcXP1WnN2bSAfDdc7oBk_9jXmUGaYCeQyoskwu6-x6cvcQ2yoSl2YtUyHQaLSp7FAX-mexnLiw3Po0Oy-aeqcgbmu63uE69ib4cN4eh28xSROW75hD8paaec7iN3JWRen1qd3Qx0VYI1Vwa1rRjccnrXJNtjGD-ahaduF_7O9v8ysgI42Zgv1OoyshFo4-M8113FohldOqCPmW26E-t85CWPkV_C9miya98nQHF1YRNj3BGh1ysa69R_nL9joJeFy76ifxPIRfdAFDQq9uPZb9dQTkMu81s_t1-YecO5g
ca.crt: 1066 bytes
namespace: 11 bytes
향후 지속적인 Dashboard 접근을 위해서는 해당 token을 별도 복사하여 저장하여 둡니다.
$ kubectl proxy
Starting to serve on 127.0.0.1:8001
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
에 접속 Service Resource 보기 Deployment Resource 보기 Pods Resource 보기 Service resource를 외부 네트워크에서 접근하기 위해서는 type: LoadBalancer
혹은 type: NodePort
를 사용합니다. 본 블로그에서는 NodePort
를 사용하였으며, NodePort
로 접근하기 위해서는 Kubernetes Worker Node 중 하나의 Host IP가 필요합니다. 하나의 Woker Node의 IP 및 NodePort로 접근하면, Kubernetes 내부의 Cluster IP로 라우팅 되면서 내부 로드벨런싱 됩니다.
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-172-31-48-90.ap-northeast-2.compute.internal Ready <none> 47d v1.20.2 172.31.48.90 <none> CentOS Linux 7 (Core) 3.10.0-1062.12.1.el7.x86_64 docker://20.10.2
ip-172-31-56-200.ap-northeast-2.compute.internal Ready <none> 47d v1.20.2 172.31.56.200 <none> CentOS Linux 7 (Core) 3.10.0-1062.12.1.el7.x86_64 docker://20.10.2
ip-172-31-62-29.ap-northeast-2.compute.internal Ready control-plane,master 47d v1.20.2 172.31.62.29 <none> CentOS Linux 7 (Core) 3.10.0-1062.12.1.el7.x86_64 docker://20.10.2
http://[woker-node-ip]:30080/ 로 브라우저 접속
Consumer Application Process 통계 정보 보기
Consumer Application Process Instance 히스토리 보기
Process 호출 이력 및 호출 당시의 각 엑티비티의 성공 여부와 Input/Output에 대한 값을 확인 할 수 있습니다.