已启用Azure Arc的Kubernetes第3部分:部署容器

目录

先决条件

Azure设置

服务原则

Azure容器注册表

验证Azure Arc Services

启用群集连接

向服务主体授予权限

Web应用程序

设置变量

创建GitHub操作管道

GitHub密钥

设置工作流

运行工作流

在Azure Arc Kubernetes中运行和验证

结论


在这里,我们选择一个通过Web界面公开简单服务的现有容器映像,逐步演示如何创建可以将映像部署到我们现有的已启用ArcKubernetes集群中的GitHub Actions管道,并展示如何运行管道,然后演示一旦完成,我们选择的容器映像将按预期在我们的集群中启动并运行。

在本系列的第三部分也是最后一部分中,我们将探讨如何将容器部署到启用了Azure ArcKubernetes群集上。

先决条件

对于本教程,您需要以下内容:

  • 有效的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_NAMERESOURCE_GROUPCLUSTER_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群集。在本文中,我们介绍了如何创建可以将映像部署到现有已启用ArcKubernetes集群的GitHub操作管道,如何运行管道,然后确保我们选择的容器映像按预期在集群中启动并运行。这标志着这个由三部分组成的系列的最后一篇文章!

有关如何部署到已启用Azure ArcKubernetes群集的详细信息,请务必查看文章使用群集连接和GitHub操作将应用部署到启用了Azure-Arc的Kubernetes群集

若要详细了解如何开始使用已启用Azure ArcKubernetes,或者启用Azure ArcKubernetes如何允许你附加和配置在任何地方运行的Kubernetes群集,请查看有关已启用Azure Arc的Kubernetes的资源页面

https://www.codeproject.com/Articles/5334368/Azure-Arc-Enabled-Kubernetes-Part-3-Deploying-Cont

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值