티스토리 뷰

Fruit Smoothies의 평가 웹 사이트는 여러 구성 요소로 구성된다. 웹 프런트 엔드, 캡처된 데이터를 저장하는 문서 데이터베이스 및 웹 프런트 엔드가 데이터베이스와 통신할 수 있도록 하는 RESTful 평가 API가 있다. 개발 팀은 MongoDB를 평가 웹 사이트에서 선택한 문서 저장소 데이터베이스로 사용하고 있다.

이전 단원에서는 평가 API를 배포했다. 이 단원에서는 배포를 계속하고 평가 웹 프런트 엔드를 배포한다. 평가 웹 프런트 엔드는 Node.js 애플리케이션이다. 여러분은 이미 Azure Container Registry 인스턴스를 만들었다. 이 인스턴스를 사용하여 프런트 엔드의 Docker 이미지를 빌드하고 리포지토리에 저장했다.

이번 실습에서는 다음을 수행한다.

  • 웹 프런트 엔드에 대한 Kubernetes 디플로이먼트 만들기
  • Kubernetes 서비스 매니페스트 파일을 만들어서 부하가 분산된 서비스로서 웹 프런트 엔드 노출
  • 웹 프런트 엔드 테스트

 

 

평가 웹 프런트 엔드의 Kubernetes 디플로이먼트 만들기

먼저 평가 프런트 엔드에 대한 디플로이먼트를 만들어 보겠다.

1. 통합 편집기를 사용하여 ratings-web-deployment.yaml이라는 이름의 파일을 만든다.


code ratings-web-deployment.yaml

 

2. 다음 텍스트를 파일에 붙여넣는다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-web
spec:
  selector:
    matchLabels:
      app: ratings-web
  template:
    metadata:
      labels:
        app: ratings-web # the label for the pods and the deployments
    spec:
      containers:
      - name: ratings-web
        image: <acrname>.azurecr.io/ratings-web:v1 # IMPORTANT: update with your own repository
        imagePullPolicy: Always
        ports:
        - containerPort: 8080 # the application listens to this port
        env:
        - name: API # the application expects to connect to the API at this endpoint
          value: http://ratings-api.ratingsapp.svc.cluster.local
        resources:
          requests: # minimum resources required
            cpu: 250m
            memory: 64Mi
          limits: # maximum resources allocated
            cpu: 500m
            memory: 512Mi

 

3. image 키 업데이트에서 <acrname>을 Container Registry 인스턴스의 이름으로 바꾼다.

4. 파일을 검토하고 다음 사항을 확인한다.

  • image: 이전에 만든 Container Registry 인스턴스에서 푸시한 이미지를 실행하는 디플로이먼트를 만든다(예: acr11501.azurecr.io/ratings-web:v1). 컨테이너는 포트 8080을 수신 대기한다. 디플로이먼트 및 Pod는 app=ratings-web으로 레이블이 지정된다.
  • env: 평가 프런트 엔드는 API 환경 변수에 구성된 API 엔드포인트에 연결한다. 기본값을 사용하고 ratingsapp 네임스페이스에서 평가 API 서비스를 배포했다면 해당 값은 http://ratings-api.ratingsapp.svc.cluster.local이어야 한다.
  • resources: 각 컨테이너 인스턴스에는 최소 0.25 코어와 64MB 메모리가 제공된다. Kubernetes 스케줄러는 이러한 Pod를 예약하기 위해 사용 가능한 용량이 있는 노드를 찾는다. 컨테이너는 장기간 동안 CPU 제한을 초과하도록 허용될 수도 허용되지 않을 수도 있다. 그러나 과도한 CPU 사용으로 인해 중지되지는 않는다. 컨테이너가 메모리 제한을 초과할 경우에는 종료될 수 있다.

5. 파일을 저장하려면 Ctrl+S를 선택한다. 편집기를 닫으려면 Ctrl+Q를 선택한다.

 

6. kubectl apply 명령을 사용하여 구성을 적용하고 ratingsapp 네임스페이스에서 애플리케이션을 배포한다.


kubectl apply \
--namespace ratingsapp \
-f ratings-web-deployment.yaml

다음 예제와 같은 출력이 표시된다.

kim@Azure:~$ kubectl apply \
> --namespace ratingsapp \
> -f ratings-web-deployment.yaml
deployment.apps/ratings-web created

 

7. kubectl get pods 명령으로 -w 플래그를 사용하여 Pod가 롤아웃하는 것을 확인할 수 있다. app=ratings-web으로 레이블이 지정된 ratingsapp 네임스페이스에서 Pod를 쿼리해야 한다. Ctrl+C를 사용하여 확인을 중지한다.


kubectl get pods --namespace ratingsapp -l app=ratings-web -w

몇 초 후 Pod가 Running 상태로 전환된다. CTRL+C를 선택하여 확인을 중지한다.

kim@Azure:~$ kubectl get pods --namespace ratingsapp -l app=ratings-web -w
NAME                          READY   STATUS    RESTARTS   AGE
ratings-web-8766b9946-fplm2   1/1     Running   0          26s

