使用 Azure CLI 创建 Kubernetes 群集

适用于:Azure 本地版本 23H2

本文介绍如何使用 Azure CLI 在 Azure 本地中创建 Kubernetes 群集。 工作流如下:

  1. 使用 Azure CLI 在 Azure 本地版本 23H2 中创建 Kubernetes 群集。 默认情况下,群集已连接 Azure Arc。
  2. 创建群集时,提供一个Microsoft Entra 组,其中包含具有 Kubernetes 群集管理员访问权限的 Microsoft Entra 用户列表。
  3. 使用 kubectl 和 Microsoft Entra ID 访问群集。
  4. 在该群集中运行一个包含 Web 前端和 Redis 实例的示例多容器应用程序。

开始之前

  • 在开始之前,请确保本地基础结构管理员具有以下详细信息:
    • Azure 订阅 ID - Azure 本地用于部署和注册的 Azure 订阅 ID。
    • 自定义位置 ID - Azure 资源管理器自定义位置的 ID。 自定义位置是在 Azure 本地群集部署期间配置的。 基础结构管理员应提供自定义位置资源管理器 ID。 若要创建 Kubernetes 群集,需要此参数。 如果基础结构管理员提供自定义位置名称和资源组名称,还可以使用 az customlocation show --name "<custom location name>" --resource-group <azure resource group> --query "id" -o tsv 获取资源管理器 ID。
    • 网络 ID - 执行以下步骤创建的 Azure 本地逻辑网络的 Azure 资源管理器 ID。 管理员应提供逻辑网络的 ID。 若要创建 Kubernetes 群集,需要此参数。 如果知道在其中创建了逻辑网络的资源组,还可以使用 az stack-hci-vm network lnet show --name "<lnet name>" --resource-group <azure resource group> --query "id" -o tsv Azure 资源管理器 ID。
  • 可以在本地开发计算机上运行本文中的步骤,在远程 Azure 本地部署上创建 Kubernetes 群集。 请确保开发计算机上具有最新版本的 Az CLI 。 还可以选择使用 az upgrade 升级 Az CLI 版本。
  • 若要从任意位置连接到 Kubernetes 群集,请创建一个Microsoft Entra 组并向其添加成员。 Microsoft Entra 组中的所有成员都具有群集管理员访问权限。 请务必将自己添加为Microsoft Entra 组的成员。 如果不自行添加,则无法使用 kubectl 访问 Kubernetes 群集。 有关创建Microsoft Entra 组和添加用户的详细信息,请参阅 “管理Microsoft Entra 组和组成员身份
  • 在开发计算机上下载并安装 kubectl 。 借助 Kubernetes 命令行工具 kubectl,可以针对 Kubernetes 群集运行命令。 可以使用 kubectl 部署应用程序、检查和管理群集资源以及查看日志。

安装 Azure CLI 扩展

运行以下命令以安装所需的 Azure CLI 扩展:

az extension add -n aksarc --upgrade
az extension add -n customlocation --upgrade
az extension add -n stack-hci-vm --upgrade
az extension add -n connectedk8s --upgrade

创建 Kubernetes 群集

使用 az aksarc create 命令在 AKS Arc 中创建 Kubernetes 群集。在运行此命令之前,请确保登录到 Azure。 如果有多个 Azure 订阅,请使用 az account set 命令选择相应的订阅 ID。

az aksarc create -n $aksclustername -g $resource_group --custom-location $customlocationID --vnet-ids $logicnetId --aad-admin-group-object-ids $aadgroupID --generate-ssh-keys 

片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。

注意

  • SSH 密钥值是用于访问预配群集中的节点的公钥。 默认情况下,此键位于 ~/.ssh/id_rsa.pub. 可以在创建群集期间使用 --ssh-key-value 参数指定其他位置。
  • --generate-ssh-keys如果本地计算机上没有预先存在的 SSH 密钥,则需要此参数。 如果在创建群集期间不包含此参数,并且不存在 SSH 密钥,则会收到错误消息。
  • 如果本地计算机上已有 SSH 密钥,AKS 群集将重复使用该密钥。 在这种情况下,指定 --generate-ssh-keys或省略该参数不起作用。

重要

若要对 AKS 群集使用 Azure RBAC 或工作负荷标识,必须在使用 Azure CLI 创建群集期间传递所需的参数。 目前不支持更新现有 AKS 群集以启用工作负荷标识和/或 Azure RBAC。 有关详细信息,请参阅 使用 Azure RBAC 进行 Kubernetes 授权部署和配置群集的工作负荷标识。

连接到 Kubernetes 群集

现在,可以通过从开发计算机运行 az connectedk8s proxy 命令连接到 Kubernetes 群集。 在运行此命令之前,请确保登录到 Azure。 如果有多个 Azure 订阅,请使用 az account set 命令选择相应的订阅 ID。

