AKS 호스팅 애플리케이션을 사용하여 Azure Cache for Redis Enterprise 또는 Azure Managed Redis 활성 복제 사용 시작

이 자습서에서는 AKS(Azure Kubernetes Service)에서 인벤토리 애플리케이션을 호스트하고 활성 지역 복제를 사용하여 Azure 지역 간 Azure Cache for Redis Enterprise 또는 Azure Managed Redis 인스턴스에서 데이터를 복제하는 방법을 알아봅니다.

필수 조건

  • Azure 구독. Azure 구독이 없는 경우 무료 계정을 만드세요.
  • 하나의 Azure Kubernetes Service 클러스터 - 클러스터 만들기에 대한 자세한 내용은 빠른 시작: Azure Portal을 사용하여 AKS(Azure Kubernetes Service) 클러스터 배포를 참조하세요. 또는 서로 다른 두 AKS 클러스터에서 데모 애플리케이션의 두 인스턴스를 호스트할 수 있습니다. 프로덕션 환경에서는 클러스터와 동일한 지역에 있는 두 개의 서로 다른 클러스터를 사용하여 두 가지 버전의 애플리케이션을 배포합니다. 이 자습서에서는 동일한 AKS 클러스터에 애플리케이션의 두 인스턴스를 배포합니다.

중요합니다

이 자습서에서는 컨테이너, Pod 및 서비스와 같은 기본 Kubernetes 개념에 익숙하다고 가정합니다.

개요

이 자습서에서는 세 가지 다른 티셔츠 옵션을 보여 주는 샘플 인벤토리 페이지를 사용합니다. 사용자는 각 티셔츠를 "구매"하고 인벤토리 드롭을 볼 수 있습니다. 이 데모의 고유한 점은 서로 다른 두 지역에서 인벤토리 앱을 실행한다는 것입니다. 일반적으로 일관성 문제가 없도록 단일 지역에 인벤토리 데이터를 저장하는 데이터베이스를 실행해야 합니다. 다른 데이터베이스 백 엔드 및 동기화를 사용하면 여러 Azure 지역에서의 호출 대기 시간이 길어 고객에게 불쾌한 환경이 발생할 수 있습니다. Azure Cache for Redis Enterprise를 백 엔드로 사용하는 경우 두 캐시를 활성 지역 복제와 함께 연결하여 동일한 지역의 Redis Enterprise에서 짧은 대기 시간 성능을 즐기면서 두 지역에서 인벤토리가 일관되게 유지되도록 할 수 있습니다.

두 개의 Azure Redis 인스턴스 설정

  1. Azure Portal 또는 선호하는 CLI 도구를 사용하여 미국 서부 2 지역에 새 Azure Cache for Redis Enterprise 또는 Azure Managed Redis 인스턴스를 만듭니다. 또는 원하는 모든 지역을 사용할 수 있습니다. 빠른 시작 가이드를 사용하여 시작합니다.

  2. 고급 탭에서 다음을 수행합니다.

    1. TLS가 아닌 액세스만 사용하도록 설정합니다.
    2. 클러스터링 정책을엔터프라이즈로 설정
    3. 이 가이드를 사용하여 새 활성 지역 복제 그룹을 구성합니다. 결국 동일한 복제 그룹에 두 캐시를 추가합니다. 첫 번째 캐시를 사용하여 그룹 이름을 만들고 두 번째 캐시를 동일한 그룹에 추가합니다.

    중요합니다

    이 자습서에서는 데모에 TLS가 아닌 포트를 사용하지만 프로덕션 환경에서는 TLS 포트를 사용하는 것이 좋습니다.

  3. 첫 번째 캐시와 동일한 구성을 사용하여 미국 동부 지역에 다른 Azure Cache for Redis Enterprise를 설정합니다. 또는 원하는 모든 지역을 사용할 수 있습니다. 첫 번째 캐시와 동일한 복제 그룹을 선택해야 합니다.

Kubernetes 배포 파일 준비

다음 절차를 사용하여 두 개의 .yml 파일을 만듭니다. 두 지역에서 만든 각 캐시에 대해 하나의 파일입니다.

지역 간 데이터 복제를 보여주기 위해 서로 다른 지역에서 동일한 애플리케이션의 두 인스턴스를 실행합니다. 한 인스턴스를 시애틀, 서부 네임스페이스에서 실행하고 두 번째 인스턴스는 뉴욕 동부 네임스페이스에서 실행해 보겠습니다.

서부 네임스페이스

