你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 ARM 模板部署具有 OS Guard 的 Azure Linux(预览版)AKS 群集

使用 Azure 资源管理器 (ARM) 模板部署 Azure Linux 容器主机群集,从而开始使用 Azure Linux 容器主机。 安装必备组件后,将安装 aks-preview Azure CLI 扩展、注册 AzureLinuxOSGuardPreview 功能标志、创建 SSH 密钥对、查看模板、部署模板并对其进行验证,然后部署应用程序。

Azure 资源管理器模板是一个 JavaScript 对象表示法(JSON)文件,用于定义项目的基础结构和配置。 模板使用声明性语法。 你可以在不编写用于创建部署的编程命令序列的情况下,描述预期部署。

注意事项和限制

在开始之前,请查看以下 Azure Linux 与 OS Guard 的注意事项和限制(预览版):

  • 使用 OS Guard 的 Azure Linux 需要 Kubernetes 版本 1.32.0 或更高版本。
  • 所有带操作系统防护的 Azure Linux 均已启用联邦信息处理标准 (FIPS)受信任启动
  • 在 AKS 上的 Azure Linux,只有 Azure CLI 和 ARM 模板这两种部署方法受支持,并且 OS Guard 目前处于预览状态。 不支持 PowerShell 和 Terraform。
  • 在预览版中,带操作系统防护的 Azure Linux 在 AKS 上不支持 Arm64 映像。
  • 对于 AKS 上带操作系统防护的 Azure Linux,唯一支持的 OS 升级通道NodeImageNone。 由于 /usr 目录不可变,UnmanagedSecurityPatch 与带操作系统防护的 Azure Linux 不兼容。
  • 不支持项目流式处理
  • 不支持 Pod 沙盒化
  • 不支持机密虚拟机(CVM)。
  • 不支持第 1 代虚拟机(VM)。

