티스토리 뷰

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

이전 단원에서 Helm을 사용하여 MongoDB를 배포했다. 이 단원에서는 배포를 계속하고 평가 API를 배포한다. 평가 API는 Express 프레임워크를 사용하여 작성된 Node.js 애플리케이션이다. 이 애플리케이션은 MongoDB 데이터베이스에서 항목 및 해당 평가를 검색하고 저장한다. Azure Container Registry 인스턴스를 이미 만들었음을 기억하실 것이다.

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

  • RESTful API에 대한 Kubernetes 디플로이먼트 만들기
  • Kubernetes 서비스를 만들어 네트워크를 통해 RESTful API 노출

 

 

평가 API의 Kubernetes 디플로이먼트 만들기

Kubernetes 디플로이먼트를 통해 Pod에 대한 선언적 업데이트를 제공할 수 있다. 디플로이먼트 매니페스트 파일에서 워크로드의 원하는 상태를 설명하고 kubectl을 사용하여 디플로이먼트 컨트롤러에 매니페스트를 제출한다. 그러면 디플로이먼트 컨트롤러에서 정의된 워크로드의 필요한 상태(예: 새 Pod 디플로이먼트, Pod 수 증가 또는 Pod 수 감소)를 수행한다.

1. 통합 편집기를 사용하여 ratings-api-deployment.yaml이라는 Kubernetes 디플로이먼트에 대한 매니페스트 파일을 만든다.


code ratings-api-deployment.yaml

 

Azure Cloud Shell에는 통합 파일 편집기가 포함되어 있다. Cloud Shell 편집기는 언어 강조 표시, 명령 팔레트, 파일 탐색기와 같은 기능을 지원한다. 간단한 파일을 만들고 편집하려면 Cloud Shell 터미널에서 code .를 실행하여 편집기를 시작한다. 이 작업을 수행하면 터미널에 설정된 활성 작업 디렉터리를 통해 편집기가 열린다. 빠른 편집을 위해 직접 파일을 열려면 code <filename>을 실행하여 파일 탐색기 없이 편집기를 연다. UI 버튼을 통해 편집기를 열려면 도구 모음에서 {} 편집기 아이콘을 클릭한다. 이 작업은 편집기를 열고 기본적으로 파일 탐색기를 /home/<user> 디렉터리로 지정한다.

 

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-api
spec:
  selector:
    matchLabels:
      app: ratings-api
  template:
    metadata:
      labels:
        app: ratings-api # the label for the pods and the deployments
    spec:
      containers:
      - name: ratings-api
        image: <acrname>.azurecr.io/ratings-api:v1 # IMPORTANT: update with your own repository
        imagePullPolicy: Always
        ports:
        - containerPort: 3000 # the application listens to this port
        env:
        - name: MONGODB_URI # the application expects to find the MongoDB connection details in this environment variable
          valueFrom:
            secretKeyRef:
              name: mongosecret # the name of the Kubernetes secret containing the data
              key: MONGOCONNECTION # the key inside the Kubernetes secret containing the data
        resources:
          requests: # minimum resources required
            cpu: 250m
            memory: 64Mi
          limits: # maximum resources allocated
            cpu: 500m
            memory: 256Mi
        readinessProbe: # is the container ready to receive traffic?
          httpGet:
            port: 3000
            path: /healthz
        livenessProbe: # is the container healthy?
          httpGet:
            port: 3000
            path: /healthz

 

