Springboot
ํ๋ก์ ํธ๋ฅผ ๋์ปค ์ด๋ฏธ์ง
๋ก ๋น๋๋์ปค ์ด๋ฏธ์ง
๋ฅผ AWS ECR
๋ ํฌ์งํ ๋ฆฌ์ Push์ฟ ๋ฒ๋คํฐ์ค
์์ ECR ๋ ํฌ์งํ ๋ฆฌ
์ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด์ Springboot, MySQL Pod
๋ฐ Service
์์ฑPod
๊ฐ ์๋ก ํต์ ํ ์ ์๋๋ก ์ค์ (Springboot API๋ฅผ ํธ์ถํ๋ฉด MySQL์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ)ํ๋ก์ ํธ ๋น๋ ๋ฐ Dockerfile ์์ฑ
FROM openjdk:8-jdk-alpine
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
๋์ปค ์ด๋ฏธ์ง๋ก ๋น๋
docker build -t springboot-mysql-app .
์ผ๋จ AWS ECR
๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
์ด๋ฆ๋ง ์ค์ ํ ํ ์์ฑํ๊ณ URI ๋ถ๋ถ์ ๋ณต์ฌํ๋ค.
์ด์ ๋ก์ปฌ์์ aws configure์ IAM secret ์ ๋ณด๋ก ECR์ ๋ก๊ทธ์ธ์ ์ํํ๋ค.
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin [AWS_ECR_URI]
Login Succeded
๋ฉ์์ง๊ฐ ๋ด๋ค๋ฉด ์ด์ ์ด๋ฏธ์ง๋ฅผ ECR์ push ํ ์ ์๋ค.
๋น๋๋ ์ด๋ฏธ์ง๋ฅผ ํ๊น
ํ ํธ์ํ๋ค.
[ ํ๊น
]
docker tag ์ด๋ฏธ์ง์ด๋ฆ [ECR_URI]/ํ๊ทธ๋ช
[ Push ]
docker push [ECR_URI]/ํ๊ทธ๋ช
ECR์ push๋ ์ด๋ฏธ์ง๋ฅผ ํ์ธํ๋ค.
mysql์ ๊ตฌ๋์ํฌ ์ปจํ ์ด๋๋ฅผ ๋ด์ Pod์ Service๋ฅผ ์์ฑํ๋ค.
vi mysql.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
labels:
app: mysql-pod # Pod ์ด๋ฆ
spec:
containers:
- name: mysql-db
image: mysql:5.7.36 # mysql docker hub ์ด๋ฏธ์ง
env:
- name: MYSQL_ROOT_PASSWORD
value: "1234"
ports:
- containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc # ์๋น์ค ์ด๋ฆ
spec:
selector:
app: mysql-pod # Pod ์ด๋ฆ
ports:
- protocol: TCP
port: 3306
targetPort: 3306
type: NodePort
์์ฑํ ์ค์ ํ์ผ์ ์คํํ๋ค.
kubectl apply -f mysql.yaml
์์ฑ ํ Service์ ํฌํธ๋ฅผ ํ์ธํ๋ค.
kubectl get service ์๋น์ค์ด๋ฆ
Pod์์ ๊ตฌ๋๋๋ MySQL์ IP์ ํฌํธ๋ฅผ ๋ชจ๋ ์์์ผ๋ฏ๋ก ์ด์ ๋ก์ปฌ์์ ์ ๊ทผํ ์ ์๋ค. ํ
์คํธ๋ฅผ ์ํด ๋ฏธ๋ฆฌ ๋ก์ปฌ์์ ์ ๊ทผํด์ ์คํค๋ง๋ฅผ ๋ง๋ค์ด์ฃผ์.
IP๋ ํด๋น Pod๊ฐ ์ฌ๋ผ๊ฐ์๋ node์ EC2 IP์ด๋ค.
Springboot application์ ๋ํ ์์
์ ์ ์ฟ ๋ฒ๋คํฐ์ค ๋ง์คํฐ ์๋ฒ์์ ECR
์ ์ ์ํ ์ ์๋๋ก ์ค์ ์ ์ถ๊ฐํ๋ค.
[ awscli ์ค์น ]
sudo apt install -y awscli
[ IAM secret ์ค์ ]
aws configure
[ ECR ๋ก๊ทธ์ธ ]
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin [ECR URI]
[ Secret ์์ฑ ]
kubectl create secret generic ecr-secret --from-file=.dockerconfigjson=/home/ubuntu/.docker/config.json --type=kubernetes.io/dockerconfigjson
๋ค์์ผ๋ก Springboot app ์ด๋ฏธ์ง์ ์ปจํ ์ด๋๋ฅผ Pod์ ์ฌ๋ ค์ค๋ค.
์ด๋ฅผ ์ํ ์ค์ ํ์ผ์ ์์ฑํ๋ค.
vi springboot-app.yaml
apiVersion: v1
kind: Pod
metadata:
name: memo-springboot-pod # Service ์ด๋ฆ
labels:
app: memo-springboot-pod # Pod ์ด๋ฆ
spec:
containers:
- name: memo-springboot-app
# ๋์ปค ์ด๋ฏธ์ง๋ฅผ pushํ ECR์ ์๋ํฌ์ธํธ
image: 771839060615.dkr.ecr.ap-northeast-2.amazonaws.com/memo-springboot
ports:
- containerPort: 8080
imagePullSecrets:
- name: ecr-secret
---
apiVersion: v1
kind: Service
metadata:
name: memo-springboot-svc
spec:
selector:
app: memo-springboot-pod # Pod ์ด๋ฆ
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: NodePort
Service์ Pod๋ฅผ ํ์ฑํ? ์ ์ฉ? ํ๋ค.
kubectl apply -f springboot-app
์ด์ Springboot application๋ ๊ตฌ๋๋๊ณ , MySQL๋ ๊ตฌ๋๋๊ณ ์คํค๋ง๋ ๋ง๋ค์ด์ ธ ์์ผ๋ฏ๋ก Springboot์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ API๋ฅผ ํธ์ถํ๋ฉด MySQL์ ์ ์ ์ฅ์ด ๋์ผ ํ๋ค. ํ์ง๋ง ์์ง ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Springboot์ ์ค์ ํ์ผ์์ DB์ ์ฐ๊ฒฐํ๋ ๋ถ๋ถ์ ๋ณด์.
spring.datasource.url=jdbc:mysql://localhost/kuber_schema?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul
ํ์ฌ localhost
๋ก DB์ ์ปค๋ฅ์
์ ์ป์ด๋ด๋ ค ํ๊ณ ์๋ค. Pod๋ ๊ฐ๊ฐ IP๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๋
ธ๋์ ์๋๋ผ๋ localhost๋ก ์๋ก ํต์ ํ ์๋ ์๋ค.
IP๊ฐ ์๋ ์๋น์ค์ ์ด๋ฆ์ผ๋ก ์๋ณ ๊ฐ๋ฅํ๋ค. ์๋น์ค์ ์ด๋ฆ์ ์ฌ์ฉํด์ผ ํ๋ค.
(MySQL Pod์ Service๋ช
: mysql-svc)
spring.datasource.url=jdbc:mysql://mysql-svc/kuber_schema?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul
springboot ์ค์ ํ์ผ์ ์์ ํ๊ณ ๋ค์ ์ด๋ฏธ์ง ๋น๋/push ํ๋ค.
์ด๋ฏธ์ง๊ฐ ๋ณ๊ฒฝ๋์์ผ๋ Pod์ ์ฌ๋ผ๊ฐ ์ปจํ
์ด๋๋ ์๋ก ๋น๋๋ ์ด๋ฏธ์ง์ ์ปจํ
์ด๋๋ก ๋ณ๊ฒฝํด์ค์ผ ํ๋ค.
์ผ๋จ ๊ธฐ์กด์ Pod๋ฅผ ์ญ์ ํ๋ค.
kubectl delete pod ํ๋์ด๋ฆ
Service์ Pod์ ์ค์ ํ์ผ์ ํ ๊ณณ์ ์์ฑํ์ง๋ง Pod๋ง ์ญ์ ํ๊ณ ํด๋น ํ์ผ์ ์ ์ฉํ๋ฉด ๋ฐ๋ ๋ถ๋ถ๋ง ์ ์ฉ๋๋ค. ๐
postman์ผ๋ก api ํธ์ถ
DB์ ์ ์ ์ฅ ใ
ECR ๋ก๊ทธ์ธ ์ฐธ๊ณ
https://www.44bits.io/ko/post/amazon-ecr-login-by-awscliv2