아마존 클라우드

[클라우드] EKS에 어플리케이션 배포하기

트리스탄1234 2023. 5. 8. 20:13
728x90
반응형

안녕하세요 이웃님들.^.^

좋은 아침 입니다....

오늘은 지난번 eks 생성 절차에 이어서 생성된 eks에 어플리케이션 배포 하는 방법에 대해서 포스팅을 해보려고 합니다.

아래 다이어그램은 배포 하려는 어플리케이션을 위한 EKS 구성도 입니다.

이 절차를 수행을 하고 나면 프론트 앤드 컨테이너 3개와 백엔드 컨테이너 3개가 실행이 될것 입니다.

  1. baston host에서 cd명령으로 home 디렉토리로 이동을 합니다.
sh-4.2$ cd
sh-4.2$ pwd
/home/ssm-user
sh-4.2$
반응형

 

2. 아래 명령을 사용하여 Amazon S2에서 배포 하려는 어플리케이션을 복사 합니다.

실행명령어

aws s3 cp s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/ ~/ecsdemo-crystal/ --recursive ==> crystal 프로그램 다운로드

aws s3 cp s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-frontend/ ~/ecsdemo-frontend/ --recursive ==> 프론트엔드 다운로드

aws s3 cp s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-nodejs/ ~/ecsdemo-nodejs/ --recursive ==> nodejs 다운로드

실행결과

download: s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/.git/logs/refs/remotes/origin/HEAD to ecsdemo-crystal/.git/logs/refs/remotes/origin/HEAD
download: s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/src/server.cr to ecsdemo-crystal/src/server.cr
download: s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/startup-cdk.sh to ecsdemo-crystal/startup-cdk.sh
download: s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/cdk/app.py to ecsdemo-crystal/cdk/app.py
download: s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/startup.sh to ecsdemo-crystal/startup.sh
download: s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/kubernetes/deployment.yaml to ecsdemo-crystal/kubernetes/deployment.yaml
download: s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/kubernetes/service.yaml to ecsdemo-crystal/kubernetes/service.yaml
download: s3://aws-tc-largeobjects/ILT-TF-200-COREKS-10-EN/lab-1/ecsdemo-crystal/src/default_ip/default_ip.cr to ecsdemo-crystal/src/default_ip/default_ip.cr

3. 아래 명령을 사용하여 백엔드 어플리케이션인 Node js를 배포하기 위해

다운로드한 폴더로 이동 합니다.

sh-4.2$ cd ~/ecsdemo-nodejs
sh-4.2$ pwd
/home/ssm-user/ecsdemo-nodejs

4.해당 폴더에 있는 deploymentyaml파일을 이용해서 Nodejs를 배포 합니다.

sh-4.2$ kubectl apply -f kubernetes/deployment.yaml
deployment.apps/ecsdemo-nodejs created

배포된 Deployment.yaml 파일의 내용은 아래와 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: ecsdemo-nodejs
labels:
app: ecsdemo-nodejs
namespace: default
spec:
replicas: 1 ==> Pod의 갯수 정의
selector:
matchLabels:
app: ecsdemo-nodejs
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: ecsdemo-nodejs
spec: ==> 배포된 컨테이너 정보.
containers:
- image: brentley/ecsdemo-nodejs:latest
imagePullPolicy: Always
name: ecsdemo-nodejs
ports:
- containerPort: 3000
protocol: TCP

 

5. 이제 Nodejs Pod를 위한 Service 객체를 배포 합니다.

sh-4.2$ kubectl apply -f kubernetes/service.yaml
service/ecsdemo-nodejs created

배포된 service.yaml의 파일 내용을 보면 아래와 같습니다.

selector 부분에 정의된 값과 위의 depployment에서 label에 정의된 값이 같아야... 배포된 Service객체가 위에 배포된 Pod를 위한 Service객체로 동작 합니다.

apiVersion: v1
kind: Service
metadata:
name: ecsdemo-nodejs
spec:
selector:
app: ecsdemo-nodejs
ports:
- protocol: TCP
port: 80
targetPort: 3000

6. 아래 명령을 사용해서 재대로 배포가 되었는지 확인을 합니다.

sh-4.2$ kubectl get deployment ecsdemo-nodejs
NAME READY UP-TO-DATE AVAILABLE AGE
ecsdemo-nodejs 1/1 1 1 9m16s
sh-4.2$

7. 이제 crystal 어플리케이션을 배포 하기 위해 복제된 디렉토리로 이동을 합니다.

sh-4.2$ cd ~/ecsdemo-crystal
sh-4.2$ pwd
/home/ssm-user/ecsdemo-crystal

8. 아래 명령을 사용해서 crysatal 어플리케이션을 위한 Pod를 배포 합니다.

sh-4.2$ kubectl apply -f kubernetes/deployment.yaml
deployment.apps/ecsdemo-crystal created

9. 아래 명령을 이용해서 배포된 Pod의 상태를 확인 합니다.

h-4.2$ kubectl get deployment ecsdemo-crystal
NAME READY UP-TO-DATE AVAILABLE AGE
ecsdemo-crystal 1/1 1 1 44s

10. 위에서 배포한 deployment.yaml을 파일 내용은 아래와 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: ecsdemo-crystal
labels:
app: ecsdemo-crystal
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: ecsdemo-crystal
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: ecsdemo-crystal
spec:
containers:
- image: brentley/ecsdemo-crystal:latest
imagePullPolicy: Always
name: ecsdemo-crystal
ports:
- containerPort: 3000
protocol: TCP

