다음을 통해 공유


Azure Kubernetes Fleet Manager를 사용하여 지능형 클러스터 간 Kubernetes 리소스 배치

애플리케이션 개발자는 Kubernetes 리소스를 여러 클러스터에 배포해야 하는 경우가 많습니다. 플릿 운영자는 추론(예: 컴퓨팅 비용) 또는 사용 가능한 리소스(예: 메모리 및 CPU)를 기반으로 워크로드에 가장 적합한 클러스터를 선택해야 하는 경우가 많습니다. 여러 클러스터에서 이러한 Kubernetes 리소스를 수동으로 만들고, 업데이트하고, 추적하는 것은 지루한 일입니다. 이 문서에서는 Azure Kubernetes Fleet Manager(Kubernetes Fleet)의 지능형 Kubernetes 리소스 배치 기능을 사용하여 이러한 시나리오를 해결하는 방법을 설명합니다.

Kubernetes Fleet의 리소스 배치 기능은 다음 클러스터 속성에 따라 예약 결정을 내릴 수 있습니다.

  • 노드 수
  • 대상 멤버 클러스터의 컴퓨팅/메모리 비용
  • 대상 멤버 클러스터의 리소스(CPU/메모리) 가용성

이 문서의 개념에 대한 자세한 내용은 허브 클러스터에서 멤버 클러스터로 Kubernetes 리소스 배치를 참조 하세요.

필수 조건

  • 활성 구독이 있는 Azure 계정이 필요합니다. 체험 계정을 만듭니다.

  • 하나 이상의 멤버 클러스터가 있는 Kubernetes Fleet 리소스가 있어야 합니다. 없는 경우 빠른 시작따라 허브 클러스터를 사용하여 Kubernetes Fleet 리소스를 만듭니다. 그런 다음 AKS(Azure Kubernetes Service) 클러스터를 멤버로 조인합니다.

    관심 있는 클러스터 속성(위치, 노드 수, 리소스 또는 비용)을 사용하여 배치를 테스트할 수 있도록 AKS 멤버 클러스터가 구성되어 있는지 확인합니다.

  • 다음 환경 변수를 설정합니다.

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • 이 문서를 완료하려면 Azure CLI 버전 2.58.0 이상이 설치되어 있어야 합니다. 설치하거나 업그레이드하려면 Azure CLI 설치를 참조하세요.

  • Kubernetes CLI(kubectl)가 아직 없는 경우 다음 명령을 사용하여 설치할 수 있습니다.

    az aks install-cli
    
  • Azure CLI 확장이 fleet 필요합니다. 다음 명령을 실행하여 설치할 수 있습니다.

    az extension add --name fleet
    

    az extension update 명령을 실행하여 최신 버전의 확장으로 업데이트합니다.

    az extension update --name fleet
    
  • Kubernetes Fleet 허브 클러스터에 연결하도록 kubectl에 권한을 부여합니다.

    az fleet get-credentials --resource-group $GROUP --name $FLEET
    

멤버 클러스터 속성 검사

허브 클러스터를 쿼리하여 멤버 클러스터에 대한 레이블, 속성 및 리소스를 검색합니다. 결과를 읽을 수 있도록 YAML로 출력합니다.

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

결과 YAML 파일에는 배치 정책을 빌드하는 데 사용할 수 있는 세부 정보(레이블 및 속성)가 포함되어 있습니다. 예를 들면 다음과 같습니다.

apiVersion: cluster.kubernetes-fleet.io/v1
kind: MemberCluster
metadata:
  annotations:
    ...
  labels:
    fleet.azure.com/location: eastus2
    fleet.azure.com/resource-group: resource-group
    fleet.azure.com/subscription-id: 8xxxxxxx-dxxx-4xxx-bxxx-xxxxxxxxxxx8
  name: cluster01
  resourceVersion: "123456"
  uid: 7xxxxxxx-5xxx-4xxx-bxxx-xxxxxxxxxxx4
spec:
  ...
status:
  ...
  properties:
    kubernetes-fleet.io/node-count:
      observationTime: "2024-09-19T01:33:54Z"
      value: "2"
    kubernetes.azure.com/per-cpu-core-cost:
      observationTime: "2024-09-19T01:33:54Z"
      value: "0.073"
    kubernetes.azure.com/per-gb-memory-cost:
      observationTime: "2024-09-19T01:33:54Z"
      value: "0.022"
  resourceUsage:
    allocatable:
      cpu: 3800m
      memory: 10320392Ki
    available:
      cpu: 2740m
      memory: 8821256Ki
    capacity:
      cpu: "4"
      memory: 14195208Ki

