IBM Cloud Internet Services를 사용하여 강한 복원성과 보안을 갖춘 다중 지역 Kubernetes 클러스터

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

복원성을 고려하여 애플리케이션이 디자인된 경우에는 사용자가 작동중단시간을 경험할 가능성이 적어집니다. Kubernetes Service를 사용하여 솔루션을 구현하면 로드 밸런싱 및 격리, 호스트, 네트워크 또는 앱의 잠재적 장애에 대한 복원성 향상 등의 기본 제공 기능의 혜택을 받습니다. 여러 클러스터를 생성하여 한 클러스터에서 중단이 발생하더라도 사용자는 다른 클러스터에도 배포된 앱에 계속 액세스할 수 있습니다. 여러 위치에 여러 클러스터가 있는 경우 사용자는 가장 가까운 클러스터에 액세스하여 네트워크 지연 시간을 줄일 수 있습니다. 추가적인 복원력을 위해 다중 영역 클러스터를 선택할 수도 있습니다. 즉, 한 위치 내의 여러 영역에 노드를 배포할 수 있습니다.

이 튜토리얼에서는 인터넷 애플리케이션을 위한 도메인 이름 시스템(DNS), 글로벌 부하 분산(GLB), 웹 애플리케이션 방화벽(WAF), 분산 서비스 거부( DDoS )에 대한 보호를 구성 및 관리하는 단일 플랫폼인 Cloud Internet Services (CIS) 을 Kubernetes 클러스터와 통합하여 이 시나리오를 지원하고 여러 위치에 걸쳐 안전하고 탄력적인 솔루션을 제공할 수 있는 방법을 중점적으로 설명합니다.

목표

  • 서로 다른 위치에 있는 여러 Kubernetes 클러스터에 애플리케이션을 배포합니다.
  • 글로벌 로드 밸런서를 사용하여 여러 클러스터에 트래픽을 분산하세요.
  • 가장 가까운 클러스터로 사용자를 라우팅합니다.
  • 보안 위협으로부터 애플리케이션을 보호합니다.
  • 캐싱을 사용하여 애플리케이션 성능을 향상시킵니다.

*
아키텍처 다이어그램 *

  1. 개발자는 애플리케이션에 대한 Docker 이미지를 빌드합니다.
  2. 이미지가 Container Registry 로 푸시됩니다.
  3. 애플리케이션은 댈러스 및 런던의 Kubernetes 클러스터에 배치됩니다.
  4. 일반 사용자가 애플리케이션에 액세스합니다.
  5. IBM Cloud Internet Services는 애플리케이션에 대한 요청을 인터셉트하고 로드를 클러스터 전체에 분배하도록 구성됩니다. 일반적인 위협으로부터 애플리케이션을 보호하기 위해 DDoS 보호 및 Web Application Firewall 또한 사용으로 설정됩니다. 선택적으로 이미지, CSS 파일과 같은 자산이 캐시됩니다.

시작하기 전에

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

  • IBM Cloud CLI
    • IBM Cloud Kubernetes Service 플러그인(kubernetes-service)
  • kubectl: Kubernetes 클러스터와 상호작용함

솔루션 시작하기 튜토리얼 가이드에서 운영 환경에 맞는 도구를 다운로드하고 설치하는 방법을 확인할 수 있습니다.

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

  • IBM Cloud Internet Services 이름 서버를 가리키도록 이 도메인에 대한 DNS를 구성할 수 있도록 사용자 정의 도메인을 소유하십시오.
  • 그리고 Kubernetes의 기본 사항을 이해하십시오.

하나의 위치에 애플리케이션 배치

이 튜토리얼에서는 여러 위치의 클러스터에 Kubernetes 애플리케이션을 배포합니다. 먼저 댈러스에서 배치를 시작한 후 런던에 대해 이러한 단계를 반복합니다.

Kubernetes 클러스터 작성

이 튜토리얼에서는 하나의(1) 영역, 하나의(1) 워커 노드가 있는 최소한의 클러스터로 충분합니다.

다음 Kubernetes 클러스터를 작성할 때:

  1. 클러스터 이름my-us-cluster로 설정하십시오.

  2. 북미댈러스에서 찾으십시오.

  3. Kubernetes 클러스터를 열고 클러스터 만들기를 클릭합니다.

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

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

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

