Kubernetes에서 확장 가능 웹 애플리케이션

이 튜토리얼에서는 비용이 발생할 수 있습니다. Cost Estimator를 사용하여 예상 사용량을 기반으로 비용 추정값을 생성하십시오.

이 튜토리얼에서는 컨테이너에서 로컬로 웹 애플리케이션을 실행한 후 Kubernetes Service을(를) 사용하여 작성된 Kubernetes 클러스터에 웹 애플리케이션을 배치하는 방법에 대해 설명합니다. 선택 사항으로 컨테이너 이미지를 구축하고 이미지를 개인 레지스트리에 푸시할 수 있습니다. 또한 사용자 정의 하위 도메인을 바인드하고 환경의 상태를 모니터하고 애플리케이션을 스케일링하는 방법에 대해 학습합니다.

컨테이너는 환경 사이에서 앱을 원활하게 이동할 수 있도록 앱 및 앱의 모든 종속 항목을 패키지하는 표준 방법입니다. 가상 머신과는 달리 컨테이너는 운영 체제를 번들로 포함하지 않습니다. 앱 코드, 런타임, 시스템 도구, 라이브러리 및 설정만 컨테이너에 패키지됩니다. 컨테이너는 가상 머신보다 가볍고 휴대하기 쉬우며 효율적입니다.

목표

  • 웹 애플리케이션을 Kubernetes 클러스터에 배치하십시오.
  • 사용자 정의 하위 도메인을 바인드합니다.
  • 클러스터의 상태 및 로그를 모니터합니다.
  • Kubernetes 팟(Pod)을 스케일링합니다.

아키텍처
아키텍처 다이어그램

  1. 개발자가 샘플 웹 애플리케이션을 다운로드하거나 복제합니다.
  2. 선택적으로 애플리케이션을 빌드하여 컨테이너 이미지를 생성합니다.
  3. 선택적으로 이미지는 IBM Cloud Container Registry의 네임스페이스로 푸시됩니다.
  4. 애플리케이션이 Kubernetes 클러스터에 배치됩니다.
  5. 사용자가 애플리케이션에 액세스합니다.

시작하기 전에

이 튜토리얼에는 다음 항목이 필요합니다.

  • IBM Cloud CLI
    • IBM Cloud Kubernetes Service 플러그인(kubernetes-service)
  • kubectl: Kubernetes 클러스터와 상호작용함
  • Helm 3: 차트를 배치함

튜토리얼 시작하기 안내서에는 사용자 운영 체제에 맞게 이 도구를 다운로드하고 설치하기 위한 지시사항이 있습니다.

이러한 도구의 설치를 피하려면 Cloud Shell IBM Cloud 사용할 수 있습니다.

또한 다음을 확인하십시오.

  • Secrets Manager 인스턴스가 필요합니다. Secrets Manager을(를) 사용하면 IBM Cloud 서비스 또는 사용자 정의 빌드 애플리케이션에서 사용되는 시크릿을 작성하고, 임대하고, 중앙 집중식으로 관리할 수 있습니다. 시크릿은 전용 Secrets Manager 인스턴스에 저장되며 사용자는 기본 제공 기능을 사용하여 만료 여부를 모니터링하고, 시크릿 순환을 스케줄하거나 수동으로 수행할 수 있습니다. 이 튜토리얼에서는 Kubernetes 사용하여 Secrets Manager TLS 인증서를 가져와 Kubernetes 에 삽입합니다. 기존 인스턴스가 이미 있는 경우에는 이를 사용할 수 있으며, 그렇지 않은 경우에는 Secrets Manager 서비스 인스턴스 작성에 설명되어 있는 단계에 따라 새 인스턴스를 작성할 수 있습니다.
  • 선택적으로 레지스트리 네임스페이스를 설정 하십시오. 사용자 정의 컨테이너 이미지를 빌드하는 경우에만 필요합니다.
  • Kubernetes의 기본을 이해하십시오.

Secrets Manager 와의 서비스 대 서비스 통신 사용