11. 이제 프론트앤드 어플리케이션을 위해 아래 명령을 이용하여 디렉토리를 이동 한다.

sh-4.2$ cd ~/ecsdemo-frontend
sh-4.2$ pwd
/home/ssm-user/ecsdemo-frontend

12. 아제 프론트앤드를 위해 아래 명령을 이용하여 deployment 객체를 배포를 합니다.

h-4.2$ kubectl apply -f kubernetes/deployment.yaml
deployment.apps/ecsdemo-frontend created

배포한 파일의 내용은 아래와 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: ecsdemo-frontend
labels:
app: ecsdemo-frontend
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: ecsdemo-frontend
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: ecsdemo-frontend
spec:
containers:
- image: brentley/ecsdemo-frontend:latest
imagePullPolicy: Always
name: ecsdemo-frontend
ports:
- containerPort: 3000
protocol: TCP
env:
- name: CRYSTAL_URL
- name: NODEJS_URL

13. 이제 프론트 엔드를 위한 service객체를 아래의 명령을 사용하여 배포를 합니다.

sh-4.2$ kubectl apply -f kubernetes/service.yaml
service/ecsdemo-frontend created

서비스 객체의 파일 내용은 아래와 같습니다. 서비스 객체의 Type은 로드 발란서로 설정이 되어 있습니다.

apiVersion: v1
kind: Service
metadata:
name: ecsdemo-frontend
spec:
selector:
app: ecsdemo-frontend
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 3000

14. 이제 정상적으로 배포가 되었는지 아래 명령을 사용하여 확인 한다.

sh-4.2$ kubectl get deployment ecsdemo-frontend
NAME READY UP-TO-DATE AVAILABLE AGE
ecsdemo-frontend 1/1 1 1 4m43s

15. 아래 명령을 사용하여 디폴트 네임 스페이스에서 배포된 deployment의 객체를 확인 합니다.

sh-4.2$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
ecsdemo-crystal 1/1 1 1 10m
ecsdemo-frontend 1/1 1 1 6m10s
ecsdemo-nodejs 1/1 1 1 23m

16. 프론트 엔드의 service객체에 대한 세부 정보를 아래 명령을 통해 확인 합니다.

h-4.2$ kubectl get service ecsdemo-frontend -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
ecsdemo-frontend LoadBalancer 10.100.224.148 a4c8739fa3eea4039b11b7ea641306cc-655281564.ap-southeast-2.elb.amazonaws.com 80:32084/TCP 5m32s app=ecsdemo-frontend

표시되는 출력 중에서 External-IP 부분을 복사 합니다.

17. 이제 새로운 web 브라우저를 열고 https://를 입력 후 위에서 복사한 extenal-ip정보를 브라우저에 복사 후 엔터를 입력 합니다.

그럼 해당 어플리케이션의 웹 페이지가 열리는것을 확인할 수 있습니다.

18 아래 명령을 이용해서 default 네임스페이스에 배포된 Pod의 정보를 조회 합니다.

sh-4.2$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
ecsdemo-crystal-69bd6dbf88-wjbmc 1/1 Running 0 31m
ecsdemo-frontend-5744c78747-6h676 1/1 Running 0 26m
ecsdemo-nodejs-6f79d847d9-xlsd8 1/1 Running 0 44m
sh-4.2$

19 아래 명령을 사용하여 세부 정보를 살펴볼 Pod의 이름을 변수로 저장 합니다.

sh-4.2$ export MY_POD_NAME=$(kubectl get pods -n default -o jsonpath='{.items[0].metadata.name}')

20 저장한 Pod 변수를 이용하여 Pod의 세부 정보를 살펴 봅니다.

sh-4.2$ kubectl -n default describe pod $MY_POD_NAME
Name: ecsdemo-crystal-69bd6dbf88-wjbmc
Namespace: default
Priority: 0
Node: ip-192-168-88-46.ap-southeast-2.compute.internal/192.168.88.46
Start Time: Mon, 01 May 2023 06:29:44 +0000
Labels: app=ecsdemo-crystal
pod-template-hash=69bd6dbf88
Annotations: kubernetes.io/psp: eks.privileged
Status: Running
IP: 192.168.95.171
IPs:
IP: 192.168.95.171
Controlled By: ReplicaSet/ecsdemo-crystal-69bd6dbf88
Containers:
ecsdemo-crystal:
Container ID: docker://eaafaa0c823192e110a461ba6787af99462b9b5181bc6245460627c765edaf5f
Image: brentley/ecsdemo-crystal:latest
Image ID: docker-pullable://brentley/ecsdemo-crystal@sha256:4e2726f8fcf148f8978c34e88c9f7468cbc39815daccf6803daa7c9bf44353db
Port: 3000/TCP
Host Port: 0/TCP
State: Running
Started: Mon, 01 May 2023 06:29:54 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-btz8x (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-btz8x:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 32m default-scheduler Successfully assigned default/ecsdemo-crystal-69bd6dbf88-wjbmc to ip-192-168-88-46.ap-southeast-2.compute.internal
Normal Pulling 32m kubelet Pulling image "brentley/ecsdemo-crystal:latest"
Normal Pulled 32m kubelet Successfully pulled image "brentley/ecsdemo-crystal:latest" in 8.556365127s (8.556371021s including waiting)
Normal Created 32m kubelet Created container ecsdemo-crystal
Normal Started 32m kubelet Started container ecsdemo-crystal

그럼 오늘은 여기까지^.^

오늘도 행복한 하루 되시길 바랍니다.

화이팅 하셍 ^.^

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형