Azure Kubernetes Fleet Manager DNS 부하 분산은 가용성을 높이고 여러 멤버 클러스터에 배포된 워크로드에 부하를 분산하는 데 도움이 될 수 있습니다. 이 기능은 DNS를 통해 제공되므로 필요에 따라 계층 4 및 7 부하 분산을 제공하는 데 사용할 수 있습니다.
이 문서의 단계에 따라 플릿에서 호스트되는 다중 클러스터 애플리케이션에 대한 DNS 기반 부하 분산을 설정합니다.
중요합니다
Azure Kubernetes Fleet Manager 미리 보기 기능은 셀프 서비스, 옵트인 기반으로 제공됩니다. 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. Azure Kubernetes Fleet Manager 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다.
저희의 데이터 플레인 네트워킹 미리 보기는 networking.fleet.azure.com/v1beta1
API를 통해 제공됩니다. 미리 보기 개체가 보이지 않으면 Fleet Manager 허브 클러스터와 상호 작용할 때 networking.fleet.azure.com/v1beta1
API를 요청하고 있는지 확인하세요.
필수 조건
Azure 계정이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
이 문서에서 참조하는 및
TrafficManagerProfile
개체에 대한 설명을 제공하는TrafficManagerBackend
를 읽어보세요.허브 클러스터 및 관리 ID가 있는 Kubernetes Fleet Manager입니다. 없는 경우 Azure CLI를 사용하여 Azure Kubernetes Fleet Manager 만들기 및 멤버 클러스터 조인을 참조하세요.
Fleet Manager의
aks-member-1
클러스터aks-member-2
리소스 배치)를 사용하여 동일한 워크로드를 배포하는 두 개의 멤버 클러스터.구성을 완료하는 사용자에게는 Azure 역할 할당을 수행하고 Fleet Manager 허브 클러스터 Kubernetes API에 액세스할 수 있는 권한이 있습니다. 자세한 내용은 Kubernetes API 액세스를 참조하세요.
프로비전된 Azure Traffic Manager 리소스를 호스트할 기존 Azure 리소스 그룹입니다.
다음 환경 변수를 설정합니다.
export SUBSCRIPTION_ID=<subscription> export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBER_CLUSTER_1=aks-member-1 export MEMBER_CLUSTER_2=aks-member-2 export TRAFFIC_MANAGER_GROUP=rg-flt-tm-demo export TRAFFIC_MANAGER_RG_ID="/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${TRAFFIC_MANAGER_GROUP}
자격 증명을 가져와 Fleet Manager 허브 클러스터 Kubernetes API에 액세스합니다.
az fleet get-credentials \ --resource-group ${GROUP} \ --name ${FLEET}
Fleet Manager 권한 구성
미리 보기 중에 Fleet Manager가 Azure Traffic Manager 리소스를 만들고 관리하고 멤버 클러스터에 노출된 서비스의 공용 IP 주소를 가져올 수 있도록 추가 단계를 수행해야 합니다.
이 단계를 완료하려면 관리 ID를 사용하도록 설정된 Fleet Manager를 만들어야 합니다. 사용자에게 Azure RBAC 역할 할당 권한이 있어야 합니다.
Fleet Manager 리소스의 ID 정보를 가져옵니다.
az fleet show \ --resource-group ${GROUP} \ --name ${FLEET} \ --query identity
출력은 예제 출력과 유사해야 합니다.
{ "principalId": "<FLEET-PRINCIPAL-ID>", "tenantId": "<ENTRA-ID-TENANT>", "type": "SystemAssigned", "userAssignedIdentities": null }
Traffic Manager Contributor
Fleet Manager 허브 클러스터 ID에 역할을 할당하여 Traffic Manager 리소스가 만들어진 기존 리소스 그룹으로 범위를 제한합니다.az role assignment create \ --assignee "<FLEET-PRINCIPAL-ID>" \ --role "Traffic Manager Contributor" \ --scope ${TRAFFIC_MANAGER_RG_ID}
Fleet Manager가 멤버 클러스터를
Reader
를 통해TrafficMangerBackend
에 추가할 때, 멤버 클러스터의 공용 IP 주소를 읽을 수 있도록, Fleet Manager 허브 클러스터 ID에는 멤버 클러스터의 AzureServiceExport
역할이 필요합니다.az role assignment create \ --assignee "<FLEET-PRINCIPAL-ID>" \ --role "Reader" \ --scope /full/path/to/member-cluster
Fleet 리소스의 멤버 클러스터에 워크로드 배포
비고
이 사용 방법 가이드의 단계는 데모용으로만 샘플 애플리케이션을 참조하세요. 기존 배포 및 서비스 개체를 이 워크로드로 대체할 수 있습니다.
이러한 단계는 Fleet Manager의 CRP(클러스터 리소스 배치)를 사용하여 Fleet Manager 허브 클러스터에서 멤버 클러스터로 샘플 워크로드를 배포합니다. 또는 이러한 Kubernetes 구성을 한 번에 하나씩 개별적으로 각 멤버 클러스터에 배포하도록 선택할 수 있습니다.
Fleet Manager 허브 클러스터에 네임스페이스를 만듭니다.
kubectl create namespace kuard-demo
출력은 다음과 유사합니다.
namespace/kuard-demo created
다음을 다음
kuard-export-service.yaml
파일에 저장하여 배포, 서비스, ServiceExport 개체를 Fleet Manager 허브 클러스터에 스테이징합니다.apiVersion: apps/v1 kind: Deployment metadata: name: kuard namespace: kuard-demo spec: replicas: 2 selector: matchLabels: app: kuard template: metadata: labels: app: kuard spec: containers: - name: kuard image: gcr.io/kuar-demo/kuard-amd64:blue resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi --- apiVersion: v1 kind: Service metadata: name: kuard-svc namespace: kuard-demo labels: app: kuard spec: selector: app: kuard ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer --- apiVersion: networking.fleet.azure.com/v1alpha1 kind: ServiceExport metadata: name: kuard-export namespace: kuard-demo annotations: networking.fleet.azure.com/weight: "50"
Fleet Manager 허브 클러스터에서 개체를 스테이징합니다.
kubectl apply -f kuard-export-service.yaml
ServiceExport
샘플의 사양을 사용하면 멤버 클러스터에서 Fleet Manager 허브 클러스터로 서비스를 내보낼 수 있습니다. 두 클러스터 간에 트래픽을 균등하게 분산하기 위해ServiceExport
가중치 주석을 50으로 설정했습니다. 성공적으로 내보내면 서비스와 모든 엔드포인트가 Fleet Manager 허브 클러스터에 동기화된 다음, 이러한 엔드포인트에서 DNS 부하 분산을 설정하는 데 사용할 수 있습니다. 출력은 다음 예제와 유사합니다.deployment.apps/kuard created service/kuard-svc created serviceexport.networking.fleet.azure.com/kuard-export created
각 서비스에는 Azure Traffic Manager를 통해 노출될 수 있도록 고유한 DNS 레이블이 필요합니다. Fleet Manager 클러스터 리소스 배치
ResourceOverride
를 사용하여 멤버 클러스터당 서비스 정의를 수정하여 Azure 지역 및 클러스터 이름을 기반으로 고유한 이름을 만듭니다. 클러스터 선택기당 오버라이드 설정을 만들어야 합니다(예를 들어, Azure 지역당 필요합니다).apiVersion: placement.kubernetes-fleet.io/v1alpha1 kind: ResourceOverride metadata: name: ro-kuard-demo-eastus namespace: kuard-demo spec: placement: name: crp-kuard-demo resourceSelectors: - group: "" kind: Service version: v1 name: kuard-svc policy: overrideRules: - clusterSelector: clusterSelectorTerms: - labelSelector: matchLabels: fleet.azure.com/location: eastus jsonPatchOverrides: - op: add path: /metadata/annotations value: {"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-eastus"}
비고
"${MEMBER-CLUSTER-NAME}"은 런타임에 멤버 클러스터의 이름으로 대체되는 리소스 배치 재정의 예약 변수 입니다.
kubectl apply -f ro-kuard-demo-eastus.yaml
라는 파일에 다음 Fleet Manager CRP(
crp-dns-demo.yaml
)를 만듭니다. 우리는eastus
지역에서 최대 두 개의 클러스터를 선택하고 있습니다.apiVersion: placement.kubernetes-fleet.io/v1 kind: ClusterResourcePlacement metadata: name: crp-dns-demo spec: resourceSelectors: - group: "" version: v1 kind: Namespace name: kuard-demo policy: placementType: PickN numberOfClusters: 2 affinity: clusterAffinity: requiredDuringSchedulingIgnoredDuringExecution: clusterSelectorTerms: - labelSelector: matchLabels: fleet.azure.com/location: eastus
CRP를 적용합니다.
kubectl apply -f crp-dns-demo.yaml
성공하면 출력은 다음과 유사합니다.
clusterresourceplacement.placement.kubernetes-fleet.io/crp-dns-demo created
Azure Traffic Manager를 사용하여 DNS 부하 분산 구성
Traffic Manager에서 사용할 매개 변수를
TrafficManagerProfile
로 정의하고, 이를 파일kuard-atm-demo.yaml
에 저장합니다.apiVersion: networking.fleet.azure.com/v1beta1 kind: TrafficManagerProfile metadata: name: kuard-atm-demo namespace: kuard-demo spec: resourceGroup: "rg-flt-tm-demo" monitorConfig: port: 80
구성을 적용합니다.
kubectl apply -f kuard-atm-demo.yaml
멤버 클러스터에서 내보낸
TrafficManagerBackend
항목을 그룹화하는 데 사용되는 해당Service
항목을 정의합니다.apiVersion: networking.fleet.azure.com/v1beta1 kind: TrafficManagerBackend metadata: name: kuard-atm-demo-backend namespace: kuard-demo spec: profile: name: "kuard-atm-demo" backend: name: "kuard-svc" weight: 100
구성을 적용합니다.
kubectl apply -f kuard-atm-demo-backend.yaml
다음 명령을 실행하여 Azure Traffic Manager를 통해 서비스를 사용할 수 있는지 확인합니다.
nslookup kuard-atm-demo.trafficmanager.net
출력은 다음 예제와 유사하게 표시됩니다.
Server: 10.X.X.254 Address: 10.X.X.254#53 Non-authoritative answer: Name: kuard-atm-demo.trafficmanger.net Address: 123.X.X.16 Name: kuard-atm-demo.trafficmanger.net Address: 74.X.X.78 Name: kuard-atm-demo.trafficmanger.net Address: 173.X.X.164
웹 브라우저를 사용하여 URL을 방문하고 Kuard가 응답하는 방법을 확인합니다. DNS를 플러시하고 다시 시도하여 다른 클러스터에서 다른 서비스 인스턴스가 제공되었는지 확인합니다.
Azure Kubernetes Service