Secrets Manager 를 IBM Cloud Kubernetes Service 클러스터와 통합하려면 서비스 대 서비스 통신 권한이 필요합니다. 다음 단계에 따라 인증을 설정하십시오. 자세한 정보는 Secrets Manager에 대한 통합 을 참조하십시오.

  1. IBM Cloud 콘솔에서 **관리 > 액세스(IAM)**로 이동하십시오.
  2. 권한을 클릭하십시오.
  3. 작성을 클릭하십시오.
  4. 소스 서비스 목록 에서 Kubernetes Service 선택합니다.
  5. 모든 자원에 대한 액세스 범위를 지정하는 옵션을 선택하십시오.
  6. 대상 서비스 목록 에서 Secrets Manager 선택합니다.
  7. 모든 자원에 대한 액세스 범위를 지정하는 옵션을 선택하십시오.
  8. 서비스 액세스 섹션에서 관리자 옵션을 선택합니다.
  9. 권한 부여를 클릭하십시오.

Kubernetes 클러스터 작성

IBM Cloud Kubernetes Service IBM Cloud 컨테이너화된 앱을 배포하고 관리하기 위해 컴퓨팅 호스트의 Kubernetes 클러스터를 직접 생성할 수 있는 관리형 서비스입니다. 이 튜토리얼을 수행하는 데는 하나의 구역과 하나의 작업자 노드가 있고 사용 가능한 크기가 가장 작은(특성) 최소 클러스터로 충분합니다.

  1. Kubernetes 열고 Create cluster를 클릭합니다.

  2. 인프라를 선택하여 클러스터를 작성하십시오.

    • 다음 단계는 VPC 인프라에서 Kubernetes 에 대해 VPC 를 선택하는 경우입니다. Kubernetes 클러스터를 작성하기 전에 VPC및 서브넷을 작성해야 합니다. 자세한 정보는 VPC 클러스터 작성 문서를 참조하십시오.

      1. VPC 작성을 클릭하십시오.
      2. 위치 섹션에서 지역지역(예: EuropeLondon) 을 선택하십시오.
      3. VPC 이름을 입력하고, 리소스 그룹을 선택한 다음, 필요에 따라 태그를 추가하여 리소스를 체계적으로 정리하세요.
      4. 기본 보안 그룹에서 SSH 허용ping 허용을 선택 취소하십시오.
      5. 모든 구역에 서브넷 생성 체크를 해제합니다.
      6. 작성을 클릭하십시오.
      7. 작업자 구역 및 서브넷에서 서브넷이 작성되지 않은 두 개의 구역을 선택 취소하십시오.
      8. 구역당 작업자 노드1 로 설정하고 특징 변경 을 클릭하여 탐색하고 선택한 작업자 노드 크기로 변경하십시오.
      9. Ingress 아래에서 Ingress 시크릿 관리 를 사용으로 설정하고 기존 Secrets Manager 인스턴스를 선택하십시오.
      10. 클러스터 이름 을 입력하고 VPC에 사용한 것과 동일한 리소스 그룹 을 선택하십시오.
      11. 이 학습서에서는 로깅 또는 모니터링이 필요하지 않습니다. 해당 옵션을 사용 안함으로 설정하고 작성을 클릭하십시오.
      12. 클러스터가 활성화되기를 기다리는 동안 퍼블릭 게이트웨이를 VPC에 연결하십시오. 가상 프라이빗 클라우드 로 이동하십시오.
      13. 클러스터에서 사용하는 VPC의 이름을 클릭하고 서브넷 섹션으로 스크롤하십시오.
      14. 이전에 작성된 서브넷의 이름을 클릭하고 Public Gateway 섹션에서 분리됨 을 클릭하여 상태를 연결됨으로 변경하십시오.
    • 다음 단계는 클래식 인프라에서 Kubernetes 에 대해 클래식 을 선택하는 경우입니다. 자세한 정보는 표준 클래식 클러스터 작성 문서를 참조하십시오.

      1. 위치 섹션에서 지역, 다중 구역 가용성메트로 (예: EuropeLondon) 를 선택하십시오.
      2. 작업자 구역 및 VLAN 에서 하나를 제외한 모든 구역을 선택 취소하십시오.
      3. 구역당 작업자 노드1 로 설정하고 특징 변경 을 클릭하여 탐색하고 선택한 작업자 노드 크기로 변경하십시오.
      4. 마스터 서비스 엔드포인트에서 개인용 및 공용 엔드포인트 모두를 선택하십시오.
      5. Ingress 아래에서 Ingress 시크릿 관리 를 사용으로 설정하고 기존 Secrets Manager 인스턴스를 선택하십시오.
      6. 클러스터 이름 을 입력하고 자원 그룹 을 선택하여 이러한 자원을 작성하십시오.
      7. 이 학습서에서는 로깅 또는 모니터링이 필요하지 않습니다. 해당 옵션을 사용 안함으로 설정하고 작성을 클릭하십시오.

