# 예제 애플리케이션 배포

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ecsdemo-nodejs
  labels:
    app: ecsdemo-nodejs
  namespace: default
spec:
  replicas: 1
  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
```

위에 예제 파일에는 서비스(service)와 app이 _어떻게_  배포되는지가 기술되어 있습니다. 이 내용을 kubectl을 이용하여 쿠버네티스 API에 쓰면, 쿠버네티스는 응용 프로그램이 배포될 때에 우리의 설정에 충족시킬 것입니다.

컨테이너는 3000번 포트로 수신 대기하고, 네이티브 서비스 디스커버리는 운영중인 컨테이너를 찾고 해당 컨테이너와 통신하는데 사용합니다.

## 1. NODEJS 백엔드 API 배포하기

NodeJS 백엔드 API를 올려 봅시다!

다음의 명령어를 귀하의 클라우드9 워크스페이스에 복사/붙여넣기 합니다.

```
cd ~/environment/ecsdemo-nodejs
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
```

디폴로이먼트 상황을 확인하여 배포 진행 과정을 지켜 볼 수 있습니다.

```
kubectl get deployment ecsdemo-nodejs
```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCWxsKo-KRV3mFcA91%2Fimage.png?alt=media\&token=ae3d82e8-dc28-42e1-bb4d-d42d57d73c90)

## 2. 크리스탈 백엔드 API 배포하기

크리스탈 백엔드 API를 올려 봅시다!

다음의 명령어를 귀하의 클라우드9 워크스페이스에 복사/붙여넣기 합니다.

```
cd ~/environment/ecsdemo-crystal
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml

```

디폴로이먼트 상황을 확인하여 배포 진행 과정을 지켜 볼 수 있습니다.

```
kubectl get deployment ecsdemo-crystal
```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCXELqLovNwIcJO08z%2Fimage.png?alt=media\&token=bbd7945e-ea41-4acd-946d-a92824ba3523)

## 3. 서비스(Service) 종류 확인

프론트엔드 서비스를 올리기 전에 우리가 사용할 서비스(service) 종류를 살펴봅니다. `kubernetes/service.yaml`은 프론트엔드 서비스를 위한 설정입니다.

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

`type: LoadBalancer`을 주목하십시오. 이는 ELB를 설정하여 서비스로 들어오는 트래픽을 처리하게 합니다.

백엔드 서비스를 위한 `kubernetes/service.yaml`과 비교합니다.

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

프론트엔드와는 달리 특정 서비스 종류를 설정하지 않았습니다. [쿠버네티스 공식 문서](https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types)에 따르면 기본 서비스 종류는 `ClusterIP` 입니다. 이는 클러스터 내부 IP를 서비스로 노출하며 이 값을 선택하면 클러스터 내부에서만 해당 서비스에 접근할 수 있습니다.

## 4. ELB 서비스 롤(Role) 확인

이전에 로드 밸런서를 생성하지 않은 AWS 계정인 경우, ELB의 서비스(service) 롤(role)이 아직 존재하지 않을 수 있습니다.

롤을 확인하고 누락된 경우에는 만듭니다.

다음의 명령어를 Cloud9 워크스페이스에 복사/붙여넣기 합니다.

```
aws iam get-role --role-name "AWSServiceRoleForElasticLoadBalancing" || aws iam create-service-linked-role --aws-service-name "elasticloadbalancing.amazonaws.com"
```

Role이 생성된 것을 확인합니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCYqYSzlQ1DEwTZCWW%2Fimage.png?alt=media\&token=c2f954c1-fffb-477c-8450-82b619c15c1b)

## 5. 프론트엔드 서비스 배포하기

루비 프론트엔드를 올려 봅시다!

다음의 명령어를 귀하의 Cloud9 워크스페이스에 복사/붙여넣기 합니다.

```
cd ~/environment/ecsdemo-frontend
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml

```

디폴로이먼트 상황을 확인하여 배포 진행 과정을 지켜 볼 수 있습니다.

```
kubectl get deployment ecsdemo-frontend
```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCZI4WSHho_Hqg4YPj%2Fimage.png?alt=media\&token=f41a45ba-fbb0-4dc3-8dcf-8537e1ae5e18)

## 6. 서비스(Service) 주소 찾기

이제`type : LoadBalancer`로 실행중인 서비스(service)가 있으니, ELB의 주소를 확인해야 합니다. 이를 위해 kubectl로 `get services` 하면 됩니다.

```
kubectl get service ecsdemo-frontend
```

위 명령어 출력 ELB의 FQDN을 보여줄 만큼 필드가 길지 않은 경우, 아래 명령으로 출력 형식을 조정할 수 있습니다.

```
kubectl get service ecsdemo-frontend -o wide
```

이 데이터를 프로그램적으로 사용하기 원한다면, json 형식으로 출력할 수 있습니다. 다음은 json 출력을 사용하는 예제 입니다.

```
ELB=$(kubectl get service ecsdemo-frontend -o json | jq -r '.status.loadBalancer.ingress[].hostname')

curl -m3 -v $ELB
```

{% hint style="info" %}
ELB가 준비되고 트래픽을 프론트엔드 파드로 전송하기까지는 몇십초가 걸립니다.
{% endhint %}

loadBalancer 호스트네임을 웹 브라우저에 카피/붙여넣기해서 애플리케이션이 실행중인지 확인합니다. 다음 페이지에서 서비스를 스케일 업할 때까지 이 탭을 그대로 열어둡니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhC_MRum6DOXjPH0qeE%2Fimage.png?alt=media\&token=c98f1ec6-bd04-45c3-b098-3364472c0beb)



