使用 Azure Container Registry 和 AKS Arc 從私人容器登錄部署到內部部署 Kubernetes
適用於:Azure 本機版本 23H2
本文說明如何使用 Azure Container Registry 從私人容器登錄部署容器映像,您可以在 AKS Arc 部署中自己的數據中心內執行。 您部署至 AKS 所裝載的內部部署 Kubernetes 叢集。 Azure Container Registry 可讓您建置、儲存及管理所部署之各類型容器之私人登錄中的映像及成品。
本文說明如何在 Azure 中建立私人容器登錄,並將容器映像推送至私人容器登錄。 然後,您可以從私人登錄部署到裝載於 AKS Arc 的內部部署 Kubernetes 叢集。
如需 Azure Container Registry 的詳細資訊,請參閱 Azure Container Registry 檔。
必要條件
確認您有下列需求:
在 Azure 中建立私人容器登錄
若要建立容器登錄,請從資源群組開始。 Azure 資源群組是在其中部署與管理 Azure 資源的邏輯容器。 使用 az group create
命令建立資源群組。 下列範例會在 eastus 區域中建立資源群組:
az group create --name <RESOURCE_GROUP_NAME> --location eastus
使用 az acr create 命令建立 Container Registry 實例,並提供您自己的登錄名稱。 登錄名稱在 Azure 內必須是唯一的,且包含 5-50 個英數字元。 在本文中的其餘部分, <acrName>
會作為容器登錄名稱的佔位元,但您可以提供自己的唯一登錄名稱。 基本 SKU 是針對開發目的進行成本優化的進入點,可提供記憶體和輸送量的平衡:
az acr create --resource-group <RESOURCE_GROUP_NAME> --name <REGISTRY_NAME> --sku Basic
建立容器登錄之後,請使用下列命令來建立服務主體,以便從 Kubernetes 存取容器登錄:
az ad sp create-for-rbac /
--scopes /subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RG_NAME>/providers/Microsoft.ContainerRegistry/registries/<REGISTRY_NAME> /
--role Contributor /
--name <SERVICE_PRINCIPAL_NAME>
Azure Container Registry 支援三個存取角色。 參與者角色最常由應用程式開發人員使用。 不過,在真實世界的案例中,您可能需要根據所需的存取類型來建立多個服務主體:
- 參與者:此角色提供存放庫的推送和提取存取權。
- 讀者:此角色只允許提取存取存放庫。
- 擁有者:此角色可讓您將角色指派給其他使用者,以及推送和提取存放庫的存取權。
上一個命令應該會產生類似下列文字的輸出:
{
"appId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"displayName": "akshci-service-principal",
"name": "http://akshci-service-principal",
"password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tenant": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
成功建立服務主體之後,請在安全的位置複製 appId 和密碼,以便稍後在部署中使用。
如需使用服務主體與 Azure Container Registry 的詳細資訊,請參閱使用服務主體進行 Azure Container Registry 驗證。
登入私人容器登錄
若要使用 Container Registry 實例,您必須先登入。 您可以使用 Azure CLI 或 Docker CLI 來登入。
選項 1:從 Azure CLI 登入
使用 az acr sign in 命令,並在上一個步驟中提供指派給容器登錄的唯一名稱:
az acr login --name <REGISTRY_NAME>
選項 2:從 Docker CLI 登入
若要使用 Docker CLI 來存取容器登錄,請在 Bash 或 PowerShell 終端機中輸入下列命令:
docker login <REGISTRY_NAME>.azurecr.io -u <appId> -p <password>
在任一選項中,命令應該會在完成時傳回 登入成功 訊息。
將映像推送至容器登錄
成功登入之後,您就可以開始將映射推送至 Container Registry。 首先,執行 docker images 命令來檢視本機電腦上的映射清單:
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/azure-functions/dotnet 3.0 9f8ad1bdee67 5 months ago
540MB
poemfinder-app latest 2d9bef425603 6 months ago 208MB
若要開始使用,請使用 docker 命令標記映像,然後使用 docker tag
push
將它推送至容器登錄:
docker tag poemfinder-app <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
再次執行 docker images 命令,確認映像已正確標記。 確認之後,請執行 docker push
以推送至容器登錄,如下所示:
docker push <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
若要確認映像已成功推送至容器登錄,請執行下列命令:
az acr repository list --name <REGISTRY_NAME>.azurecr.io --output table
將映像從容器登錄部署到 AKS
若要將容器映像從容器登錄部署至 Kubernetes 叢集,請建立 Kubernetes 秘密 來儲存您的登錄認證。 Kubernetes 使用映像提取秘密,來儲存驗證登錄所需的資訊。 若要建立容器登錄的提取密碼,您可以提供服務主體標識碼、密碼和登錄 URL:
kubectl create secret docker-registry <secret-name> \
--namespace <namespace> \
--docker-server=<REGISTRY_NAME>.azurecr.io \
--docker-username=<appId> \
--docker-password=<password>
下表描述輸入參數:
值 | Description |
---|---|
secret-name |
映射的名稱會提取秘密;例如, acr-secret 。 |
namespace |
要放入秘密的 Kubernetes 命名空間。 只有在您想要將秘密放在預設命名空間以外的命名空間時才需要。 |
<REGISTRY_NAME> |
容器登錄的名稱。 例如: myregistry 。 --docker-server 是登錄登入伺服器的完整名稱。 |
appId |
Kubernetes 用來存取登錄的服務主體標識碼。 |
password |
服務主體密碼。 |
建立映像提取密碼之後,您就可以使用它來建立 Kubernetes Pod 和部署。 在部署檔案中提供下 imagePullSecrets
的密碼名稱,如下列範例所示:
apiVersion: v1
kind: Pod
metadata:
name: poemfinder-app
namespace: mydemoapps
spec:
containers:
- name: poemfinder-app
image: <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: acr-secret
在此範例中, poemfinder-app:v1.0
是要從容器登錄提取的映像名稱,而 acr-secret
是您建立以存取登錄的提取密碼名稱。 當您部署Pod時,如果叢集上還沒有映像,Kubernetes 會自動從登錄提取映像。
您可以將上述 Pod 組態儲存在 pod-example.yaml 等檔案中,然後將它部署至 Kubernetes,如下所示:
kubectl create -f pod-example.yaml
若要確認 Pod 已成功使用容器登錄中的容器映像建立,請執行 kubectl 描述 pod <POD_NAME>,其中應該會顯示用來建立 Pod 的容器映像。