샘플 애플리케이션 복제

이 섹션에서는 시작하기 위해 랜딩 페이지와 두 개의 엔드포인트가 있는 간단한 Helm NodeJS 샘플 애플리케이션을 사용하여 GitHub 복제합니다. 언제든지 요구 사항에 따라 샘플 애플리케이션을 확장할 수 있습니다.

  1. 터미널에서 아래 명령을 실행하여 GitHub 저장소를 복제하십시오.
    git clone https://github.com/IBM-Cloud/kubernetes-node-app
    
  2. 응용 프로그램 디렉토리로 변경:
    cd kubernetes-node-app
    

이 샘플 애플리케이션 코드에는 로컬 개발과 Kubernetes 배포에 필요한 모든 구성 파일이 포함되어 있습니다.

Helm 차트를 사용하여 클러스터에 애플리케이션 배치

Helm 3을 사용하여 애플리케이션 배치

애플리케이션의 컨테이너 이미지는 이미 빌드되어 IBM Cloud Container Registry 공개 레지스트리에 푸시되었습니다. 이 섹션에서는 Helm 사용하여 샘플 애플리케이션을 배포합니다. Helm을 사용하면 가장 복잡한 Kubernetes 애플리케이션의 정의, 설치 및 업그레이드도 지원하는 Helm Charts를 통해 Kubernetes 애플리케이션을 관리할 수 있습니다.

참고: 자체 컨테이너 레지스트리에 애플리케이션을 구축하고 푸시하려면 Docker 사용할 수 있습니다. 도커파일은 저장소에 제공되며, 이미지는 IBM Cloud Container Registry 또는 다른 컨테이너 레지스트리로 푸시할 수 있습니다.

  1. MYAPP 라는 환경 변수를 정의하고, 자리 표시자를 자신의 이니셜로 대체하여 애플리케이션의 이름을 설정합니다

    export MYAPP=<your-initials>kubenodeapp
    
  2. 클러스터를 식별하십시오.

    ibmcloud ks cluster ls
    
  3. 클러스터 이름으로 변수를 초기화합니다:

    export MYCLUSTER=<CLUSTER_NAME>
    
  4. kubectl 의 CLI 환경을 초기화합니다:

    ibmcloud ks cluster config --cluster $MYCLUSTER
    

    ibmcloud target -r <region> -g <resource_group> 를 사용하여 클러스터를 작성한 지역 및 리소스 그룹에 대해 CLI가 구성되어 있는지 확인하십시오. 클러스터에 대한 액세스 권한을 얻고 kubectl 명령 실행을 위해 CLI를 구성하는 데 대한 자세한 정보는 CLI 구성 절을 확인하십시오.

  5. default Kubernetes 네임스페이스를 사용하거나 이 애플리케이션에 대해 새 네임스페이스를 작성할 수 있습니다.

    1. default 의 Kubernetes 네임스페이스를 사용하려면 아래 명령을 실행하여 환경 변수를 설정하십시오
      export KUBERNETES_NAMESPACE=default
      
    2. 새 Kubernetes 네임스페이스를 작성하려면 Kubernetes 서비스 문서의 기본 이미지 풀 시크릿 복사선택한 네임스페이스의 Kubernetes 서비스 계정에 이미지 풀 시크릿 저장 절에 언급된 단계를 따르십시오. 완료되면 아래 명령을 실행하십시오
      export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
      
  6. 샘플 애플리케이션 디렉토리 아래의 차트 디렉토리로 변경하십시오

    cd chart/kubernetesnodeapp
    
  7. Helm 차트를 설치하십시오.

    helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
    
  8. 샘플 애플리케이션 디렉토리로 다시 변경하십시오.

    cd ../..
    

애플리케이션 보기

  1. 네임스페이스의 Kubernetes 서비스를 나열하십시오.
    kubectl get services -n $KUBERNETES_NAMESPACE
    
  2. 네임스페이스에 Kubernetes 포드를 나열합니다
    kubectl get pods -n $KUBERNETES_NAMESPACE
    

클러스터에 대해 IBM 제공 도메인 사용