다음 YAML 파일에서 다음 필드를 업데이트하고 app_west.yaml로 저장합니다.

  1. 포트 접미사를 제거한 후 REDIS_HOST URL로 변수 업데이트: 10000
  2. REDIS_PASSWORD미국 서부 2 캐시의 액세스 키로 업데이트합니다.
  3. 이 애플리케이션 인스턴스가 실행 중인 지역을 표시하도록 업데이트 APP_LOCATION 합니다. 이 캐시를 위해 APP_LOCATION을(를) Seattle로 설정하여 이 애플리케이션 인스턴스가 시애틀에서 실행 중임을 나타내도록 합니다.
  4. 변수 namespace 값이 west 파일의 두 위치에 있는지 확인합니다.

다음 코드와 같이 표시됩니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: shoppingcart-app
  namespace: west
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: shoppingcart
  template:
    metadata:
      labels:
        app: shoppingcart
    spec:
      containers:
      - name: demoapp
        image: mcr.microsoft.com/azure-redis-cache/redisactivereplicationdemo:latest
        resources:
          limits:
            cpu: "0.5"
            memory: "250Mi"
          requests:
            cpu: "0.5"
            memory: "128Mi"
        env:
         - name: REDIS_HOST
           value: "DemoWest.westus2.redisenterprise.cache.azure.net"
         - name: REDIS_PASSWORD
           value: "myaccesskey"
         - name: REDIS_PORT
           value: "10000"   # redis enterprise port
         - name: HTTP_PORT
           value: "8080"
         - name: APP_LOCATION
           value: "Seattle, WA" 
---
apiVersion: v1
kind: Service
metadata:
  name: shoppingcart-svc
  namespace: west
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: shoppingcart

동부 네임스페이스

app_east.yaml과 동일한 YAML 파일의 다른 복사본을 저장합니다. 이번에는 두 번째 캐시에 해당하는 값을 사용합니다.

  1. 포트 접미사를 제거한 후 REDIS_HOST으로 변수 업데이트: 10000
  2. REDIS_PASSWORD미국 동부 캐시의 액세스 키로 업데이트합니다.
  3. 이 애플리케이션 인스턴스가 실행 중인 지역을 표시하도록 업데이트 APP_LOCATION 합니다. 이 캐시의 경우 이 애플리케이션 인스턴스가 APP_LOCATION 뉴욕에서 실행 중임을 나타내도록 뉴욕 으로 구성합니다.
  4. 변수 namespace 값이 east 파일의 두 위치에 있는지 확인합니다.

다음 코드와 같이 표시됩니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: shoppingcart-app
  namespace: east
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: shoppingcart
  template:
    metadata:
      labels:
        app: shoppingcart
    spec:
      containers:
      - name: demoapp
        image: mcr.microsoft.com/azure-redis-cache/redisactivereplicationdemo:latest
        resources:
          limits:
            cpu: "0.5"
            memory: "250Mi"
          requests:
            cpu: "0.5"
            memory: "128Mi"
        env:
         - name: REDIS_HOST
           value: "DemoEast.eastus.redisenterprise.cache.azure.net"
         - name: REDIS_PASSWORD
           value: "myaccesskey"
         - name: REDIS_PORT
           value: "10000"   # redis enterprise port
         - name: HTTP_PORT
           value: "8080"
         - name: APP_LOCATION
           value: "New York, NY" 
---
apiVersion: v1
kind: Service
metadata:
  name: shoppingcart-svc
  namespace: east
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: shoppingcart

Kubernetes CLI 설치 및 AKS 클러스터에 연결

이 섹션에서는 먼저 Kubernetes CLI를 설치한 다음 AKS 클러스터에 연결합니다.

비고

이 자습서에는 Azure Kubernetes Service 클러스터가 필요합니다. 동일한 AKS 클러스터에 애플리케이션의 두 인스턴스를 배포합니다.

Kubernetes CLI 설치

_kubectl Kubernetes CLI를 사용하여 로컬 컴퓨터에서 Kubernetes 클러스터에 연결합니다. 로컬로 실행하는 경우 다음 명령을 사용하여 kubectl을 설치할 수 있습니다.

az aks install-cli

Azure Cloud Shell을 사용하는 경우 kubectl 이 이미 설치되어 있으며 이 단계를 건너뛸 수 있습니다.

두 지역의 AKS 클러스터에 연결

포털을 사용하여 미국 서부 2 지역의 AKS 클러스터에 대한 리소스 그룹 및 클러스터 이름을 복사합니다. AKS 클러스터에 연결하도록 kubectl 을 구성하려면 리소스 그룹 및 클러스터 이름과 함께 다음 명령을 사용합니다.

 az aks get-credentials --resource-group myResourceGroup --name myClusterName

다음 명령을 실행하여 클러스터에 연결할 수 있는지 확인합니다.


kubectl get nodes

클러스터 노드 목록을 보여 주는 유사한 출력이 표시됩니다.

