Упражнение. Настройка политики Azure для Kubernetes в кластере AKS

Завершено

Политика Azure для Kubernetes позволяет организациям осуществлять управление, соблюдать нормативные требования, а также внедрять наработки и организационные соглашения для облачных сред.

Команды разработчиков в вашей компании используют службу Azure Kubernetes (AKS) как платформу разработки. Вы понимаете, что лучший способ управления затратами заключается в применении бизнес-правил, определяющих ограничения ресурсов рабочей нагрузки. Вам нужно, чтобы разработчики могли развертывать рабочие нагрузки в пределах установленных ограничений в отношении ЦП и памяти. Система должна запрещать выполнение рабочих нагрузок, превышающих установленные пределы.

В этом упражнении вы включите Политика Azure для AKS в кластере и добавьте ограничения ресурсов ЦП и памяти контейнеров кластера Kubernetes не должны превышать указанную политику ограничений. Затем вы проверите, запрещает ли политика планирование рабочих нагрузок, превышающих параметры ресурса политики.

Включение поставщиков ресурсов ContainerService и PolicyInsights

  1. Войдите в Azure Cloud Shell с помощью учетной записи Azure. Выберите Cloud Shell версии Bash.

  2. Для политики Azure для AKS требуется версия кластера 1.14 или выше. Выполните следующий скрипт, чтобы проверить версию кластера AKS:

    az aks list
    

    Убедитесь, что установлена версия кластера 1.14 или выше.

  3. Зарегистрируйте поставщик службы Azure Kubernetes, выполнив команду az provider register:

    az provider register --namespace Microsoft.ContainerService
    
  4. Зарегистрируйте поставщик политики Azure, выполнив команду az provider register:

    az provider register --namespace Microsoft.PolicyInsights
    
  5. Включите установку надстройки az feature register , выполнив команду:

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. Убедитесь, что регистрация выполнена успешно, запрашивая таблицу списка функций. Используйте команду az feature list для выполнения запроса. Регистрация компонента может занять несколько минут, поэтому периодически проверка результат.

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')].   {Name:name,State:properties.state}"
    

    Если время ожидания сеанса Cloud Shell истекло, вы можете отслеживать процесс регистрации через портал Azure с помощью страницы предварительной версии.

  7. Выполните команду az provider register, чтобы распространить обновление, после того как убедитесь, что команда запроса списка компонентов показывает "Зарегистрировано".

    az provider register -n Microsoft.ContainerService
    

Включение Политика Azure в кластере

  1. Выполните команду az aks enable-addons, чтобы включить надстройку azure-policy для своего кластера.

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. Убедитесь, что в пространстве имен kube-system установлен объект pod политики Azure, а в пространстве имен gatekeeper-system — объект pod Gatekeeper. Для этого выполните следующие команды kubectl get pods:

    kubectl get pods -n kube-system
    

    Выходные данные должны выглядеть следующим образом.

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    Выходные данные должны выглядеть следующим образом.

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. Наконец, убедитесь, что установлена последняя версия надстройки, выполнив команду az aks show. Эта команда извлекает сведения о конфигурации для кластера.

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    Выходные данные должны выглядеть следующим образом.

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    Теперь вы можете перейти на портал Azure и настроить политику с именем Пределы ресурсов ЦП и памяти для контейнеров кластера Kubernetes не должны превышать заданные ограничения.

Назначение определения встроенной политики