클러스터에는 IBM 도메인이 함께 제공됩니다. 이는 표준 HTTP/S 포트에서 적절한 URL을 사용하여 애플리케이션을 노출하는 더 나은 옵션을 제공합니다.

Ingress를 사용하여 서비스에 대한 클러스터 인바운드 연결을 설정하십시오.

Ingress
Ingress

  1. IBM제공 Ingress 하위 도메인Ingress 시크릿을 식별하십시오.

    ibmcloud ks cluster get --cluster $MYCLUSTER
    

    다음 항목을 찾기 위해

    Ingress subdomain: mycluster.us-south.containers.appdomain.cloud
    Ingress secret:    mycluster
    
  2. Ingress 하위 도메인의 값을 보유하도록 환경 변수 INGRESS_SUBDOMAIN 를 정의하십시오.

    export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN>
    
  3. Ingress 시크릿의 값을 보유하도록 환경 변수 INGRESS_SECRET 를 정의하십시오.

    export INGRESS_SECRET=<INGRESS_SECRET>
    
  4. 샘플 애플리케이션 디렉토리에서 아래 bash 명령을 실행하여 HTTP 와 HTTPS 를 지원하는 IBM 도메인을 가리키는 Ingress 파일을 만듭니다 ingress-ibmsubdomain.yaml

    ./ingress.sh ibmsubdomain_https
    

    이 파일은 yaml-templates 폴더 아래의 템플릿 파일 ingress-ibmsubdomain-template.yaml 에서 생성되며, 자리 표시자( $ )로 감싸진 모든 값을 환경 변수의 적절한 값으로 대체합니다.

  5. Ingress를 배치하십시오.

    kubectl apply -f ingress-ibmsubdomain.yaml
    
  6. 브라우저에서 https://<myapp>.<ingress-subdomain>/ 에 접속하거나 아래 명령어를 실행하여 HTTP 확인하십시오

    curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
    

자체 사용자 정의 하위 도메인 사용

이 절에서는 사용자가 사용자 정의 도메인을 소유해야 합니다. 클러스터에 대해 IBM 진입 서브도메인을 가리키는 CNAME 레코드를 생성해야 합니다. 도메인이 example.com 인 경우 CNAME은 <myapp>.<ingress-subdomain> 를 가리키는 <myapp>.<example.com> 입니다.

HTTP 사용

  1. 사용자 정의 도메인을 가리키는 환경 변수를 생성합니다:
    export CUSTOM_DOMAIN=<example.com>
    
  2. 템플리트 파일 ingress-customdomain-http.yaml에서 도메인을 가르키는 Ingress 파일 ingress-customdomain-http-template.yaml을 작성하십시오.
    ./ingress.sh customdomain_http
    
  3. Ingress를 배치하십시오.
    kubectl apply -f ingress-customdomain-http.yaml
    
  4. http://<myapp>.<example.com>/에서 애플리케이션에 액세스하십시오.

HTTPS 사용

지금 https://<myapp>.example.com/(으)로 HTTPS를 사용하여 애플리케이션에 액세스하려 시도하는 경우에는 연결이 사설이 아님을 알리는 웹 브라우저의 보안 경고를 받을 가능성이 높습니다.

이제 이전에 클러스터에 구성한 Secrets Manager 인스턴스로 인증서를 가져오십시오.

  1. 보안아래의 리소스 목록 에서 Secrets Manager 서비스 인스턴스에 액세스하십시오.

  2. 왼쪽 탐색에서 시크릿을 클릭하십시오.

  3. 추가 를 클릭하십시오.

  4. 공용 인증서, 가져온 인증서 또는 개인용 인증서를 선택할 수 있습니다. 각 문서 주제 SSL/TLS 공용 인증서 주문, SSL/TLS 인증서 가져오기 또는 SSL/TLS 개인용 인증서 작성 에서 자세한 단계를 사용할 수 있습니다. 인증서를 가져오도록 선택한 경우 인증서, 개인 키 및 중간 인증서 파일을 업로드해야 합니다.

  5. 가져온 인증서 또는 주문된 인증서에 대한 항목을 찾아 클릭하십시오.

    • 도메인 이름이 $CUSTOM_DOMAIN과 일치하는지 확인하십시오. 와일드카드 인증서를 업로드한 경우에는 도메인 이름에 별표가 포함됩니다.
    • 인증서의 CRN 옆에 있는 복사 아이콘을 클릭합니다.
    • 방금 복사한 값을 가리키는 환경 변수를 작성하십시오.
    export CERTIFICATE_CRN=<certificate CRN>
    
  6. 클러스터에서 SSL/TLS 인증서에 대한 Ingress 시크릿을 작성하십시오.

    ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE
    
  7. 사용자 정의 도메인을 가리키는 환경 변수를 생성합니다:

    export CUSTOM_DOMAIN=<example.com>
    
  8. 템플릿 ingress-customdomain-https-template-sm.yaml 에서 도메인을 가리키는 인그레스 파일 ingress-customdomain-https.yaml 을 만듭니다

    ./ingress.sh customdomain_https_sm
    
  9. Ingress를 배치하십시오.

    kubectl apply -f ingress-customdomain-https.yaml
    
  10. https://$MYAPP.$CUSTOM_DOMAIN/에서 애플리케이션에 액세스하십시오.

