目录
在这里,我们选择一个通过Web界面公开简单服务的现有容器映像,逐步演示如何创建可以将映像部署到我们现有的已启用Arc的Kubernetes集群中的GitHub Actions管道,并展示如何运行管道,然后演示一旦完成,我们选择的容器映像将按预期在我们的集群中启动并运行。
在本系列的第三部分也是最后一部分中,我们将探讨如何将容器部署到启用了Azure Arc的Kubernetes群集上。
先决条件
对于本教程,您需要以下内容:
- 有效的Azure订阅
- 部署到Azure Arc订阅的已启用Azure Arc的Kubernetes群集(如本系列的第一篇文章中所述))
- 活跃的GitHub帐户
- 一个代码编辑器,用于修改代码并将其提交到GitHub,如Visual Studio Code
Azure设置
在前面的文章中,我们设置了 Kubernetes集群。我们增加了安全性和监控功能。现在,我们已准备好将应用程序部署到群集。现在,我们需要一个可以在GitHub中配置的服务主体,以及一个与群集通信并将应用程序从容器注册表部署到Kubernetes群集的Azure容器注册表。
为了简化设置,我们将在本文中使用一些变量。要开始使用,请设置以下变量:
SERVICE_PRINCIPLE="K8ARCSP"
SUBSCRIPTION_ID="<Your Subscription ID>"
RESOURCE_GROUP="AzureARCRG"
ACR_NAME="arckubeacr"
CLUSTER_NAME="do-ams3-azure-arc"
服务原则
现在,我们需要创建一个新的服务主体,用于使用以下代码向Azure进行身份验证:
az ad sp create-for-rbac --name $SERVICE_PRINCIPLE --role contributor --scopes /subscriptions/$SUBSCRIPTION_ID --sdk-auth
请务必将详细信息保存在输出中以供以后使用。
Azure容器注册表
若要创建Azure容器注册表,请在Azure CLI或本地终端上运行以下命令:
az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic
此命令在与Kubernetes群集相同的资源组下注册新的Azure容器注册表。我们使用基本SKU,因为它针对开发目的进行了成本优化。
验证Azure Arc Services
在设置部署之前,我们必须通过在终端中运行以下命令来确保Azure Arc服务正在运行:
kubectl get pods -n azure-arc
启用群集连接
若要部署到Kubernetes群集,我们需要使群集能够连接,以便它使用我们之前创建的服务原则接受外部连接。若要启用群集连接功能,请运行以下命令:
az connectedk8s enable-features --features cluster-connect -n $CLUSTER_NAME -g $RESOURCE_GROUP
我们需要等待操作完成,因为这需要一段时间。启用群集连接功能后,你将收到确认。
向服务主体授予权限
接下来,我们需要向之前创建的服务主体授予权限,以便可以将其部署到Kubernetes群集。为此,我们需要用户ID,我们可以使用服务原则中的ClientId检索用户ID。
让我们将客户端ID分配给一个变量CLIENT_ID,然后在查询中使用它来检索USER_ID:
CLIENT_ID=<YourClientId>
USER_ID=$(az ad sp show --id $CLIENT_ID --query objectId -o tsv)
请务必使用echo $USER_ID检查已保存用户ID的值。
然后,使用以下命令创建角色绑定:
kubectl create clusterrolebinding admin-user-binding --clusterrole cluster-admin --user=$_USERID
Web应用程序
容器的创建超出了本文的范围,因此对于此演示,我们将使用现有的GitHub存储库 gh-arc-app-deploy,您可以将其分叉并克隆到本地环境。此存储库包含一个使用Python开发的投票应用,其中包含后端和前端的部署清单,以及我们使用详细信息编辑的GitHub操作工作流文件。
设置变量
在存储库中,在位置.github\workflows\github-action-arc-app-deploy.yaml 下,我们分配以下变量:
env:
AZURE_CONTAINER_REGISTRY: "<ACR_NAME>"
CONTAINER_NAME: "azure-voting-app"
RESOURCE_GROUP: "<RESOURCE_GROUP>"
CLUSTER_NAME: "<CLUSTER_NAME>"
IMAGE_PULL_SECRET_NAME: "image-pull-secret-name"
请确保在变量ACR_NAME、RESOURCE_GROUP和CLUSTER_NAME中使用相同的值。
我们需要使用Azure容器注册表名称更新/manifest/azure-vote-frontend-deployment.yaml 文件,该名称与变量ACR_NAME具有相同的值:
spec:
containers:
- name: azure-vote-front
image: <ACR_NAME>.azurecr.io/azure-voting-app
ports:
- containerPort: 80
env:
- name: REDIS
value: "azure-vote-back"
代码已准备好部署!
使用应用程序,您可以在将GitHub操作添加到代码时添加工作流。工作流的步骤保持不变,但清单将根据您的要求而有所不同。
创建GitHub操作管道
现在,我们可以将代码推送到存储库。如果您正在使用自己的代码,则可以将代码推送到GitHub。我们不会在本文中介绍这一点,但您可以找到有关如何提交代码的说明。
推送代码后,我们导航到 GitHub 存储库。
GitHub密钥
我们使用GitHub密钥通过绑定到Azure容器注册表的服务主体从 GitHub对Azure进行身份验证。
让我们将服务原则的详细信息添加为GitHub密钥。若要从存储库中检索此信息,请选择“设置”。在“选项”下,选择“密钥”以打开“操作密钥”页。
在“操作密钥”页上,选择“新建存储库密钥”。
在“新建密钥”页上,我们必须指定名称和值。我们将调用我们的密钥AZURE_CREDENTIALS,对于此值,我们以之前创建的服务原则的格式提供JSON提取:
{
"clientId": "<GUID>",
"clientSecret": "<GUID>",
"subscriptionId": "<GUID>",
"tenantId": "<GUID>",
(...)
}
将服务主体复制到“值”字段中,然后选择“添加密钥”。
我们新创建的密钥位于“操作密钥”下。
设置工作流
从这里,我们可以导航到操作。如果克隆了演示存储库,则可以跳过此步骤。
使用代码时,可以创建新的工作流,并使用与YAML文件相同的步骤。
请务必选择“自行设置工作流”。
为工作流命名,并将样板代码替换为部署YAML。请务必根据您的要求编辑该部分。
# This workflow will build and push an application to a Azure Arc-enabled Kubernetes (Connected Cluster) Service cluster when you push your code
#
# This workflow assumes you have already created the target Connected cluster and have created an Azure Container Registry (ACR)
# For instructions see:
# - https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough-portal
# - https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal
# - https://github.com/Azure/aks-create-action
#
# To configure this workflow:
#
# 1. Set the following secrets in your repository
# - AZURE_CREDENTIALS
#
#
# 2. Set the following environment variables (or replace the values below):
# - AZURE_CONTAINER_REGISTRY (name of your container registry / ACR)
# - RESOURCE_GROUP (where your Arc-enabled cluster is deployed)
# - CLUSTER_NAME (name of your Arc-enabled cluster)
# - CONTAINER_NAME (name of the container image you would like to push up to your ACR)
# - SECRET_NAME (name of the secret associated with pulling your ACR image)
# - DEPLOYMENT_MANIFEST_PATH (path to the manifest yaml for your deployment)
#
# For more information on GitHub Actions for Azure, refer to https://github.com/Azure/Actions
# For more samples to get started with GitHub Action workflows to deploy to Azure, refer to https://github.com/Azure/actions-workflow-samples
# For more options with the actions used below please refer to https://github.com/Azure/login
name: Deploy to Connected Cluster
on:
workflow_dispatch:
env:
AZURE_CONTAINER_REGISTRY: "arckubeacr"
CONTAINER_NAME: "azure-voting-app"
RESOURCE_GROUP: "AzureARCRG"
CLUSTER_NAME: "do-ams3-azure-arc"
IMAGE_PULL_SECRET_NAME: "image-pull-secret-name"
jobs:
build:
permissions:
actions: read
contents: read
id-token: write
runs-on: ubuntu-latest
steps:
# Checks out the repository this file is in
- uses: actions/checkout@master
# Logs in with your Azure credentials
- name: Azure login
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
# Builds and pushes an image up to your Azure Container Registry
- name: Build and push image to ACR
run: |
az acr build --image ${{ env.CONTAINER_NAME }}:${{ github.sha }} --registry ${{ env.AZURE_CONTAINER_REGISTRY }} -g ${{ env.RESOURCE_GROUP }} ./azure-vote
# Retrieves your Azure Kubernetes Service cluster's kubeconfig file
- name: Get K8s context
uses: azure/k8s-set-context@v2
with:
method: service-principal
cluster-type: arc
cluster-name: ${{ env.CLUSTER_NAME }}
resource-group: ${{ env.RESOURCE_GROUP }}
# Retrieves the credentials for pulling images from your Azure Container Registry
- name: Get ACR credentials
run: |
az acr update -n ${{ env.AZURE_CONTAINER_REGISTRY }} -g ${{ env.RESOURCE_GROUP }} --admin-enabled true
ACR_USERNAME=$(az acr credential show -g ${{ env.RESOURCE_GROUP }} -n ${{ env.AZURE_CONTAINER_REGISTRY }} --query username -o tsv)
ACR_PASSWORD=$(az acr credential show -g ${{ env.RESOURCE_GROUP }} -n ${{ env.AZURE_CONTAINER_REGISTRY }} --query passwords[0].value -o tsv)
echo "::add-mask::${ACR_USERNAME}"
echo "::set-output name=username::${ACR_USERNAME}"
echo "::add-mask::${ACR_PASSWORD}"
echo "::set-output name=password::${ACR_PASSWORD}"
id: get-acr-creds
# Creates a kubernetes secret on your Azure Kubernetes Service cluster that matches up to the credentials from the last step
- name: Create K8s secret for pulling image from ACR
uses: Azure/k8s-create-secret@v1.1
with:
container-registry-url: ${{ env.AZURE_CONTAINER_REGISTRY }}.azurecr.io
container-registry-username: ${{ steps.get-acr-creds.outputs.username }}
container-registry-password: ${{ steps.get-acr-creds.outputs.password }}
secret-name: ${{ env.IMAGE_PULL_SECRET_NAME }}
# Deploys application based on given manifest file
- name: Deploys application
uses: Azure/k8s-deploy@v3.0
with:
action: deploy
manifests: |
manifests/azure-vote-backend-deployment.yaml
manifests/azure-vote-backend-service.yaml
manifests/azure-vote-frontend-deployment.yaml
manifests/azure-vote-frontend-service.yaml
images: |
${{ env.AZURE_CONTAINER_REGISTRY }}.azurecr.io/${{ env.CONTAINER_NAME }}:${{ github.sha }}
imagepullsecrets: |
${{ env.IMAGE_PULL_SECRET_NAME }}
选择“开始提交”,提供注释,然后选择“提交新文件”。
运行工作流
提交工作流后,我们可以手动运行工作流,方法是转到“操作”,选择在上一步中创建的工作流,然后选择“运行工作流”。
这将显示要在其上运行工作流的分支。对于此演示,我们在主分支上运行它。
一旦它开始运行,我们将看到正在进行的状态。我们可以选择正在运行的工作流以查看详细信息。
这将打开构建详细信息,我们可以选择这些详细信息以逐步查看进度。
我们可以进一步扩展这些步骤,以准确查看正在执行的内容。
工作流程需要一段时间才能完成所有步骤,因此请耐心等待,如果需要一些时间,请不要惊慌。如果失败,将为您提供详细的确切错误消息,以便您可以继续解决问题。
请注意,在此示例中,Kubernetes集群没有足够的资源来创建应用程序的副本。请务必检查您的Kubernetes仪表板,了解有关部署的更多详细信息。如果出现此类错误,您将看到类似于上图的内容。
我们想要结束的是关于我们工作流程的绿色成功通知,如下所示:
在Azure Arc Kubernetes中运行和验证
成功部署后,我们可以使用以下命令从终端验证Pod和服务:
kubectl get po
kubectltl get svc
第二个命令为我们提供了用于应用程序的外部IP和端口。根据您的Kubernetes集群,您可能需要转发端口或创建隧道来访问应用程序。
现在,我们只需要在浏览器中键入外部IP和端口即可访问该应用程序。
如果正确执行了这些步骤,则可以访问应用程序并与应用程序交互以测试功能。
结论
在本系列中,我们亲身体验了如何通过Azure Arc设置和管理非Azure托管的Kubernetes群集。在本文中,我们介绍了如何创建可以将映像部署到现有已启用Arc的Kubernetes集群的GitHub操作管道,如何运行管道,然后确保我们选择的容器映像按预期在集群中启动并运行。这标志着这个由三部分组成的系列的最后一篇文章!
有关如何部署到已启用Azure Arc的Kubernetes群集的详细信息,请务必查看文章使用群集连接和GitHub操作将应用部署到启用了Azure-Arc的Kubernetes群集。
若要详细了解如何开始使用已启用Azure Arc的Kubernetes,或者启用Azure Arc的Kubernetes如何允许你附加和配置在任何地方运行的Kubernetes群集,请查看有关已启用Azure Arc的Kubernetes的资源页面。
https://www.codeproject.com/Articles/5334368/Azure-Arc-Enabled-Kubernetes-Part-3-Deploying-Cont