클러스터가 준비되는 동안 애플리케이션을 준비하십시오.

애플리케이션을 Kubernetes 클러스터에 배치

클러스터를 준비해야 합니다. 해당 상태는 Kubernetes Service 콘솔에서 확인할 수 있습니다.

  1. 클러스터의 액세스 탭에 설명된 대로 클러스터에 액세스하십시오. 다음과 같습니다.

    MYCLUSTER=my-us-cluster
    ibmcloud ks cluster config --cluster $MYCLUSTER
    
  2. 애플리케이션의 사전 빌드된 이미지를 사용하여 배치를 작성하십시오. 애플리케이션 소스 코드는 이 GitHub 저장소에서 찾을 수 있습니다.

    kubectl create deploy hello-world-deployment --image=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
    

    출력 예: deployment "hello-world-deployment" created.

  3. 서비스를 작성하여 클러스터 내에서 애플리케이션에 액세스할 수 있도록 하십시오.

    kubectl expose deployment/hello-world-deployment --type=ClusterIP --port=80 --name=hello-world-service --target-port=3000
    

    이는 service "hello-world-service" exposed와 같은 메시지를 리턴합니다. 서비스를 보려면 다음을 수행하십시오.

    kubectl get services
    
  4. 복제본을 둘로 설정하여 클러스터의 애플리케이션을 실행하십시오.

    kubectl scale deployment hello-world-deployment --replicas=2
    
  5. 다음 명령을 사용하여 배치 상태를 확인할 수 있습니다.

    kubectl get pods
    

클러스터에 지정된 Ingress 하위 도메인 가져오기

Kubernetes 클러스터가 생성되면 인그레스 하위 도메인(예를 들어, my-us-cluster.us-south.containers.appdomain.cloud )과 공용 애플리케이션 로드 밸런서 IP 주소가 할당됩니다.

  1. 클러스터의 Ingress 하위 도메인을 검색하십시오.
    ibmcloud ks cluster get --cluster $MYCLUSTER
    
    Ingress Subdomain 값을 찾으십시오.
  2. 나중 단계를 위해 이 정보를 기록해 두십시오.

이 튜토리얼에서는 Ingress 하위 도메인을 사용하여 글로벌 로드 밸런서를 구성합니다. Ingress 하위 도메인을 클러스터의 공용 ALB(Application Load Balancer)로 대체할 수도 있습니다. <IngressSubdomain> 은 다음과 같습니다 my-us-cluster-e7f2ca73139645ddf61a8702003a483a-0000.us-south.containers.appdomain.cloud

DNS 하위 도메인에 대한 Ingress 구성

자체 DNS 도메인 이름이 필요하며 다음 작업에서 글로벌 로드 밸런서 하위 도메인이 생성됩니다: <glb_name>.<your_domain_name>. hello-world-service.example.com <glb_name> = hello-world-service<your_domain_name> = example.com

  1. 파일 glb-ingress.yaml을 작성하고 플레이스홀더를 각각의 값으로 바꾸십시오.
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
     name: <glb-name>
     annotations:
       spec.ingressClassName: "public-iks-k8s-nginx"
    spec:
     rules:
     - host: <glb-name>.<your_domain_name>
       http:
         paths:
         - path: /
           pathType: Prefix
           backend:
             service:
               name: hello-world-service
               port:
                 number: 80
    
  2. Ingress 인스턴스를 추가하십시오.
    kubectl apply -f glb-ingress.yaml
    
    명령의 ADDRESS 열에 있는 값에 표시된 대로 Ingress가 사용 가능하게 될 때까지 몇 분 정도 걸릴 수 있습니다.
    kubectl get ingress
    
  3. 이제 자신의 DNS 하위 도메인 이름으로 curl Host http 헤더를 구성해 <IngressSubdomain>의 기본값을 대체하여 테스트를 수행하십시오.
    curl --header 'Host: <glb_name>.<your_domain_name>' <IngressSubdomain>/hostname
    
    Curl 명령은 다음과 같이 표시됩니다: curl --header 'Host: hello-world-service.ibmom.com' my-us-cluster-e7f2ca73139645ddf61a8702003a483a-0000.us-south.containers.appdomain.cloud/hostname