Pod가 시작되지 않거나 준비되지 않거나 충돌하는 경우 kubectl logs <pod name> --namespace ratingsapp kubectl describe pod <pod name> --namespace ratingsapp을 사용하여 로그를 확인할 수 있다.

 

 

8. 디플로이먼트 상태를 확인한다.


kubectl get deployment ratings-web --namespace ratingsapp

배포에서 하나의 복제본이 준비된 것으로 표시해야 한다.

kim@Azure:~$ kubectl get deployment ratings-web --namespace ratingsapp
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
ratings-web   1/1     1            1           54s

 

 

 

평가 웹 프런트 엔드에 대한 Kubernetes 서비스 만들기

다음 단계는 애플리케이션 워크로드에 대한 네트워크 구성을 간소화하는 것이다. Kubernetes 서비스를 사용하여 Pod를 그룹화하고 네트워크 연결을 제공한다.

이 서비스에 대해 ClusterIP 대신 Kubernetes LoadBalancer를 사용한다. LoadBalancer를 사용하면 클러스터의 공용 IP에 Kubernetes 서비스를 노출할 수 있다. 이 형식을 사용하면 클러스터 외부에서 서비스에 연결할 수 있다.

 

1. 통합 편집기를 사용하여 ratings-web-service.yaml이라는 이름의 파일을 만든다.


code ratings-web-service.yaml

 

2. 다음 텍스트를 파일에 붙여넣는다.

apiVersion: v1
kind: Service
metadata:
  name: ratings-web
spec:
  selector:
    app: ratings-web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: LoadBalancer

 

3. 파일을 검토하고 다음 사항을 확인한다.

  • selector: 서비스 대상인 Pod 집합은 selector에 의해 결정된다. 다음 예제에서 Kubernetes는 app: ratings-web로 레이블이 지정된 Pod에 대한 트래픽의 부하를 분산한다. 이 레이블은 디플로이먼트를 만들 때 정의한 것이다. 서비스의 컨트롤러는 해당 레이블과 일치하는 Pod를 지속적으로 검색하여 부하 분산 장치에 추가한다.
  • ports: 서비스는 수신 port를 targetPort에 매핑할 수 있다. 수신 포트는 서비스가 응답하는 대상이다. 대상 포트는 Pod가 수신 대기하도록 구성된 포트이다. 예를 들어, 서비스는 포트 80에서 외부적으로 노출되고, 포트 8080에서 수신 대기하는 ratings-web Pod에 대한 트래픽의 부하를 분산한다.
  • type: LoadBalancer 유형의 서비스는 Azure에서 공용 IP 주소를 만들고 Azure Load Balancer로 할당한다. 이 값을 선택하면 클러스터 외부에서 서비스에 연결할 수 있다.

 

4. 파일을 저장하려면 Ctrl+S를 선택한다. 편집기를 닫으려면 Ctrl+Q를 선택한다.

 

5. kubectl apply 명령을 사용하여 구성을 적용하고 ratingsapp 네임스페이스에서 서비스를 배포한다.


kubectl apply \
--namespace ratingsapp \
-f ratings-web-service.yaml

 

다음 예제와 같은 출력이 표시된다.

kim@Azure:~$ kubectl apply \
> --namespace ratingsapp \
> -f ratings-web-service.yaml
service/ratings-web created

 

6. 다음으로 서비스 상태를 확인해 보겠다. 서비스에서 공용 IP를 가져오는 데 몇 분 정도 걸린다. 실시간으로 업데이트를 확인하려면 -w 플래그를 추가하여 watch kubectl get service 명령을 실행한다. Ctrl+C를 사용하여 확인을 중지한다.


kubectl get service ratings-web --namespace ratingsapp -w

서비스는 실제 IP로 변경될 때까지 잠시동안 EXTERNAL-IP를 <pending>으로 표시한다.

kim@Azure:~$ kubectl get service ratings-web --namespace ratingsapp -w
NAME          TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)        AGE
ratings-web   LoadBalancer   10.2.0.78    20.194.106.224   80:32483/TCP   20s

20.194.106.224와 같이 해당하는 공용 IP를 기록해 둔다. 주소를 사용하여 애플리케이션에 액세스한다.

 

 

 

애플리케이션 테스트

이제 ratings-web 서비스에 공용 IP가 있으므로 웹 브라우저에서 이 IP를 열어(예: http://20.194.106.224) 애플리케이션을 확인하고 애플리케이션과 상호 작용할 수 있다.

 

 

 

 

요약

이번 실습에서는 ratings-web 배포를 만들고 LoadBalancer 유형 서비스를 통해서 인터넷으로 노출했다.

  • Deployment/ratings-web: 웹 프런트 엔드이다.
  • Service/ratings-web: 부하가 분산된 서비스이며, 공용 IP를 통해 Azure Load Balancer에서 노출된다.

다음으로, Ingress를 사용하여 애플리케이션의 네트워크 접근성을 개선한다.

 

 

7편에서 계속

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함