NAME                                STATUS   ROLES   AGE   VERSION
aks-agentpool-21274953-vmss000001   Ready    agent   1d    v1.24.15
aks-agentpool-21274953-vmss000003   Ready    agent   1d    v1.24.15
aks-agentpool-21274953-vmss000006   Ready    agent   1d    v1.24.15

애플리케이션 배포 및 테스트

AKS 클러스터에서 애플리케이션을 실행하려면 두 개의 네임스페이스가 필요합니다. 서부 지역을 설정한 다음 애플리케이션을 배포합니다.

다음 명령을 실행하여 서부 네임스페이스의 AKS 클러스터에 애플리케이션 인스턴스를 배포합니다.

kubectl create namespace west

kubectl apply -f app_west.yaml

배포 및 서비스가 생성되었음을 나타내는 응답이 표시됩니다.

deployment.apps/shoppingcart-app created
service/shoppingcart-svc created

애플리케이션을 테스트하려면 다음 명령을 실행하여 Pod가 실행 중인지 확인합니다.

kubectl get pods -n west

다음과 같이 Pod가 성공적으로 실행되는 것을 볼 수 있습니다.

NAME                                READY   STATUS                       RESTARTS   AGE
shoppingcart-app-5fffdcb5cd-48bl5   1/1     Running                      0          68s

다음 명령을 실행하여 애플리케이션에 대한 엔드포인트를 가져옵니다.

kubectl get service -n west

EXTERNAL-IP 몇 분 동안 상태가 <pending> 있는 것을 볼 수 있습니다. 상태가 IP 주소로 변경될 때까지 계속 시도하십시오.

NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
shoppingcart-svc       LoadBalancer   10.0.166.147   20.69.136.105   80:30390/TCP   90s

External-IP 사용할 수 있게 되면 웹 브라우저를 서비스의 External-IP 주소로 열고 애플리케이션이 표시됩니다.

동일한 배포 단계를 실행하고 데모 애플리케이션의 인스턴스를 배포하여 미국 동부 지역에서 실행합니다.

kubectl create namespace east

kubectl apply -f app_east.yml

kubectl get pods -n east

kubectl get service -n east

각 두 서비스가 브라우저에서 열리면 한 지역의 인벤토리 변경이 다른 지역에 거의 즉시 반영되는 것을 볼 수 있습니다. 인벤토리 데이터는 지역 간에 데이터를 복제하는 Redis Enterprise 인스턴스에 저장됩니다.

잘하셨습니다! 단추를 클릭하고 데모를 탐색합니다.

동일한 데이터를 보여 주는 서로 다른 지역에서 실행 중인 쇼핑 카트 앱이 있는 일치하는 두 브라우저의 스크린샷

개수를 다시 설정하려면 URL 뒤를 추가 /reset 합니다.

<IP address>/reset

배포 정리

클러스터를 정리하려면 다음 명령을 실행합니다.

kubectl delete deployment shoppingcart-app -n west
kubectl delete service shoppingcart-svc -n west

kubectl delete deployment shoppingcart-app -n east
kubectl delete service shoppingcart-svc -n east

자원을 정리하세요

이 문서에서 만든 리소스를 계속 사용하려면 리소스 그룹을 유지합니다.

그렇지 않고 리소스 사용을 완료하는 경우 요금이 부과되지 않도록 하려면 만든 Azure 리소스 그룹을 삭제하면 됩니다.

중요합니다

리소스 그룹을 삭제하면 다시 되돌릴 수 없습니다. 리소스 그룹을 삭제하는 경우 그 안의 모든 리소스가 영구적으로 삭제됩니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 해야 합니다. 유지하려는 리소스가 포함된 기존 리소스 그룹 내에서 리소스를 만든 경우 리소스 그룹을 삭제하는 대신 각 리소스를 개별적으로 삭제할 수 있습니다.

리소스 그룹을 삭제하려면

  1. Azure Portal에 로그인한 다음, 리소스 그룹을 선택합니다.

  2. 삭제하려는 리소스 그룹을 선택합니다.

    리소스 그룹이 많은 경우 필드 필터링... 상자를 사용하여 이 문서에 대해 만든 리소스 그룹의 이름을 입력합니다. 결과 목록에서 리소스 그룹을 선택합니다.

    작업 창에서 삭제할 리소스 그룹 목록을 보여 주는 스크린샷.

  3. 리소스 그룹 삭제를 선택합니다.

  4. 리소스 그룹 삭제를 확인하는 메시지가 표시됩니다. 리소스 그룹의 이름을 입력하여 확인한 다음, 삭제를 선택합니다.

    삭제를 확인하기 위해 리소스 이름이 필요한 양식을 보여 주는 스크린샷.

잠시 후, 리소스 그룹 및 모든 해당 리소스가 삭제됩니다.