์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ Spring PetClinic Microservices version์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋ค. Spring Cloud Netflix๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ์ฑ๋ ๋ง์ดํฌ๋ก ์๋น์ค๋ฅผ Kubernetes์์ ์คํํ๋๋ก ๋ช ๊ฐ์ง ์์กด์ฑ๊ณผ ์ฝ๋๋ฅผ ์ ๊ฑฐํ ๋ฟ ์ต๋ํ ์๋ณธ ์ฝ๋๋ฅผ ์ ์งํ ํํ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ชฉํ๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
๋ณธ ๋ฌธ์๋ Kuberentes์์ ์คํ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํ ๋ด์ฉ์ ๋ํ ๊ฒ์ ์ค๋ช ํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ํ ์ ๋ณด๋ Migration.md๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๋น๋ ๋ฐ ๋ฐฐํฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์งํ ํฉ๋๋ค.
- Step1. ์ค๋น ์ฌํญ
- Step2. ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ
- Step3. ์น ๋ธ๋ผ์ฐ์ ๋ก ํ์ธ
- ์ฐธ๊ณ . IKS ๋ฌด๋ฃ ํด๋ฌ์คํฐ๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ
Kubernetes ์คํ ํ๊ฒฝ์ ๊ฐ๋ฐ์ฉ์ผ๋ก minikube๋ฅผ ์ด์ฉํ๊ฑฐ๋, Public Cloud Vendor๊ฐ ์ ๊ณตํ๋ ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Local VM์ด๋ Baremetal ์๋ฒ์ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ์ฌ ์ด์ฉ ํ๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋ฌ๋, ๋ณธ ๊ธ์์๋ Kubernetes ํด๋ฌ์คํฐ ๊ตฌ์ฑ์ ๋ชฉ์ ์ด ์์ง ์์ผ๋ฏ๋ก, IBM Cloud Kubernetes Service(์ดํ IKS)๋ฅผ ์ด์ฉํด ๋ณด๋ ค๊ณ ํฉ๋๋ค. IKS๋ Kubernetes Cluster Control Plane์ ์๋์ผ๋ก ๊ด๋ฆฌํด ์ฃผ๋ฏ๋ก ๊ฐ๋ฐ์๋ Kubernetes Node๋ง ์ ๊ฒฝ์ฐ๋ฉด ๋ฉ๋๋ค. ๋ํ, IKS์ Node๋ฅผ ํ๊ตญ(ํ๊ตD/C)์ ์์ฑ ํ ์ ์๋ ํฐ ์ฅ์ ์ด ์์ต๋๋ค.
IKS๋ฅผ ์ด์ฉํ๋ ค๋ฉด ๋จผ์ IBM Cloud ๊ณ์ ์ด ํ์ํฉ๋๋ค. ๋ง์ฝ, ํ์ ๊ฐ์ ์ ํ์ง ์์ผ์ จ๋ค๋ฉด, ์๋ URL์ ํตํด ํ์ ๊ฐ์ ์ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
ํ์ ๊ฐ์ ์ด ๋๋ฌ๋ค๋ฉด, IBM Cloud ์ฌ์ฉ์ ์ํ ์นด๋ ๋ฑ๋ก์ด ํ์ํฉ๋๋ค. ์นด๋ ๋ฑ๋ก์ด ์๋ ์ํ์ trail ๊ณ์ ์ Kubernetes Node๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ์ฉ์นด๋ ๋ฑ๋ก์ ์ต๋ 2์ผ ์ ๋๊ฐ ์์๋ ์ ์์ต๋๋ค.
์นด๋ ๋ฑ๋ก ์๋ฃ ํ standard ๊ณ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ ๋์๋ค๋ฉด, IBM Cloud Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค.
์์ฑ ํ ์ ์๋ ํด๋ฌ์คํฐ ์ข ๋ฅ๋ Free์ Standard๊ฐ ์์ต๋๋ค. Free ํด๋ฌ์คํฐ๋ ๋ฏธ๊ตญ Dallas์ ํธ์ฃผ Melbourne ์ค ํ ๊ณณ์ ์ ํํ์ฌ ๋ฌด๋ฃ๋ก 1๊ฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฌด๋ฃ ํด๋ฌ์คํฐ๋ 2 CPUs, 4 GB RAM, 1 Worker Node๋ก ๊ตฌ์ฑ๋๋ฉฐ 30์ผ ๋์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ผ๋ถ ๊ธฐ๋ฅ ์ฌ์ฉ์ ์ ํ์ ์ ๋๋ค. ํ์ค ํด๋ฌ์คํฐ์ ์ฐจ์ด์ ์ ๋ฌด๋ฃ ๋ฐ ํ์ค ํด๋ฌ์คํฐ ๋น๊ต์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
์ด ์์ ๋ ๊ณ ์ฑ๋ฅ ํด๋ฌ์คํฐ๊ฐ ํ์ํ ๊ฒ์ ์๋์ง๋ง, ํ๊ตญ ๋ฐ์ดํฐ ์ผํฐ๋ฅผ ์ ํ ํ ์ ์๊ณ Ingress ์๋น์ค๋ฅผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ฅ์ ์ด ์์ด ์ ๋ฃ ํด๋ฌ์คํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ๊ณ ์์ต๋๋ค. ์ ์ผ ์ ๋ ดํ 2์ฝ์ด 4GB ๋ฉ๋ชจ๋ฆฌ์ Shared VM์ ์ด์ฉํ์ฌ 1๊ฐ์ Worker Node๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ 1์๊ฐ์ 133์ ์ ๋์ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค. ์ถ๊ฐ์ ์ธ IKS ๊ฐ๊ฒฉ ์ ๋ณด๋ IBM Cloud Kubernetes ํด๋ฌ์คํฐ ์์ฑํ๊ธฐ์์ ์์ ๊ธ์ก์ ํ์ธ ํ ์ ์์ผ๋ ์ด๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
ํ์ค ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๋ฉด ํด๋น ํด๋ฌ์คํฐ๋ฅผ ์ธ๋ถ์์ ์ ์ ๊ฐ๋ฅํ Ingress Subdomain ์ฃผ์๋ฅผ ๋ถ์ฌ ๋ฐ๊ฒ ๋ฉ๋๋ค.
<CLUSTER_NAME>.<DC_ZONE_NAME>.containers.appdomain.cloud
์๋ฅผ ๋ค์ด, ํด๋ฌ์คํฐ ์ด๋ฆ์ mycluster
๋ก ์์ฑํ๊ณ ํ๊ตญ์ ํ์ค ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ์๋ค๋ฉด,
mycluster.seo01.containers.appdomain.cloud
๋ก ๋ถ์ฌ๋ฉ๋๋ค.
IKS๋ IBM Cloud์ ์๋น์ค๋ก์ IBM Cloud CLI๋ฅผ ์ด์ฉํ์ฌ ์ ๋ณด๋ฅผ ํ์ธ ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์น ๋์๋ณด๋๋ฅผ ํตํด์๋ ํ์ธ์ด ๊ฐ๋ฅํ์ง๋ง, Kubernetes CLI (kubectl) ์ฌ์ฉ์ ์ํ ์ ๋ณด๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์๋ ๋์ค๋ CLI ์ค์ ์ IBM Cloud ์ปจํ ์ด๋ Dashboard์์ ํ์ธ ํ ์ ์์ต๋๋ค.
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ CLI ๋ฐ ํ๋ฌ๊ทธ์ธ์ ์ค์นํฉ๋๋ค.
curl -sL https://ibm.biz/idt-installer | bash
Windows 10 Pro ํ๊ฒฝ์์๋ Windows PowerShell์ ์ด์ฉ ํ ์ ์์ต๋๋ค. ์์ ๋ฉ๋ด์์ PowerShell
์ ๊ฒ์ํ์ฌ ํ์ผ์ ์ฐพ์ ํ, ํด๋น ํ์ผ์ ๋ง์ฐ์ค๋ก ์ค๋ฅธ์ชฝ ํด๋ฆญํ์ฌ ๊ด๋ฆฌ์ ๊ถํ
์ผ๋ก ์คํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์ ์คํํฉ๋๋ค.
Set-ExecutionPolicy Unrestricted; iex(New-Object Net.WebClient).DownloadString('http://ibm.biz/idt-win-installer')
IBM Cloud account์ ๋ก๊ทธ์ธ ํฉ๋๋ค.
ibmcloud login
IBM Cloud ์ปจํ ์ด๋์ ์๋น์ค ์ง์ญ์ ์ง์ ํฉ๋๋ค.
ibmcloud ks region-set <REGION>
Kubernetes ํ๊ฒฝ ์ค์ ์ ๋ณด๋ฅผ ๋ค์ด๋ก๋ ํฉ๋๋ค.
ibmcloud ks cluster-config <CLUSTER_NAME>
KUBECONFIG
ํ๊ฒฝ ๋ณ์ ์ ๋ณด๋ฅผ ์ค์ ํฉ๋๋ค.
export KUBECONFIG=/Users/$USER/.bluemix/plugins/container-service/clusters/<CLUSTER_NAME>/kube-config-<DC_ZONE_NAME>-<CLUSTER_NAME>.yml
Windows ํฐ๋ฏธ๋ ํ๊ฒฝ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SET KUBECONFIG=%HOMEPATH%\.bluemix\plugins\container-service\clusters\<CLUSTER_NAME>\kube-config-<DC_ZONE_NAME>-<CLUSTER_NAME>.yml
๋ง์ฝ, Windows PowerShell์ ์ด์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$env:KUBECONFIG=$env:HOMEPATH+'\.bluemix\plugins\container-service\clusters\<CLUSTER_NAME>\kube-config-<DC_ZONE_NAME>-<CLUSTER_NAME>.yml'
ํ๊ฒฝ ์ค์ ์ด ๋์๋ค๋ฉด Worker ๋ ธ๋ ์ ๋ณด๋ฅผ ํ์ธํฉ๋๋ค.
kubectl get nodes
๋ณธ ํํ ๋ฆฌ์ผ์ ์ฌ์ฉ๋๋ ์ด๋ฏธ์ง๋ ์ฌ์ ์ ๋ง๋ค์ด ๋์ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํฉ๋๋ค. ๋ง์ฝ, ์ฌ๋ฌ๋ถ์ด ์ง์ ์์ฑํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ Container Image ์์ฑ ๊ฐ์ด๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์์ฑ ํ ์๋ ์๋น์ค๋ฅผ ์์ฑํ์๊ธฐ ๋ฐ๋๋๋ค.
์ฐธ๊ณ ๋ก, Container ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค๋ฉด ์๋ Kubernetes Deployment์ Container Image ์ ๋ณด๋ ์๋ก Build๋ ์ ๋ณด์ ๋ง์ถ์ด ๋ณ๊ฒฝํด ์ฃผ์ด์ผ ํฉ๋๋ค.
...
containers:
- image: <YOUR_IMAGE_NAME_SPACE>/spring-petclinic-visits-service:latest
imagePullPolicy: Always
...
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ API ๋ง์ดํฌ๋ก ์๋น์ค Deployment์ Service๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f k8s/api-gateway.yaml
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ Customers ๋ง์ดํฌ๋ก ์๋น์ค Deployment์ Service๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f k8s/customers-service.yaml
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ Vets ๋ง์ดํฌ๋ก ์๋น์ค Deployment์ Service๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f k8s/vets-service.yaml
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ Visits ๋ง์ดํฌ๋ก ์๋น์ค Deployment์ Service๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f k8s/visits-service.yaml
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ๋ง์ดํฌ๋ก ์๋น์ค๋ค์ด ์ ์์ ์ผ๋ก ๋ฐฐํฌ ๋์๋์ง ํ์ธ ํ์ญ์์ค
kubectl get pods -o=wide
NAME READY STATUS RESTARTS AGE IP NODE
api-gateway-745db58c94-zdwfb 1/1 Running 0 1h xxx.xxx.xxx.16 xxx.xxx.xxx.247
customers-77b6c4784f-tp8gn 1/1 Running 0 1h xxx.xxx.xxx.20 xxx.xxx.xxx.247
vets-6ddf965b54-7jhpt 1/1 Running 0 1h xxx.xxx.xxx.23 xxx.xxx.xxx.247
visits-7f97889974-psmsh 1/1 Running 0 1h xxx.xxx.xxx.24 xxx.xxx.xxx.247
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api-gateway NodePort xxx.xxx.xxx.104 <none> 80:32002/TCP 1h
customers-service NodePort xxx.xxx.xxx.63 <none> 80:32003/TCP 1h
kubernetes ClusterIP xxx.xxx.xxx.1 <none> 443/TCP 2d
vets-service NodePort xxx.xxx.xxx.129 <none> 80:32005/TCP 1h
visits-service NodePort xxx.xxx.xxx.196 <none> 80:32004/TCP 1h
ํ์ค ํด๋ฌ์คํฐ์ ๋ฐฐํฌ๋ ๊ฒฝ์ฐ subdomain์ cluster name๊ณผ region์ ๋ฐ๋ผ ์๋์ผ๋ก ํ ๋น๋๋ฉฐ ๋ณธ ํํ ๋ฆฌ์ผ์์๋ ์ด ์ ๋ณด๋ฅผ ์ด์ฉํฉ๋๋ค. ๋ง์ฝ ํ์ค ํด๋ฌ์คํฐ๊ฐ ์๋ ๊ฒฝ์ฐ subdomain ์์ฑ ์ ๋ณด๊ฐ ์์ผ๋ฏ๋ก ์๋ IKS ๋ฌด๋ฃ ํด๋ฌ์คํฐ๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฐธ๊ณ ํฉ๋๋ค.
ํด๋ฌ์คํฐ์ ์๋์ผ๋ก ํ ๋น๋๋ subdomain์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
ibmcloud ks cluster-get <CLUSTER_NAME>
$ ibmcloud ks cluster-get mycluster
Retrieving cluster mycluster...
OK
Name: mycluster
ID: xxxx
State: normal
Created: 2019-03-20T06:13:44+0000
Location: seo01
Master URL: https://xxx.xxx.xxx:xxxx
Public Service Endpoint URL: https://xxx.xxx.xxx:xxxx
Private Service Endpoint URL: -
Master Location: seo01
Master Status: Ready (1 day ago)
Master State: deployed
Master Health: normal
Ingress Subdomain: mycluster.seo01.containers.appdomain.cloud
Ingress Secret: mycluster
Workers: 1
Worker Zones: seo01
Version: 1.12.9_1555* (1.13.6_1524 latest)
Owner: xxxx@xxxx.xxx
Monitoring Dashboard: -
Resource Group ID: xxxxxxxxxxx
Resource Group Name: default
๊ทธ ์ค Ingress Subdomain
ํญ๋ชฉ์ด ์๋์ผ๋ก ํ ๋น๋๋ subdomain ์ฃผ์ ์
๋๋ค. ์์ ๊ฒฝ์ฐ๋ <cluster_name>์ด mycluster
<region_or_zone>์ด seo01
์ด๋ฏ๋ก mycluster.seo01.containers.appdomain.cloud
์ด ํ ๋น๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
k8s/ingress.yaml ํ์ผ์ ์ด์ด <INGRESS_SUBDOMAIN>
๋ฅผ ์์์ ํ์ธํ ingress subdomin ๊ฐ์ผ๋ก ๋ณ๊ฒฝ ํ ์ ์ฅํฉ๋๋ค.
spec:
rules:
- host: petclinic.<INGRESS_SUBDOMAIN>
ingress.yaml ํ์ผ์ด ์ค๋น๋์์ผ๋ฉด ์๋ ๋ช ๋ น์ผ๋ก Ingress ๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f k8s/ingress.yaml
Ingress๊ฐ ์ ์์ ์ผ๋ก ์์ฑ๋ ๊ฒฝ์ฐ ๋ค์ URL์ ์ ๊ทผํ๋ฉด ํ์ฌ ์คํ ์ค์ธ petclinic ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ธ ํ ์ ์์ต๋๋ค.
https://petclinic.<INGRESS_SUBDOMAIN>
๋ฌด๋ฃ ํด๋ฌ์คํฐ์ ๊ฒฝ์ฐ Node์ Public IP๋ง ์ ๊ณต๋๋ฉฐ ์๋์ ๊ฐ์ด ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ ๊ทผ ํ ์ ์์ต๋๋ค.
- Nginx ์ด๋ฏธ์ง์ NodePort ํ์ Service๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
- Nginx Ingress Controller๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ Nginx Deployment์ Service๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f k8s/nginx/nginx-configmap.yaml
kubectl create -f k8s/nginx/nginx-service.yaml
kubectl create -f k8s/nginx/nginx.yaml
๋ค์ ๋ช ๋ น์ ์ด์ฉํ์ฌ worker node์ EXTERNAL-IP๋ฅผ ํ์ธ ํฉ๋๋ค.
kubectl get nodes -o wide
nginx๋ NodePort 32010์ ์ด์ฉํ๋ฏ๋ก ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํ์ฌ ๋ค์๊ณผ ๊ฐ์ URL์ ์ ๊ทผํฉ๋๋ค.
http://<EXTERNAL-IP>:32010/
Nginx Ingress Controller๋ Ingress Controller๋ฅผ Nginx๋ก ๊ตฌํํ ๊ฒ์ผ๋ก ์๋์ ๊ฐ์ด ์ฝ๋๊ฐ ๊ณต๊ฐ๋์ด ์์ต๋๋ค.
- https://github.com/kubernetes/ingress-nginx
- https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
๋ค์ํ ํํ๋ก ์ค์น ๊ฐ๋ฅํ์ง๋ง Helm Chart๋ฅผ ์ด์ฉํ๋ฉด ๋ณ๋ค๋ฅธ ์ต์ ์์ด ๋ฐ๋ก ๋ฐฐํฌ ํ ์ ์์ต๋๋ค. Helm Chart๋ฅผ ์ด์ฉํ nginx ํจํค์ง ๋ฐฐํฌ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด Nginx Ingress Controller๋ฅผ ์ค์น ํ ์ ์์ต๋๋ค.
Ingress Controller๊ฐ ์ค๋น๋์๋ค๋ฉด ๋ค์ ๋ช ๋ น์ผ๋ก ingress๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f k8s/ingress-nginx.yaml
Ingress๊ฐ ์ ์์ ์ผ๋ก ์์ฑ๋ ๊ฒฝ์ฐ ๋ค์ URL์ ์ ๊ทผํ๋ฉด ํ์ฌ ์คํ ์ค์ธ petclinic ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ธ ํ ์ ์์ต๋๋ค.
http://<EXTERNAL-IP>/
Spring PetClinic Microservice๋ Database๋ฅผ HSQL์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ๊ฐ์ ์ผ๋ก MySQL DB๋ฅผ ์ฌ์ฉ ํ ์๋ ์์ต๋๋ค. ๋จผ์ MySQL DB๋ฅผ ์ค๋นํฉ๋๋ค.
MySQL DB๋ IBM Cloud์์ ์ ์๊ฐ๋ฅํ Instance ์ด์ด์ผ ํฉ๋๋ค. ์ฌ์ ์ MySQL DB๊ฐ ์ค๋น๋์ง ์์ ๊ฒฝ์ฐ Kubernetes ํด๋ฌ์คํฐ์ MySQL์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ ์ ์์ต๋๋ค.
๋ณธ ์์ ์์๋ k8s/mysql/mysql-configmap.yaml ํ์ผ์ MySQL ์๋ฒ ํธ์คํธ ๋ฐ ํฌํธ ๋ฒํธ๊ฐ ์
๋ ฅ๋์ด ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Kubernetes ํด๋ฌ์คํฐ์ ์์ฑํ MySQL ์๋ฒ๋ก ์ฐ๊ฒฐํ๋๋ก hostinfo
๊ฐ์ด mysql:3306
์ผ๋ก ๋์ด์์ต๋๋ค. ๋ง์ฝ ์ธ๋ถ DB ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋น ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋๋ก ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ๋ค์ ๋ช
๋ น์ ์ด์ฉํ์ฌ ConfigMap ์ ์์ฑํฉ๋๋ค.
kubectl create -f k8s/mysql/mysql-configmap.yaml
MySQL DB์ ์ ๊ทผํ๋ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ ConfigMap์ด ์๋ Secret์ผ๋ก ์ ๋ ฅํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ Kubernetes ํด๋ฌ์คํฐ์ ์์ฑํ MySQL ์๋ฒ๋ก ์ฐ๊ฒฐ์ ์ํ username
๋ root
, password
๋ petclinic
์ผ๋ก ๋ค์ ๋ช
๋ น์ผ๋ก Secret ์ ๋ณด๋ฅผ ์์ฑํฉ๋๋ค. ๋ง์ฝ, ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ ๋ณด์ ๋ค๋ฅธ ๊ฒฝ์ฐ ํ์ผ์์ MySQL Secret ์์ฑํ๊ธฐ๋ฅผ ์ด์ฉํ์๊ธฐ ๋ฐ๋๋๋ค.
kubectl create -f k8s/mysql/mysql-secret.yaml
ํ์ผ์์ Secret์ ์์ฑํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํฉ๋๋ค.
# Create files needed for rest of example.
echo -n "<YOUR_MYSQL_USERNAME" > username
echo -n "<YOUR_MYSQL_PASSWORD" > password
์ฐธ๊ณ ๋ก, username
๊ณผ password
ํ์ผ์ ๋ณด์์ ์ํ์ด ๋๋ฏ๋ก Secret ์์ฑ ํ ์ญ์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค.
kubectl create secret
๋ช
๋ น์ผ๋ก mysql-credential
Secret์ ์์ฑํฉ๋๋ค.
kubectl create secret generic mysql-credential --from-file=username --from-file=password
์์ฑํ secret ์ ๋ณด๋ฅผ ํ์ธํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kubectl get secret/mysql-credential -o yaml
์ด๋ ๊ฒ ์์ฑ๋ Secret์ ๋ค์๊ณผ ๊ฐ์ด secretKeyRef๋ฅผ ํตํด ํ๊ฒฝ ๋ณ์๋ก ๋ก๋ฉ๋ฉ๋๋ค.
env:
- name: MYSQL_USERNAME
valueFrom:
secretKeyRef:
name: mysql-credential
key: username
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-credential
key: password
Spring PetClinic์์ MySQL DB๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด DB๋ฅผ ์ฌ์ฉํ๋ ๋ค์ ์ธ ๊ฐ์ ์๋น์ค ๋ชจ๋์ MySQL ๊ด๋ จ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
- customers-service
- vets-service
- visits-service
ํ๊ฒฝ ๋ณ์๋ Deployment์ Container Template ์ ๋ณด์ ์ถ๊ฐํ๊ฒ ๋๋ฉฐ, ๋ค์์ vets-service์ ๋ํ ์์ ์ ๋๋ค.
spec:
strategy:
type: Recreate
template:
metadata:
labels:
app: spring-petclinic
tier: visits
spec:
containers:
- image: hongjs/spring-petclinic-visits-service:latest
imagePullPolicy: Always
name: visits
ports:
- containerPort: 8080
env:
- name: MYSQL_HOSTINFO
valueFrom:
configMapKeyRef:
name: mysql-config
key: hostinfo
- name: MYSQL_USERNAME
valueFrom:
secretKeyRef:
name: mysql-credential
key: username
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-credential
key: password
- name: spring.profiles.active
value: mysql
์ด ๋ด์ฉ์ ์ ์ฉํ Deployment ํ์ผ๋ค์ ๋ค์ ๋ช ๋ น์ผ๋ก Kubernetes Cluster์ ์ ์ฉํฉ๋๋ค.
kubectl apply -f k8s/mysql/mysql-customers-service.yaml
kubectl apply -f k8s/mysql/mysql-vets-service.yaml
kubectl apply -f k8s/mysql/mysql-visits-service.yaml