3. 이 파일에서 image 키의 <acrname> 값을 Azure Container Registry 인스턴스의 이름으로 업데이트한다.

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

  • image: 이전에 만든 Azure Container Registry 인스턴스로 푸시한 이미지를 실행하는 복제본으로 디플로이먼트를 만든다(예: acr4229.azurecr.io/ratings-api:v1). 컨테이너는 포트 3000을 수신 대기한다. 디플로이먼트 및 Pod는 app=ratings-api으로 레이블이 지정된다.
  • secretKeyRef: 평가 API는 이름이 MONGODB_URI인 환경 변수의 MongoDB 데이터베이스에 대한 연결 세부 정보를 예상한다. valueFrom  secretKeyRef를 사용하여 MongoDB를 배포할 때 만든 Kubernetes 시크릿 mongosecret에 저장된 값을 참조할 수 있다.
  • resources: 각 컨테이너 인스턴스에는 최소 0.25 코어와 64MB 메모리가 제공된다. Kubernetes 스케줄러는 이러한 Pod를 예약하기 위해 사용 가능한 용량이 있는 노드를 찾는다. 컨테이너는 장기간 동안 CPU 제한을 초과하도록 허용될 수도 허용되지 않을 수도 있다. 그러나 과도한 CPU 사용으로 인해 중지되지는 않는다. 컨테이너가 메모리 제한을 초과할 경우 종료될 수 있다.
  • readinessProbe  livenessProbe: 애플리케이션은 /healthz에서 상태 확인 엔드포인트를 노출한다. API가 MongoDB에 연결할 수 없는 경우 상태 검사 엔드포인트는 오류를 반환한다. 이러한 프로브를 사용하여 Kubernetes를 구성하고, 컨테이너가 정상 상태이며 트래픽을 수신할 준비가 되었는지 여부를 확인할 수 있다.

5. 파일을 저장하려면 Ctrl+S를 선택한다. 편집기를 닫으려면 Ctrl+Q를 선택한다. 편집기의 오른쪽 위에서 ... 작업 패널을 열 수도 있다. 저장을 선택한 다음, 편집기 닫기를 선택한다.

6. kubectl apply 명령을 사용하여 구성을 적용한다. ratingsapp 네임스페이스에 MongoDB 릴리즈를 배포했으므로 ratingsapp 네임스페이스에도 API를 배포한다.


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

 

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

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

 

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


kubectl get pods \
--namespace ratingsapp \
-l app=ratings-api -w

 

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

kim@Azure:~$ kubectl get pods \
> --namespace ratingsapp \
> -l app=ratings-api -w
NAME                           READY   STATUS              RESTARTS   AGE
ratings-api-687944c7fb-tg7tp   0/1     ContainerCreating   0          32s
ratings-api-687944c7fb-tg7tp   0/1     Running             0          47s
ratings-api-687944c7fb-tg7tp   1/1     Running             0          53s


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

 

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


kubectl get deployment ratings-api --namespace ratingsapp

 

디플로이먼트에서 하나의 복제본이 준비된 것으로 표시해야 한다.

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

 

 

 

평가 API 서비스에 대한 Kubernetes 서비스 만들기

‘서비스’는 Pod를 네트워크 서비스로 노출하여 안정적인 네트워킹을 제공하는 Kubernetes 오브젝트이다. Kubernetes 서비스를 사용하여 노드, Pod 및 클러스터에 대한 내부와 외부 모두의 애플리케이션 사용자 간에 통신하도록 설정할 수 있다. 노드 또는 Pod와 마찬가지로 서비스를 만들 때 Kubernetes에서 할당한 IP 주소를 받는다. 서비스는 또한 서비스 이름 및 TCP 포트를 기반으로 DNS 이름을 할당한다.

ClusterIP를 사용하면 클러스터의 내부 IP에 Kubernetes 서비스를 노출할 수 있다. 이 형식을 사용하면 클러스터 내에서만 서비스에 연결할 수 있다.

 

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

1. 통합 편집기를 사용하여 ratings-api-service.yaml이라는 Kubernetes 서비스에 대한 매니페스트 파일을 만든다.


code ratings-api-service.yaml

 

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

apiVersion: v1
kind: Service
metadata:
  name: ratings-api
spec:
  selector:
    app: ratings-api
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  type: ClusterIP


