在本快速入门中,你将使用Azure CLI创建一个Azure Kubernetes 服务 (AKS)群集,该群集作为节点操作系统(OS)运行Azure容器 Linux(ACL)。 部署群集后,使用它进行 kubectl 连接,并验证 ACL 节点是否按预期运行。
注意事项和限制
在开始之前,请了解以下有关 ACL 的注意事项和限制:
- ACL 自 AKS v1.34 起正式发布。
- ACL 需要有安全启动和 vTPM 的受信任启动。 非受信任启动版本不可用。
- Arm64 上的 ACL 要求使用基于 Cobalt 的 (v6) SKU,以支持受信任启动兼容性。
-
NodeImage和None是仅受支持的 OS 升级通道。Unmanaged和SecurityPatch由于不可变的/usr目录而与 ACL 不兼容。 - 不支持工件流式传输。
- 不支持 Pod Sandboxing。
- 不支持机密虚拟机(CVM)。
- 不支持第 1 代 VM。
- 尚不支持已启用 FIPS 的节点。
先决条件
Note
可以使用 Azure Cloud Shell 或Azure CLI的本地安装来运行本快速入门中的命令。
- 如果在本地运行Azure CLI,安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
- 如果使用本地安装,请使用
az login命令登录到Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。 - 如果收到系统提示,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI 配合使用。
- 使用
az version命令查找已安装的Azure CLI版本和依赖库。 Azure容器 Linux 需要Azure CLI 2.86.0 或更高版本。 若要升级到最新版本,请使用az upgrade命令。 - 如果需要,请在你的 Azure 订阅中注册 Microsoft.ContainerService 资源提供程序。
注册 Microsoft.ContainerService 资源提供程序
可能需要在你的Azure订阅中注册资源提供者。 使用 az provider show 命令检查注册状态。
az provider show --namespace Microsoft.ContainerService --query registrationState
如有必要,请使用 az provider register 命令注册资源提供程序。
az provider register --namespace Microsoft.ContainerService
创建资源组
Azure 资源组是用于部署和管理 Azure 资源的逻辑组。 创建资源组时,需要指定位置。 此位置为:
- 资源组元数据的存储位置。
- 在创建资源时未指定另一个区域时,资源在 Azure 中的运行位置。
使用 az group create 命令创建资源组。 以下示例为资源组名称、区域和 AKS 群集名称设置环境变量,然后在指定位置创建资源组。 可以将环境变量的值替换为自己的首选名称和区域。
export MY_RESOURCE_GROUP_NAME="myACLResourceGroup"
export REGION="westus"
export MY_AKS_CLUSTER_NAME="myACLCluster"
az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION
示例输出:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myACLResourceGroup",
"location": "westus",
"managedBy": null,
"name": "myACLResourceGroup",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
创建 ACL 群集
使用带有 az aks create 参数的 --os-sku AzureContainerLinux 命令创建 AKS 群集,以使用 ACL 映像预配该 AKS 群集。
az aks create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_AKS_CLUSTER_NAME \
--os-sku AzureContainerLinux \
--node-count 3 \
--generate-ssh-keys
片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。
连接至群集
若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 若要在本地安装 kubectl,请使用 az aks install-cli 命令。
使用
kubectl命令将az aks get-credentials配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。az aks get-credentials --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_AKS_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 --- 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 resources: requests: cpu: 1m memory: 1Mi limits: cpu: 1m memory: 7Mi --- 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 --- apiVersion: v1 kind: Service metadata: name: store-front spec: ports: - port: 80 targetPort: 8080 selector: app: store-front type: LoadBalancer使用
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: $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
echo "http://$IP_ADDRESS"
删除群集
如果不打算完成教程,请清理不必要的资源以避免Azure费用。
使用 az group delete 命令删除资源组、容器服务和所有相关资源。
az group delete --name $MY_RESOURCE_GROUP_NAME --yes --no-wait
相关内容
若要详细了解用于 AKS 的 ACL,请参阅 什么是用于 Azure Kubernetes 服务 (AKS) 的 Azure Container Linux (ACL)?