在此快速入门中,您将学习如何:
- 使用 Azure CLI 创建具有 OS Guard(预览版)AKS 群集的 Azure Linux。
- 使用 kubectl 连接到群集。
- 在群集中运行示例多容器应用程序。
Important
从 2026 年 12 月 10 日开始,Azure Kubernetes 服务 (AKS)不再支持使用适用于 AKS 的 OS Guard Azure Linux(预览版)。 此时,AKS 不再使用 OS Guard 节点映像生成新的 Azure Linux 或提供安全修补程序,并且不能再使用 OS Guard Azure Linux 创建新节点池。 2027 年 3 月 10 日,AKS 删除所有具有 OS Guard 节点映像的现有 Azure Linux,这会导致缩放和修正(重置映像和重新部署)操作失败。 为了避免中断,请迁移到Azure容器 Linux (ACL)。 有关此停用的详细信息,请参阅停用GitHub问题和Azure更新停用公告。 若要随时了解公告和更新,请按照 AKS 发行说明进行操作。
Note
带有 OS Guard(预览版)的 Azure Linux 正被 Azure Container Linux(ACL)取代。
Azure容器 Linux 是用于Azure Kubernetes 服务 (AKS)的长期、不可变、容器优化的 Linux 操作系统(OS)。 它提供了一个安全、最少且可操作一致的主机 OS,旨在大规模运行容器化工作负荷。
有关详细信息,请参阅 Azure 容器 Linux (ACL) 概述。
先决条件
-
如果您没有 Azure 试用订阅,请在开始之前创建 试用订阅。
如果想要在本地运行 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。
- 如果使用本地安装,请使用
Azure Linux 使用 OS Guard 时的注意事项和限制
在开始之前,请查看以下 Azure Linux 与 OS Guard 的注意事项和限制(预览版):
- 使用 OS Guard 的 Azure Linux 需要 Kubernetes 版本 1.32.0 或更高版本。
- 所有具有 OS Guard 映像的 Azure Linux 都启用了 联邦信息进程标准(FIPS) 和 受信任的启动 。
- 在 AKS 上的 Azure Linux,只有 Azure CLI 和 ARM 模板这两种部署方法受支持,并且 OS Guard 目前处于预览状态。 不支持 PowerShell 和 Terraform。
-
NodeImage和None是唯一受支持的操作系统(OS)升级通道,适用于在 AKS 上使用 OS Guard 的 Azure Linux。Unmanaged和SecurityPatch与带有 OS Guard 的 Azure Linux 不兼容,因为 /usr 目录是不可变的。 - 不支持工件流式传输。
- 不支持 Pod Sandboxing。
- 不支持机密虚拟机(CVM)。
- 不支持第 1 代虚拟机(VM)。
安装 aks-preview Azure CLI 扩展
Important
AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
使用 aks-preview 命令安装 az extension add 扩展。
az extension add --name aks-preview
使用aks-preview命令将az extension update扩展更新到最新版本。
az extension update --name aks-preview
注册 AzureLinuxOSGuardPreview 功能标志
使用
AzureLinuxOSGuardPreview命令注册az feature register功能标志。az feature register --namespace "Microsoft.ContainerService" --name "AzureLinuxOSGuardPreview"几分钟后,状态将显示为“已注册”。
使用
az feature show命令验证注册状态。az feature show --namespace "Microsoft.ContainerService" --name "AzureLinuxOSGuardPreview"当状态反映为已注册时,使用 命令刷新
az provider register资源提供程序的注册。az provider register --namespace "Microsoft.ContainerService"
设置环境变量。
设置以下环境变量,为每个部署创建唯一的资源名称。 将 <your-resource-group-name>、<your-region> 和 <your-cluster-name> 替换为您自己的值。 可以选择使用 openssl rand -hex 3 命令生成随机字符串,以追加到资源组和群集名称(例如 export RESOURCE_GROUP="myResourceGroup$RANDOM_ID")。
# Create random string
export RANDOM_ID="$(openssl rand -hex 3)"
# Set environment variables
export RESOURCE_GROUP="<your-resource-group-name>"
export REGION="<your-region>"
export CLUSTER_NAME="<your-cluster-name>"
创建资源组
Azure 资源组是用于部署和管理 Azure 资源的逻辑组。 在Azure中创建资源组时,需要指定位置。 此位置是资源组元数据的存储位置,如果在创建资源时未指定其他区域,则资源在Azure中运行的位置。
使用 az group create 命令创建资源组。
az group create --name $RESOURCE_GROUP --location $REGION
示例输出:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUPxxxxxx",
"location": "$REGION",
"managedBy": null,
"name": "$RESOURCE_GROUPxxxxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
使用 OS Guard 群集创建 Azure Linux
使用 az aks create 命令和 --os-sku 参数创建一个 AKS 群集,以使用带有 OS Guard 映像的 Azure Linux 进行预配。
az aks create --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --os-sku AzureLinuxOSGuard --node-osdisk-type Managed --enable-fips-image --enable-secure-boot --enable-vtpm
片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。
连接至群集
若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 若要在本地安装 kubectl,请使用 az aks install-cli 命令。
使用
kubectl命令将az aks get-credentials配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME使用
kubectl get命令验证与群集之间的连接。 此命令将返回群集节点的列表。kubectl get nodes
部署应用程序
若要部署应用程序,请使用清单文件创建运行 AKS Store 应用程序所需的所有对象。 Kubernetes 清单文件定义群集的所需状态,例如要运行的容器映像。 该清单包含以下 Kubernetes 部署和服务:
- 门店:Web 应用程序,供客户查看产品和下单。
- 产品服务:显示产品信息。
- 订单服务:负责下单。
- Rabbit MQ:工单队列的消息队列。
Note
不建议在没有持久性存储用于生产的情况下,运行有状态容器(例如 Rabbit MQ)。 此处使用这些服务是为了简单起见,但我们建议使用托管服务,例如Azure Cosmos DB或Azure 服务总线。
创建名为
aks-store-quickstart.yaml的文件,并将以下清单复制到其中:apiVersion: apps/v1 kind: StatefulSet metadata: name: rabbitmq spec: serviceName: rabbitmq replicas: 1 selector: matchLabels: app: rabbitmq template: metadata: labels: app: rabbitmq spec: nodeSelector: "kubernetes.io/os": linux containers: - name: rabbitmq image: mcr.azk8s.cn/mirror/docker/library/rabbitmq:3.10-management-alpine ports: - containerPort: 5672 name: rabbitmq-amqp - containerPort: 15672 name: rabbitmq-http env: - name: RABBITMQ_DEFAULT_USER value: "username" - name: RABBITMQ_DEFAULT_PASS value: "password" resources: requests: cpu: 10m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: rabbitmq-enabled-plugins mountPath: /etc/rabbitmq/enabled_plugins subPath: enabled_plugins volumes: - name: rabbitmq-enabled-plugins configMap: name: rabbitmq-enabled-plugins items: - key: rabbitmq_enabled_plugins path: enabled_plugins --- apiVersion: v1 data: rabbitmq_enabled_plugins: | [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0]. kind: ConfigMap metadata: name: rabbitmq-enabled-plugins --- apiVersion: v1 kind: Service metadata: name: rabbitmq spec: selector: app: rabbitmq ports: - name: rabbitmq-amqp port: 5672 targetPort: 5672 - name: rabbitmq-http port: 15672 targetPort: 15672 type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: order-service spec: replicas: 1 selector: matchLabels: app: order-service template: metadata: labels: app: order-service spec: nodeSelector: "kubernetes.io/os": linux containers: - name: order-service image: ghcr.io/azure-samples/aks-store-demo/order-service:latest ports: - containerPort: 3000 env: - name: ORDER_QUEUE_HOSTNAME value: "rabbitmq" - name: ORDER_QUEUE_PORT value: "5672" - name: ORDER_QUEUE_USERNAME value: "username" - name: ORDER_QUEUE_PASSWORD value: "password" - name: ORDER_QUEUE_NAME value: "orders" - name: FASTIFY_ADDRESS value: "0.0.0.0" resources: requests: cpu: 1m memory: 50Mi limits: cpu: 75m memory: 128Mi startupProbe: httpGet: path: /health port: 3000 failureThreshold: 5 initialDelaySeconds: 20 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 3000 failureThreshold: 3 initialDelaySeconds: 3 periodSeconds: 5 livenessProbe: httpGet: path: /health port: 3000 failureThreshold: 5 initialDelaySeconds: 3 periodSeconds: 3 initContainers: - name: wait-for-rabbitmq image: busybox command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;'] resources: requests: cpu: 1m memory: 50Mi limits: cpu: 75m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: order-service spec: type: ClusterIP ports: - name: http port: 3000 targetPort: 3000 selector: app: order-service --- apiVersion: apps/v1 kind: Deployment metadata: name: product-service spec: replicas: 1 selector: matchLabels: app: product-service template: metadata: labels: app: product-service spec: nodeSelector: "kubernetes.io/os": linux containers: - name: product-service image: ghcr.io/azure-samples/aks-store-demo/product-service:latest ports: - containerPort: 3002 env: - name: AI_SERVICE_URL value: "http://ai-service:5001/" resources: requests: cpu: 1m memory: 1Mi limits: cpu: 2m memory: 20Mi readinessProbe: httpGet: path: /health port: 3002 failureThreshold: 3 initialDelaySeconds: 3 periodSeconds: 5 livenessProbe: httpGet: path: /health port: 3002 failureThreshold: 5 initialDelaySeconds: 3 periodSeconds: 3 --- apiVersion: v1 kind: Service metadata: name: product-service spec: type: ClusterIP ports: - name: http port: 3002 targetPort: 3002 selector: app: product-service --- apiVersion: apps/v1 kind: Deployment metadata: name: store-front spec: replicas: 1 selector: matchLabels: app: store-front template: metadata: labels: app: store-front spec: nodeSelector: "kubernetes.io/os": linux containers: - name: store-front image: ghcr.io/azure-samples/aks-store-demo/store-front:latest ports: - containerPort: 8080 name: store-front env: - name: VUE_APP_ORDER_SERVICE_URL value: "http://order-service:3000/" - name: VUE_APP_PRODUCT_SERVICE_URL value: "http://product-service:3002/" resources: requests: cpu: 1m memory: 200Mi limits: cpu: 1000m memory: 512Mi startupProbe: httpGet: path: /health port: 8080 failureThreshold: 3 initialDelaySeconds: 5 periodSeconds: 5 readinessProbe: httpGet: path: /health port: 8080 failureThreshold: 3 initialDelaySeconds: 3 periodSeconds: 3 livenessProbe: httpGet: path: /health port: 8080 failureThreshold: 5 initialDelaySeconds: 3 periodSeconds: 3 --- apiVersion: v1 kind: Service metadata: name: store-front spec: ports: - port: 80 targetPort: 8080 selector: app: store-front type: LoadBalancer如果在本地创建并保存 YAML 文件,则可以通过选择“上传/下载文件”按钮并从本地文件系统中选择文件,将清单文件上传到 CloudShell 中的默认目录。
使用
kubectl apply命令部署应用程序,并指定 YAML 清单的名称。kubectl apply -f aks-store-quickstart.yaml
测试应用程序
可以通过访问公共 IP 地址或应用程序 URL 来验证应用程序是否正在运行。
使用以下命令来获取应用程序 URL:
runtime="5 minutes"
endtime=$(date -ud "$runtime" +%s)
while [[ $(date -u +%s) -le $endtime ]]
do
STATUS=$(kubectl get pods -l app=store-front -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}')
echo $STATUS
if [ "$STATUS" == 'True' ]
then
export IP_ADDRESS=$(kubectl get service store-front --output 'jsonpath={..status.loadBalancer.ingress[0].ip}')
echo "Service IP Address: $IP_ADDRESS"
break
else
sleep 10
fi
done
curl $IP_ADDRESS
结果:
<!doctype html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="/favicon.ico">
<title>store-front</title>
<script defer="defer" src="/js/chunk-vendors.df69ae47.js"></script>
<script defer="defer" src="/js/app.7e8cfbb2.js"></script>
<link href="/css/app.a5dc49f6.css" rel="stylesheet">
</head>
<body>
<div id="app"></div>
</body>
</html>
echo "You can now visit your web server at $IP_ADDRESS"
删除群集
不再需要时可以清理不必要的资源,避免产生 Azure 费用。
使用 az group delete 命令删除Azure资源组和所有相关资源。
az group delete --name $RESOURCE_GROUP --yes --no-wait
相关内容
在本快速入门中,你部署了包含 OS Guard 群集的 Azure Linux。 若要详细了解如何使用 OS Guard Azure Linux,请参阅以下资源: