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

Завершено

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

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

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

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

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

  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. Убедитесь, что pod azure-policy установлен в пространстве имен kube-system и pod gatekeeper установлен в пространстве имен gatekeeper-system. Для этого выполните следующие команды 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, используйте службу политики на портале Azure.

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

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

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

    снимок экрана: общее поле поиска на портале Azure с результатом, показывающим службу политики Azure.

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

  4. В области меню слева в разделе Созданиевыберите задания:

    снимок экрана панели навигации службы политики, в котором показано расположение параметра

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

    снимок экрана, показывающий новый параметр назначения политики.

    Панель "Назначение политики" появится.

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

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

    Ниже приведен пример завершенной вкладки Базовые:

    снимок экрана, на котором показана информация, записанная на вкладке

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

  8. Задайте следующие значения для каждого параметра:

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

    Ниже приведен пример готовой вкладки "Параметры ":

    снимок экрана, на котором показана информация, записанная на вкладке

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

    Ниже приведен пример завершенной вкладки исправления:

    снимок экрана, на котором показана информация, записанная на вкладке

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

Важный

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

Тестовые запросы ресурсов

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

  1. Откройте Azure Cloud Shell и обязательно выберите версию Bash Cloud Shell.

  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. Получите новые поды в пространстве имен costsavings.

    kubectl get pods --namespace costsavings
    

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

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