다른 위치 구성

다음 대체 항목을 사용하여 런던 위치에 대해 이전 단계를 반복하십시오.

다중 위치 로드 밸런싱 구성

애플리케이션이 이제 두 클러스터에서 실행되지만 사용자가 하나의 시작점에서 두 클러스터에 투명하게 액세스하기 위해서는 한 컴포넌트가 누락되어 있습니다.

이 섹션에서는 IBM Cloud Internet Services ( CIS )를 구성하여 두 클러스터 간에 부하를 분산합니다. CIS 는 클라우드 애플리케이션의 안정성과 성능을 보장하면서 애플리케이션을 보호하기 위해 글로벌 로드 밸런서(GLB), 캐싱, 웹 애플리케이션 방화벽(WAF)페이지 규칙을 제공하는 원스톱 쇼핑 서비스입니다.

글로벌 로드 밸런서를 구성하려면 다음 항목이 필요합니다.

  • 사용자 정의 도메인이 CIS 이름 서버를 가리켜야 함
  • Kubernetes 클러스터의 Ingress 하위 도메인을 검색해야 함
  • 애플리케이션의 가용성을 유효성 검증하기 위한 상태 확인을 구성해야 함
  • 클러스터를 가리키는 오리진 풀을 정의해야 함

IBM Cloud Internet Services를 사용하여 사용자 정의 도메인 등록

첫 번째 단계는 CIS의 인스턴스를 작성하고 사용자 정의 도메인이 CIS 이름 서버를 가리키도록 하는 것입니다.

  1. 도메인을 소유하지 않은 경우 등록기관에서 도메인을 구매할 수 있습니다.

  2. IBM Cloud 카탈로그에서 IBM Cloud Internet Services 으로 이동하십시오.

  3. 플랜을 선택하고 서비스 이름 및 리소스 그룹을 설정한 후 작성 을 클릭하여 서비스의 인스턴스를 작성하십시오.

  4. 서비스 인스턴스가 프로비저닝되고 나면 도메인 추가를 클릭하십시오.

  5. 도메인 이름을 입력하고 다음을 클릭하십시오.

  6. DNS 레코드 설정은 선택적 단계이며 이 학습서에서는 건너뛸 수 있습니다. 다음을 클릭하십시오.

  7. 이름 서버가 지정되면 나열된 이름 서버를 사용하도록 등록 담당자 또는 도메인 이름 제공자를 구성하십시오.

  8. 이 시점에서 취소를 클릭하여 기본 페이지로 돌아갈 수 있으며, 등록자 또는 DNS 제공자를 구성한 후 변경사항이 적용되려면 최대 24시간이 필요할 수 있습니다.

    개요 페이지의 도메인 상태가 보류 중에서 활성으로 변경되면 dig <your_domain_name> ns 명령을 사용하여 새 이름 서버가 적용되었는지 확인할 수 있습니다.

글로벌 로드 밸런서에 대한 상태 확인 구성