추가하는 각 멤버 클러스터에 대해 이 단계를 반복하여 정책에서 사용할 수 있는 레이블 및 속성을 식별합니다.

배치를 위한 워크로드 준비

다음으로, 멤버 클러스터에 배치할 수 있도록 허브 클러스터에 워크로드를 게시합니다.

  1. 허브 클러스터에서 워크로드에 대한 네임스페이스를 만듭니다.

    kubectl create namespace test-app 
    
  2. 샘플 워크로드는 허브 클러스터의 새 네임스페이스에 배포할 수 있습니다. 이러한 Kubernetes 리소스 종류는 캡슐화할 필요가 없으므로 변경 없이 배포할 수 있습니다.

    1. 다음 YAML을 이름이 지정된 sample-workload.yaml파일에 저장합니다.

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx-service
        namespace: test-app
      spec:
        selector:
          app: nginx
        ports:
        - protocol: TCP
          port: 80
          targetPort: 80
        type: LoadBalancer
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        namespace: test-app
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 2
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.16.1 
              ports:
              - containerPort: 80
      
    2. 허브 클러스터에 워크로드 정의를 배포합니다.

      kubectl apply -f sample-workload.yaml
      

워크로드 정의가 배포되면 이제 Kubernetes Fleet의 지능형 배치 기능을 테스트할 수 있습니다.

워크로드 배치 정책 테스트

사용자 고유 ClusterResourcePlacement 의 개체를 작성하는 지침으로 개념 설명서함께 다음 샘플을 사용할 수 있습니다.

참고 항목

각 샘플 정책을 사용해 보려면 이전 ClusterResourcePlacement 개체를 삭제해야 합니다.

클러스터 노드 수에 따른 배치

다음은 순서를 사용하는 속성 정렬기를 보여 주는 예제입니다 Descending . 이 순서는 Kubernetes Fleet가 노드 수가 더 높은 클러스터를 선호한다는 것을 의미합니다.

노드 수가 가장 높은 클러스터는 가중치가 20이고 가장 낮은 클러스터는 0의 가중치를 받습니다. 다른 클러스터는 가중치 계산 수식을 통해 계산된 비례 가중치를 받습니다.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                metricSorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

레이블 선택기 및 속성 정렬기를 사용하여 배치

이 예제에서 클러스터는 레이블 env=prod이 있는 경우에만 가중치를 받습니다. 클러스터가 해당 레이블 제약 조건을 충족하는 경우 해당 멤버 클러스터의 총 CPU 양에 따라 비례 가중치가 부여됩니다.

이 예제에서는 선호도에 레이블 선택기와 속성 정렬기를 모두 사용할 수 있는 preferredDuringSchedulingIgnoredDuringExecution 방법을 보여 줍니다. 레이블 선택기가 실패하는 멤버 클러스터는 가중치를 받지 않습니다. 레이블 선택기를 충족하는 멤버 클러스터는 속성 정렬기 아래에 지정된 비례 가중치를 받습니다.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                labelSelector:
                  matchLabels:
                    env: prod
                metricSorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

메모리 및 CPU 코어 비용 기반 배치

이 예제의 정렬기에는 순서가 있으므로 Kubernetes Fleet는 Ascending 메모리 및 CPU 코어 비용이 낮은 클러스터를 선호합니다. 메모리 및 CPU 코어 비용이 가장 낮은 클러스터는 20의 가중치를 받고 가장 높은 클러스터는 0의 가중치를 받습니다. 다른 클러스터는 가중치 계산 수식을 통해 계산된 비례 가중치를 받습니다.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 2
    affinity:
      clusterAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 20
            preference:
              propertySorter:
                name: kubernetes.azure.com/per-gb-memory-core-cost
                sortOrder: Ascending
          - weight: 20
            preference:
              propertySorter:
                name: kubernetes.azure.com/per-cpu-core-cost
                sortOrder: Ascending

배치 상태 보기

배치 상태를 보려면 Azure Portal 또는 kubectl 명령을 사용할 수 있습니다.

ClusterResourcePlacement API를 사용하여 리소스를 멤버 클러스터에 전파하는 데 배치 진행률을 보는 방법에 대한 세부 정보를 찾을 수 있습니다.

리소스 정리

Azure Portal 또는 kubectl 명령을 통해 클러스터 리소스 배치를 제거하는 방법에 대한 자세한 내용은 리소스 전파에 대한 문서의 리소스 정리를 참조하세요.

  • 리소스 전파에 대한 자세한 내용은 오픈 소스 Kubernetes Fleet 설명서를 참조 하세요.