curl -I https://$MYAPP.$CUSTOM_DOMAIN

애플리케이션 상태 모니터

  1. 애플리케이션의 상태를 확인하려면 클러스터로 이동하여 클러스터 목록을 확인한 후 클러스터를 클릭하십시오.
  2. Kubernetes 대시보드를 클릭하여 새 탭에서 대시보드를 실행하십시오.
  3. 왼쪽에서 팟 (Pod) 을 클릭한 후 $MYAPP와 일치하는 pod-name 을 클릭하십시오.
    • CPU및 메모리 사용량을 검사하십시오.
    • 노드 IP 이름을 기록해 두십시오.
    • 애플리케이션의 표준 출력 및 오류를 보려면 오른쪽 상단에 있는 조치 메뉴에서 로그 보기 를 클릭하십시오.
  4. 왼쪽 창에서 노드를 선택하고, 앞서 언급한 노드의 이름을 클릭한 다음, 할당된 자원을 확인하여 노드의 상태를 확인합니다.
  5. 컨테이너로 실행하려면 조치 메뉴에서 실행 위치를 선택하십시오.

Kubernetes 팟(Pod) 스케일링

애플리케이션에서 로드가 증가함에 따라 배치에서 팟(Pod) 복제본 수를 수동으로 늘릴 수 있습니다. 복제본은 ReplicaSet에 의해 관리됩니다. 애플리케이션을 두 개의 복제본으로 스케일링하려면 다음 명령을 실행하십시오.

kubectl scale deployment kubernetesnodeapp-deployment --replicas=2

잠시 후, Kubernetes (또는 kubectl get pods )에 애플리케이션에 대한 두 개의 포드가 표시될 것입니다. 클러스터의 인그레스 컨트롤러가 두 개의 복제본 사이의 부하 분산을 처리합니다.

Kubernetes 사용하면 수평적 포드 자동 확장 기능을 활성화하여 CPU에 따라 앱의 인스턴스 수를 자동으로 늘리거나 줄일 수 있습니다.

autoscaler를 작성하고 정책을 정의하려면 아래 명령을 실행하십시오.

kubectl autoscale deployment kubernetesnodeapp-deployment --cpu-percent=5 --min=1 --max=5

자동 스케일러가 성공적으로 생성되면 다음과 같은 내용이 표시됩니다 horizontalpodautoscaler.autoscaling/<deployment-name> autoscaled.

자원 제거

  • 수평 팟 (Pod) 오토스케일러를 삭제하십시오.

    kubectl delete horizontalpodautoscaler.autoscaling/kubernetesnodeapp-deployment
    
  • 적용된 리소스를 삭제하십시오.

    kubectl delete -f ingress-customdomain-https.yaml
    kubectl delete -f ingress-customdomain-http.yaml
    kubectl delete -f ingress-ibmsubdomain.yaml
    
  • 이 애플리케이션에 대해 작성된 Kubernetes 아티팩트를 삭제하십시오.

    helm uninstall $MYAPP --namespace $KUBERNETES_NAMESPACE
    
  • Kubernetes 시크릿을 삭제하십시오.

    kubectl -n $KUBERNETES_NAMESPACE delete secret kubernetesnodeapp-api-key
    
  • External Secrets Operator를 삭제하십시오.

    helm uninstall external-secrets
    
  • 서비스 ID를 삭제하십시오.

    ibmcloud iam service-id-delete $SERVICE_ID
    
  • 클러스터를 삭제하십시오.

관련 컨텐츠