此命令将 Kubernetes 群集的 kubeconfig 下载到开发计算机,并将代理连接通道打开到本地 Kubernetes 群集。 只要命令运行,通道就处于打开状态。 请让此命令保持运行,直到你不再想要访问群集为止。 如果超时,请关闭 CLI 窗口,打开一个新的窗口,然后再次运行该命令。

必须对托管 Kubernetes 群集的资源组具有参与者权限才能成功运行以下命令:

az connectedk8s proxy --name $aksclustername --resource-group $resource_group --file .\aks-arc-kube-config

预期输出:

Proxy is listening on port 47011
Merged "aks-workload" as current context in .\\aks-arc-kube-config
Start sending kubectl requests on 'aks-workload' context using
kubeconfig at .\\aks-arc-kube-config
Press Ctrl+C to close proxy.

使此会话保持运行状态,并从其他终端/命令提示符连接到 Kubernetes 群集。 通过运行 kubectl get 命令验证是否可以连接到 Kubernetes 群集。 此命令返回群集节点的列表:

kubectl get node -A --kubeconfig .\aks-arc-kube-config

以下输出示例显示了在前面的步骤中创建的节点。 确保节点状态为 Ready

NAME             STATUS ROLES                AGE VERSION
moc-l0ttdmaioew  Ready  control-plane,master 34m v1.24.11
moc-ls38tngowsl  Ready  <none>               32m v1.24.11

部署应用程序

Kubernetes 清单文件定义群集的所需状态,例如,要运行哪些容器映像。

可以使用清单创建运行 Azure Vote 应用程序所需的所有对象。 此清单包含两个 Kubernetes 部署

  • 示例 Azure Vote Python 应用程序。
  • 一个 Redis 实例。

还会创建两个 Kubernetes 服务

  • Redis 实例的内部服务。
  • 用于通过 Internet 访问 Azure Vote 应用程序的外部服务。

创建名为 azure-vote.yaml 的文件,并在以下清单中复制:

apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: azure-vote-back 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: azure-vote-back 
      template: 
        metadata: 
          labels: 
            app: azure-vote-back 
        spec: 
          nodeSelector: 
            "kubernetes.io/os": linux 
          containers: 
          - name: azure-vote-back 
            image: <path to image>/oss/bitnami/redis:6.0.8 
            env: 
            - name: ALLOW_EMPTY_PASSWORD 
              value: "yes" 
            resources: 
              requests: 
                cpu: 100m 
                memory: 128Mi 
              limits: 
                cpu: 250m 
                memory: 256Mi 
            ports: 
            - containerPort: 6379 
              name: redis 
    ---
    apiVersion: v1
    kind: Service 
    metadata: 
      name: azure-vote-back 
    spec: 
      ports: 
      - port: 6379 
      selector: 
        app: azure-vote-back 
    --- 
    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: azure-vote-front 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: azure-vote-front 
      template: 
        metadata: 
          labels: 
            app: azure-vote-front 
        spec: 
          nodeSelector: 
            "kubernetes.io/os": linux 
          containers: 
          - name: azure-vote-front 
            image: <path to image>/azure-vote-front:v1 
            resources: 
              requests: 
                cpu: 100m 
                memory: 128Mi 
              limits: 
                cpu: 250m 
                memory: 256Mi 
            ports: 
            - containerPort: 80 
            env: 
            - name: REDIS 
              value: "azure-vote-back" 
    --- 
    apiVersion: v1 
    kind: Service 
    metadata: 
      name: azure-vote-front 
    spec: 
      type: LoadBalancer 
      ports: 
      - port: 80 
      selector: 
        app: azure-vote-front

使用 kubectl apply 命令部署应用程序,并指定 YAML 的名称:

kubectl apply -f azure-vote.yaml --kubeconfig .\\aks-arc-kube-config

以下示例输出显示已成功创建了部署和服务:

deployment "azure-vote-back" created
service "azure-vote-back" created
deployment "azure-vote-front" created
service "azure-vote-front" created

测试应用程序

应用程序运行时,Kubernetes 服务将向 Internet 公开应用程序前端。 此过程可能需要几分钟才能完成。

使用带参数的 kubectl get service 命令 --watch 监视进度。

kubectl get service azure-vote-front --watch --kubeconfig .\aks-arc-kube-config

azure-vote-front 服务的 EXTERNAL-IP 输出最初显示为 挂起

NAME             TYPE         CLUSTER-IP EXTERNAL-IP PORT(S)      AGE
azure-vote-front LoadBalancer 10.0.37.27 <pending>   80:30572/TCP 6s

当 EXTERNAL-IP 地址从 挂起 更改为实际的公共 IP 地址后,使用 CTRL-C 停止 kubectl 监视过程。 以下示例输出显示向服务分配了有效的公共 IP 地址:

azure-vote-front LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 2m

若要查看 Azure Vote 应用的实际效果,请打开 Web 浏览器并转到服务的外部 IP 地址。

删除群集

az aksarc delete运行以下命令以清理创建的群集:

az aksarc delete --resource-group $aksclustername --name $resource_group

后续步骤