先决条件

  • 如果没有 Azure 帐户,请在开始前创建一个免费帐户

  • Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 快速入门 - Bash

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI 配合使用

    • 运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade

  • 如果尚未安装 kubectl,请使用 az aks install-cli 或按照上游说明通过 Azure CLI 安装它。

  • 若要使用资源管理器模板创建 AKS 群集,请提供 SSH 公钥。 如果需要此资源,请参阅以下部分;否则请跳到查看模板部分。

  • 用于创建群集的标识具有合适的的最低权限。 有关 AKS 的访问和标识的详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的访问和标识选项

  • 若要部署 Bicep 文件或 ARM 模板,需要对要部署的资源具有写入权限,并且需要对 Microsoft.Resources/deployments 资源类型的所有操作具有访问权限。 例如,若要部署虚拟机,需要 Microsoft.Compute/virtualMachines/write 和 Microsoft.Resources/deployments/* 权限。 有关角色和权限的列表,请参阅 Azure 内置角色

安装 aks-preview Azure CLI 扩展

重要

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

若要安装 aks-preview 扩展,请运行以下命令:

az extension add --name aks-preview

运行以下命令以更新到已发布的最新扩展版本:

az extension update --name aks-preview

注册 AzureLinuxOSGuardPreview 功能标志

使用 [az feature register][az-feature-register] 命令注册AzureLinuxOSGuardPreview特性标志,如以下示例所示:

az feature register --namespace "Microsoft.ContainerService" --name "AzureLinuxOSGuardPreview"

几分钟后,状态将显示为“已注册”。 使用 [az feature show][az-feature-show] 命令验证注册状态:

az feature show --namespace "Microsoft.ContainerService" --name "AzureLinuxOSGuardPreview"

当状态反映 已注册时,请使用 [az provider register][az-provider-register] 命令刷新 Microsoft.ContainerService 资源提供程序的注册:

az provider register --namespace "Microsoft.ContainerService"

创建 SSH 密钥对

若要访问 AKS 节点,请使用通过 ssh-keygen 命令生成的 SSH 密钥对(公钥和私钥)进行连接。 默认情况下,这些文件在 ~/.ssh 目录中创建。 运行 ssh-keygen 命令会覆盖给定位置中同名的任何 SSH 密钥对。

  1. 在浏览器中访问 https://shell.azure.com 以打开 Cloud Shell。

  2. 运行 ssh-keygen 命令。 以下示例使用 RSA 加密和 4096 位长度创建 SSH 密钥对:

    ssh-keygen -t rsa -b 4096
    

有关创建 SSH 密钥的详细信息,请参阅在 Azure 中创建和管理用于身份验证的 SSH 密钥

查看模板

以下部署使用 Azure 快速入门模板中的 ARM 模板。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.1",
    "parameters": {
        "clusterName": {
            "defaultValue": "osguardakscluster",
            "type": "String",
            "metadata": {
                "description": "The name of the Managed Cluster resource."
            }
        },
        "location": {
            "defaultValue": "[resourceGroup().location]",
            "type": "String",
            "metadata": {
                "description": "The location of the Managed Cluster resource."
            }
        },
        "dnsPrefix": {
            "type": "String",
            "metadata": {
                "description": "Optional DNS prefix to use with hosted Kubernetes API server FQDN."
            }
        },
        "agentCount": {
            "defaultValue": 3,
            "minValue": 1,
            "maxValue": 50,
            "type": "Int",
            "metadata": {
                "description": "The number of nodes for the cluster."
            }
        },
        "agentVMSize": {
            "defaultValue": "Standard_DS2_v2",
            "type": "String",
            "metadata": {
                "description": "The size of the Virtual Machine."
            }
        },
        "osSKU": {
            "defaultValue": "AzureLinuxOSGuard",
            "allowedValues": [
                "AzureLinuxOSGuard",
                "AzureLinux3OSGuard"
            ],
            "type": "String",
            "metadata": {
                "description": "The Linux SKU to use."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.ContainerService/managedClusters",
            "apiVersion": "2025-05-01",
            "name": "[parameters('clusterName')]",
            "location": "[parameters('location')]",
            "identity": {
                "type": "SystemAssigned"
            },
            "properties": {
                "dnsPrefix": "[parameters('dnsPrefix')]",
                "agentPoolProfiles": [
                    {
                        "name": "agentpool",
                        "mode": "System",
                        "count": "[parameters('agentCount')]",
                        "vmSize": "[parameters('agentVMSize')]",
                        "osType": "Linux",
                        "osSKU": "[parameters('osSKU')]",
                        "osDiskType": "Managed",
                        "enableFIPS": true,
                        "securityProfile": {
                            "enableSecureBoot": true,
                            "enableVTPM": true
                        },
                    }
                ]
            }
        }
    ],
    "outputs": {
        "controlPlaneFQDN": {
            "type": "String",
            "value": "[reference(parameters('clusterName')).fqdn]"
        }
    }
}

若要将具有 OS Guard 的 Azure Linux 添加到现有 ARM 模板,需要添加:

  • "osSKU": "AzureLinuxOSGuard"
  • "mode": "System"agentPoolProfiles
  • "osDiskType": "Managed"agentPoolProfiles
  • "enableFIPS": trueagentPoolProfiles
  • "securityProfile": {enableSecureBoot: true enableVTPM: true}agentPoolProfiles
  • 将 apiVersion 设置为 2025-05-01 或更高版本("apiVersion": "2025-05-01")。

部署模板

  1. 选择以下按钮登录到 Azure 并打开一个模板。

    用于将资源管理器模板部署到 Azure 的按钮。

  2. 选择或输入以下值。

    对于本快速入门,请保留“OS 磁盘大小(GB)”、“代理计数”、“代理 VM 大小”、“OS 类型”和“Kubernetes 版本”的默认值。 为以下模板参数提供自己的值:

    • 订阅:选择 Azure 订阅。
    • 资源组:选择“新建”。 输入资源组的唯一名称,例如 testAzureLinuxOSGuardResourceGroup,然后选择 “确定”。
    • 位置:选择一个位置,例如“美国东部”。
    • 群集名称:输入 AKS 群集的唯一名称,例如 testAzureLinuxOSGuardCluster
    • DNS 前缀:输入群集的唯一 DNS 前缀,例如 myAzureLinuxOSGuardCluster
    • Linux 管理员用户名:输入一个用户名用于通过 SSH 进行连接,例如 azureUser。
    • SSH RSA 公钥:复制并粘贴 SSH 密钥对的 public 部分(默认为 ~/.ssh/id_rsa.pub 的内容)。
  3. 选择 审阅 + 创建

使用 OS Guard 群集创建 Azure Linux 需要几分钟时间。 等待群集成功部署,然后转到下一步骤。

验证部署

连接至群集

若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl

  1. 使用 kubectl 命令在本地安装 az aks install-cli

    az aks install-cli
    
  2. 使用 kubectl 命令将 az aks get-credentials 配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。

    az aks get-credentials --resource-group testAzureLinuxOSGuardResourceGroup --name testAzureLinuxCluster
    
  3. 使用 kubectl get 命令验证与群集之间的连接。 此命令将返回群集节点的列表。

    kubectl get nodes
    

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

    NAME                       STATUS   ROLES   AGE     VERSION
    aks-agentpool-41324942-0   Ready    agent   6m44s   v1.12.6
    aks-agentpool-41324942-1   Ready    agent   6m46s   v1.12.6
    aks-agentpool-41324942-2   Ready    agent   6m45s   v1.12.6
    

部署应用程序

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

在本快速入门中,你将使用清单来创建运行 Azure Vote 应用程序所需的所有对象。 此清单包含两个 Kubernetes 部署:

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

此外,还会创建两个 Kubernetes 服务

  • Redis 实例的内部服务。
  • 用于通过 Internet 访问 Azure Vote 应用程序的外部服务。
  1. 创建名为 azure-vote.yaml 的文件。

    • 如果使用 Azure Cloud Shell,则可以使用 codevinano 来创建此文件,就像在虚拟或物理系统中操作一样
  2. 复制以下 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: mcr.microsoft.com/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: mcr.microsoft.com/azuredocs/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
    

    有关 YAML 清单文件的明细,请参阅部署和 YAML 清单

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

    kubectl apply -f azure-vote.yaml
    

    以下示例类似于显示已成功创建部署和服务的输出:

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

测试应用程序

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

使用带有 参数的 --watch 命令来监视进度。

kubectl get service azure-vote-front --watch

服务的 azure-vote-front 输出最初显示为 pending

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-Ckubectl。 以下示例输出显示向服务分配了有效的公共 IP 地址:

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

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

浏览到 Azure Vote 示例应用程序的屏幕截图。

删除群集

如果不打算继续学习以下教程,为避免产生 Azure 费用,请清理任何不必要的资源。 使用 az group delete 命令移除资源组和所有相关资源。

az group delete --name testAzureLinuxOSGuardCluster --yes --no-wait

后续步骤

在本快速入门中,你部署了包含 OS Guard 群集的 Azure Linux。 若要详细了解使用 OS Guard 的 Azure Linux,并演练完整的群集部署和管理示例,请继续学习 Azure Linux with OS Guard 教程。