Я не могу заставить Kubernetes в AKS извлекать образы из частного реестра докеров в Azure
Я выполнил инструкции здесь https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/service_principal_client_secret
Итак, я создал принципала службы
az ad sp create-for-rbac -n TerraformSP --role="Contributor" --scopes="/subscriptions/SUBSCRIPTION_ID"
Это (возобновленный) скрипт терраформирования
resource "azurerm_resource_group" "default" {
name = "myaks-rg"
location = var.location
}
resource "azurerm_kubernetes_cluster" "default" {
name = "myaks"
location = azurerm_resource_group.default.location
resource_group_name = azurerm_resource_group.default.name
dns_prefix = var.dns_prefix
identity {
type = "SystemAssigned"
}
role_based_access_control {
enabled = true
}
}
data "azurerm_container_registry" "acr" {
name = "myregistry"
resource_group_name = "another-rg"
}
resource "azurerm_role_assignment" "aks_acr" {
scope = data.azurerm_container_registry.acr.id
role_definition_name = "AcrPull"
principal_id = azurerm_kubernetes_cluster.default.kubelet_identity[0].object_id
skip_service_principal_aad_check = true
}
Затем я выполнил terraform (используя идентификаторы / секреты, сгенерированные
az ad sp create-for-rbac
команда)
az logout
export ARM_CLIENT_ID="00000000-0000-0000-0000-000000000000"
export ARM_CLIENT_SECRET="00000000-0000-0000-0000-000000000000"
export ARM_SUBSCRIPTION_ID="00000000-0000-0000-0000-000000000000"
export ARM_TENANT_ID="00000000-0000-0000-0000-000000000000"
terraform apply
AKS создан, но Pod не может извлекать изображения. Это сообщение об ошибке в модуле.
Failed to pull image "myregistry.azurecr.io/myimage:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://myregistry.azurecr.io/v2/myimage/manifests/latest: unauthorized: authentication required...
Однако это работает, когда я бегу
terraform apply
используя мой личный кабинет (az login
), и я не устанавливаю переменные среды ARM_CLIENT_ID, ARM_CLIENT_SECRET и т. д.
Я понимаю, что субъект-служба TerraformSP (участник роли) не может назначить роль
AcrPull
к
azurerm_kubernetes_cluster.default.kubelet_identity[0].object_id
.
Что лучше всего в этом случае? Следует ли назначить TerraformSP роль администратора? Или мне что-то не хватает в скрипте terraform?
Цель состоит в том, чтобы поместить этот сценарий терраформирования в конвейер в Azure DevOps.
1 ответ
Мне удалось заставить Kubernetes извлекать образы из моего реестра, воссоздав субъект-службу с ролью
Owner
.
az ad sp create-for-rbac -n TerraformSP --role="Owner" --scopes="/subscriptions/SUBSCRIPTION_ID"
Я также заметил, что terraform успешно создает назначение ролей.
azurerm_role_assignment.aks_acr: Creation complete after 24s [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/another-rg/providers/Microsoft.ContainerRegistry/registries/myregistry/providers/Microsoft.Authorization/roleAssignments/SOME_ID]