상태 확인은 설정된 간격으로 오리진 풀의 HTTP/HTTPS 요청에 대한 응답을 모니터합니다. 풀이 여전히 올바르게 실행 중인지 판별하기 위해 오리진 풀과 함께 사용됩니다.

  1. IBM Cloud Internet Services 대시보드에서 탐색 메뉴를 사용하여 안정성 > 글로벌 로드 밸런서를 선택합니다.

  2. 상태 확인 탭을 선택하고 작성을 클릭하십시오.

    1. 이름hello-world-service로 설정하십시오.
    2. 모니터 유형HTTP로 설정하십시오.
    3. 포트80으로 설정하십시오.
    4. 경로를 **/**로 설정하십시오.
    5. **요청 헤더 구성(선택사항)**에서 헤더 이름: Host 및 값: <glb_name>.<your_domain_name>을(를) 추가하십시오.
    6. 작성을 클릭하십시오.

    자신의 고유 애플리케이션을 빌드할 때는 애플리케이션 상태를 보고하는 /heathz와 같은 전용 상태 엔드포인트를 정의할 수 있습니다.

오리진 풀 정의

풀은 GLB에 연결된 경우 트래픽이 지능적으로 라우팅되는 오리진 서버의 그룹입니다. 영국과 미국의 클러스터를 사용하는 경우에는 위치 기반 풀을 정의하고 사용자 요청의 지리적 위치에 따라 가장 가까운 클러스터로 사용자를 경로 재지정하도록 CIS를 구성할 수 있습니다.

댈러스에 있는 클러스터에 대한 하나의 풀 작성

  1. 오리진 풀 탭을 선택하고 작성을 클릭하십시오.
  2. 이름을 US 으로 설정합니다.
  3. 원점 이름us-cluster(으)로 설정하십시오.
  4. 미국 클러스터에 대해 ibmcloud ks cluster get --cluster $MYCLUSTER 에서 인쇄한 kubernetes 서비스 <IngressSubdomain>오리진 주소 를 설정하십시오.
  5. 상태 확인을 이전 섹션에서 생성한 것으로 설정합니다.
  6. 상태 확인 지역을 Western North America 로 설정합니다.
  7. 저장 을 클릭하십시오.

런던에 있는 클러스터에 대한 하나의 풀 작성

  1. 오리진 풀 탭을 선택하고 작성을 클릭하십시오.
  2. 이름을 UK 으로 설정합니다.
  3. 원점 이름uk-cluster(으)로 설정하십시오.
  4. 오리진 주소 를 영국 클러스터에 대해 ibmcloud ks cluster get --cluster $MYCLUSTER 에서 인쇄한 kubernetes 서비스 <IngressSubdomain> 로 설정하십시오.
  5. 상태 확인을 이전 섹션에서 생성한 것으로 설정합니다.
  6. 상태 확인 지역을 Western Europe 로 설정합니다.
  7. 저장 을 클릭하십시오.

글로벌 로드 밸런서 작성

오리진 풀이 정의되었으면 로드 밸런서의 구성을 완료할 수 있습니다.

  1. 로드 밸런서 탭을 선택하고 작성을 클릭하십시오.

  2. 글로벌 로드 밸런서에 대한 이름 아래에 이름 <glb_name>을(를) 입력하십시오. 또한 이 이름은 위치에 관계없이 유니버셜 애플리케이션 URL(http://<glb_name>.<your_domain_name>)의 일부가 됩니다.

  3. 지리적 경로에서 경로 추가를 클릭합니다.

    1. 지역 드롭다운에서 기본값을 선택합니다.
    2. 미국 풀을 선택합니다.
    3. 추가 를 클릭하십시오.

    프로세스를 반복하여 다음을 작성하십시오.

    작성할 지리적 라우트 목록
    지역 오리진 풀
    기본 미국
    서유럽 영국
    동유럽 영국
    북동 아시아 영국
    남동 아시아 영국
    서부 북미 미국
    동부 북미 미국

    이 구성에서 유럽 및 아시아의 사용자는 런던의 클러스터로 경로 재지정되고 미국의 사용자는 댈러스 클러스터로 경로 재지정됩니다. 요청이 정의된 경로 중 어느 것과도 일치하지 않으면 기본 지역의 풀로 리디렉션됩니다.

  4. 작성을 클릭하십시오.

이 단계에서는 여러 위치에 걸쳐 Kubernetes 클러스터를 사용하여 글로벌 로드 밸런서를 성공적으로 구성했습니다. GLB URL http://<glb_name>.<your_domain_name>/hostname에 액세스하여 애플리케이션을 볼 수 있습니다. 사용자는 자신의 위치에 따라 가장 가까운 클러스터로 경로 재지정되며, CIS가 사용자의 IP 주소를 특정 위치로 맵핑할 수 없는 경우에는 기본 풀의 클러스터로 경로 재지정됩니다.

애플리케이션 보안

Web Application Firewall 켜기

WAF(Web Application Firewall)는 ISO 계층 7 공격에 대해 웹 애플리케이션을 보호합니다. 보통 이는 그룹화된 규칙 세트와 결합되며, 이러한 규칙 세트는 악성 트래픽을 필터링하여 애플리케이션을 취약성으로부터 보호하는 것을 목표로 합니다.

  1. IBM Cloud Internet Services 대시보드에서 보안으로 이동한 후 WAF로 이동하십시오.
  2. WAF가 켜짐 상태인지 확인하십시오.
  3. OWASP 규칙 세트를 클릭하십시오. 이 페이지에서는 OWASP 핵심 규칙 세트를 검토하고 각 규칙을 개별적으로 사용 또는 사용 안함으로 설정할 수 있습니다. 특정 규칙이 사용으로 설정되면 수신 요청이 해당 규칙을 트리거하는 경우 글로벌 위협 점수가 증가합니다. 요청에 대한 조치의 트리거 여부는 민감도 설정에 의해 결정됩니다.
    1. 기본 OWASP 규칙 세트를 그대로 두십시오.
    2. 민감도Low로 설정하십시오.
    3. 조치Simulate로 설정하여 모든 이벤트를 로깅하십시오.
  4. CIS 규칙 세트를 클릭하십시오. 이 페이지는 웹 사이트 호스팅을 위한 일반적인 기술 스택을 기반으로 하여 빌드된 추가 규칙을 보여줍니다.

HTTPS 로 보안 연결하려면 Let's Encrypt에서 인증서를 받거나 IBM Cloud Secrets Manager.

성능 향상 및 서비스 거부(DoS) 공격에 대한 보호

분산 서비스 거부(DDoS) 공격은 대량의 인터넷 트래픽으로 대상 또는 그 주변의 인프라를 압도하여 서버, 서비스 또는 네트워크의 정상 트래픽을 방해하려는 악의적인 시도입니다. CIS은(는) DDoS로부터 도메인을 보호할 수 있는 기능을 갖추고 있습니다.

  1. CIS 대시보드에서 신뢰성 > 글로벌 로드 밸런서를 선택하십시오.

  2. 로드 밸런서 테이블에서 작성한 GLB를 찾으십시오.

  3. 프록시 열에서 보안 및 성능 기능을 사용으로 설정하십시오.

    CIS 프록시 토글 ON
    CIS 프록시 토글 ON

사용자의 GLB가 이제 보호됩니다. 즉각적인 이점은 클러스터의 오리진 IP 주소가 클라이언트로부터 숨겨진다는 것입니다. CIS가 수신 요청에 대한 위협을 발견하는 경우 사용자가 애플리케이션으로 경로 재지정되기 전에 사용자에게 다음과 같은 화면이 표시될 수 있습니다.

확인- DDoS 보호
확인- DDoS 보호

또한 이제 CIS가 캐시하는 컨텐츠와 캐시 기간을 제어할 수 있습니다. 글로벌 캐싱 레벨 및 브라우저 만기를 정의하려면 성능 > 캐싱으로 이동하십시오. 페이지 규칙으로 글로벌 보안 및 캐싱 규칙을 사용자 정의할 수 있습니다. 페이지 규칙은 특정 도메인 경로를 사용하여 세분화된 구성을 가능하게 합니다. 페이지 규칙의 예를 들면, 다음과 같이 /assets 아래에 있는 모든 컨텐츠를 3일 동안 캐시하도록 할 수 있습니다.

페이지 규칙
페이지 규칙

자원 제거

Kubernetes 클러스터 리소스 제거

  1. Ingress를 제거하십시오. 다음 명령을 실행하여 제거할 수 있습니다.
    kubectl delete -f glb-ingress.yaml
    
  2. 다음 명령을 실행하여 서비스를 제거할 수 있습니다.
    kubectl delete service hello-world-service
    
  3. 배치를 제거하십시오. 다음 명령을 실행하여 이를 수행할 수 있습니다.
    kubectl delete deployment hello-world-deployment
    
  4. 이 튜토리얼을 위해 클러스터를 작성한 경우에는 이를 삭제하십시오.

CIS 리소스 제거

  1. GLB를 제거하십시오.
  2. 오리진 풀을 제거하십시오.
  3. 상태 확인을 제거하십시오.
  4. 사용자 정의 도메인의 DNS를 업데이트하십시오.
  5. 이 튜토리얼을 위해 특별히 만든 경우 CIS 인스턴스를 삭제합니다.

관련 컨텐츠