Для настройки новой политики Azure используйте службу политик на портале Microsoft Azure.

  1. Войдите на портал Azure.

  2. На портале Azure откройте службу Policy. Для этого на панели поиска в верхней части портала Azure найдите и выберите Политика.

  3. Выберите службу Policy из списка служб, как показано в примере ниже.

    Screenshot of the general Azure portal search box with a result that shows the Azure Policy service.

    Откроется панель мониторинга политики, содержащая все назначенные политики, состояние ресурсов и указание того, как влияют на них политики. Если вы не назначили какие-либо политики, панель мониторинга пуста.

  4. На панели меню слева в разделе Разработка выберите Назначения.

    Screenshot of the Policy service navigation panel that shows the location of the Assignments option.

  5. Ранее мы уже говорили, что вы можете создать назначение политики двумя способами: либо назначить инициативу, либо назначить политику. В верхней строке меню выберите Назначить политику.

    Screenshot that shows the new policy assignment option.

    Откроется панель Назначение политики.

  6. Чтобы создать политику, на вкладке Основные сведения введите следующие значения параметров.

    Параметр Значение
    Область применения
    Область Нажмите кнопку с многоточием. Появится панель Область. В разделе Подписка выберите подписку, в которую входит ваша группа ресурсов. Для группы ресурсов выберите rg-akscostsaving, а затем нажмите кнопку "Выбрать".
    Исключения Оставьте пустым.
    Основы
    Определение политики Нажмите кнопку с многоточием. Появится область Доступные определения. Отфильтруйте выборку, набрав в поле поиска слово ЦП. На вкладке "Определения политики" выберите ограничения ресурсов ЦП и памяти контейнеров кластера Kubernetes, а затем нажмите кнопку "Добавить".
    Имя назначения Примите значение по умолчанию.
    Description Оставьте пустым.
    Применение политики Этот параметр должен быть включен.
    Кем назначено Примите значение по умолчанию.

    Ниже показан пример заполненной вкладки Основное.

    Screenshot that shows the information captured in the Basics tab.

  7. Перейдите на вкладку Параметры, чтобы указать параметры политики.

  8. Введите для параметров указанные ниже значения.

    Параметр Значение
    Максимально допустимое количество ЦП Укажите значение 200m. Политика сравнивает это значение со значением запроса ресурсов рабочей нагрузки и значением предела рабочей нагрузки, указанными в файле манифеста рабочей нагрузки.
    Максимально допустимый объем памяти в байтах Укажите значение 256Mi. Политика сравнивает это значение со значением запроса ресурсов рабочей нагрузки и значением предела рабочей нагрузки, указанными в файле манифеста рабочей нагрузки.

    Ниже показан пример заполненной вкладки Параметры.

    Screenshot that shows the information captured in the Parameters tab.

  9. Перейдите на вкладку "Исправление". На этой вкладке вы выберете, как новая политика влияет на ресурсы, которые уже существуют. По умолчанию новая политика проверка только созданные ресурсы. Сохраните стандартную конфигурацию по умолчанию.

    Ниже показан пример заполненной вкладки Исправление.

    Screenshot that shows the information captured in the Remediation tab.

  10. Выберите вкладку "Просмотр и создание". Просмотрите выбранные значения, а затем нажмите кнопку "Создать".

Важно!

Если вы используете существующий кластер AKS, назначение политики может занять около 15 минут.

Тестирование запросов ресурсов

Последним шагом будет проверка новой политики. Разверните тестовую рабочую нагрузку с запросами ресурсов и ограничениями, которые нарушают новую политику. Если все идет правильно, сервер возвращает сообщение об ошибке, отказано в политике.

  1. Откройте Azure Cloud Shell и убедитесь, что выбрана версия Cloud Shell Bash.

  2. Создайте файл манифеста для развертывания Kubernetes с помощью встроенного редактора. Вызовите файл test-policy.yaml:

    code test-policy.yaml
    

    Совет

    Cloud Shell включает в себя встроенный редактор файлов. Редактор Cloud Shell поддерживает такие функции, как выделение языков, палитра команд и проводник файлов. Для простого создания и редактирования файлов запустите редактор, выполнив команду code . в терминале Cloud Shell. Это действие открывает редактор с активным рабочим каталогом, установленным в терминале. Чтобы открыть файл манифеста непосредственно для быстрого редактирования, запустите code test-policy.yaml. Эта команда открывает редактор без проводника.

  3. Затем вставьте в файл следующий текст:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  4. Нажмите клавиши CTRL+S , чтобы сохранить файл, а затем нажмите клавиши CTRL+Q , чтобы закрыть редактор.

  5. Примените конфигурацию с помощью команды kubectl apply и разверните приложение в пространстве имен costsavings.

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Выходные данные должны выглядеть следующим образом:

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    Обратите внимание на то, что веб-перехватчик допуска validation.gatekeeper.sh отклонил запрос на планирование объекта pod.

  6. Откройте файл манифеста и исправьте запрос ресурсов.

    code test-policy.yaml
    

    Замените текст следующим текстом:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  7. Нажмите клавиши CTRL+S , чтобы сохранить файл, а затем нажмите клавиши CTRL+Q , чтобы закрыть редактор.

  8. Примените конфигурацию с помощью команды kubectl apply и разверните приложение в пространстве имен costsavings.

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Вы получите следующие выходные данные:

    pod/nginx created
    
  9. Получите модули pod только что созданных модулей pod в пространстве costsavings имен.

    kubectl get pods --namespace costsavings
    

    Через несколько секунд модули pod переходит к состоянию Running .

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. Нажмите клавиши CTRL+C , чтобы остановить просмотр после запуска модулей pod.