selector
: 셀렉터는 서비스 대상인 Pod 집합을 결정한다. 다음 예제에서 Kubernetes는 app: ratings-api로 레이블이 지정된 Pod에 대한 트래픽의 부하를 분산한다. 이 레이블은 디플로이먼트를 만들 때 정의한 것이다. 서비스의 컨트롤러는 해당 레이블과 일치하는 Pod를 지속적으로 검색하여 부하 분산 장치에 추가한다.3. 파일을 검토하고 다음 사항을 확인한다.

  • ports: 서비스는 수신 port를 targetPort에 매핑할 수 있다. 수신 포트는 서비스가 응답하는 대상이다. 대상 포트는 Pod가 수신 대기하도록 구성된 포트이다. 예를 들어, 서비스는 ratings-api.ratingsapp.svc.cluster.local:80의 클러스터에서 내부적으로 공개되고, 포트 3000에서 수신 대기하는 ratings-api Pod에 대한 트래픽의 부하를 분산한다.
  • type: ClusterIP 유형의 서비스는 클러스터 내에서 사용할 내부 IP 주소를 만든다. 이 값을 선택하면 클러스터 내에서만 서비스에 연결할 수 있다. 클러스터 IP는 기본 서비스 유형이다.

 

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

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


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

 

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

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


6.
서비스 상태를 확인한다.


kubectl get service ratings-api --namespace ratingsapp

서비스는 액세스할 수 있는 내부 IP를 표시해야 한다. 기본적으로 Kubernetes는 [service name].[namespace].svc.cluster.local에 매핑되는 DNS 항목을 만든다. 즉, 이 서비스는 ratings-api.ratingsapp.svc.cluster.local에서도 액세스할 수 있다. 클러스터를 만들 때 정의한 Kubernetes 서비스 주소 범위에서 어떻게 CLUSTER-IP를 가져오는지 확인한다.

kim@Azure:~$ kubectl get service ratings-api --namespace ratingsapp
NAME          TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
ratings-api   ClusterIP   10.2.0.155   <none>        80/TCP    13s

 

7. 마지막으로 엔드포인트를 검사해 보겠다. 서비스는 엔드포인트를 통해 Pod에 대한 트래픽의 부하를 분산한다. 엔드포인트 이름은 서비스와 동일하다. 서비스가 Pod에 해당하는 엔드포인트 하나를 가리키는지 확인한다. 복제본을 더 추가하거나 Pod가 왔다 갔다 해도 Kubernetes에서 엔드포인트를 업데이트된 상태로 자동 유지한다. kubectl get endpoints 명령을 실행하여 엔드포인트 정보를 가져온다.


kubectl get endpoints ratings-api --namespace ratingsapp

 

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

kim@Azure:~$ kubectl get endpoints ratings-api --namespace ratingsapp
NAME          ENDPOINTS          AGE
ratings-api   10.240.0.45:3000   35s

 

이제 ratings-api 디플로이먼트를 만들고 내부(ClusterIP) 서비스로 노출했다.

  • Deployment/ratings-api: 이 API는 복제본을 실행하며, mongosecret를 환경 변수로 탑재하여 MongoDB 연결 세부 정보를 읽는다.
  • Service/ratings-api: 이 API는 ratings-api.ratingsapp.svc.cluster.local:80의 클러스터 내에서 내부적으로 공개된다.

 

 

 

요약

이 실습에서는 배포 매니페스트 파일을 만들고 클러스터에 적용하여 ratings-api에 대한 Kubernetes 배포를 만들었다. 또한 매니페스트 파일을 만들고 클러스터에 적용하여 ratings-api에 대한 Kubernetes 서비스를 만들었다. 이제 네트워크에서 클러스터 IP를 통해 사용할 수 있는 ratings-api 엔드포인트가 있다.

다음으로, 유사한 프로세스를 사용하여 Fruit Smoothies 평가 웹 사이트를 배포한다.

 

 

6편에서 계속

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함