如何利用自定义脚本扩展在ARM模板创建的AKS集群部署K8s应用
在Azure托管应用中通过自定义脚本扩展部署K8s应用的实现方法
可行性确认
完全可以在AKS集群基础设施部署完成后,用Azure自定义脚本扩展来初始化K8s应用组件。需要注意的是,这个扩展是作用于VM节点的,所以得针对AKS的节点池配置,或者用AKS原生支持的节点部署脚本注入能力。
具体实现步骤
1. 修改ARM模板,添加自定义脚本扩展配置
在AKS的节点池定义里加入extensions字段,配置自定义脚本扩展。示例ARM模板片段:
"agentPoolProfiles": [ { "name": "agentpool", "count": 3, "vmSize": "Standard_DS2_v2", "osType": "Linux", "extensions": [ { "name": "customScript", "properties": { "publisher": "Microsoft.Azure.Extensions", "type": "CustomScript", "typeHandlerVersion": "2.1", "autoUpgradeMinorVersion": true, "settings": { "fileUris": ["https://your-storage-account.blob.core.windows.net/scripts/init-k8s-app.sh"], "commandToExecute": "bash init-k8s-app.sh" } } } ] } ]
2. 编写K8s应用初始化脚本
脚本要完成kubectl配置、应用部署等操作,示例init-k8s-app.sh:
#!/bin/bash # 等待kubectl可用 until kubectl version &> /dev/null; do echo "等待kubectl就绪..." sleep 5 done # 部署你的应用资源(替换成实际的清单地址) kubectl apply -f https://your-storage-account.blob.core.windows.net/manifests/app-deployment.yaml kubectl apply -f https://your-storage-account.blob.core.windows.net/manifests/app-service.yaml # 初始化其他依赖组件,比如Ingress、监控等 kubectl create namespace monitoring kubectl apply -f https://your-storage-account.blob.core.windows.net/manifests/prometheus.yaml
3. 脚本存储与权限设置
- 把脚本和K8s清单上传到Azure存储Blob容器,要么设置容器为匿名读取,要么生成SAS令牌,保证节点能访问这些文件。
- 如果用SAS令牌,直接把文件URI换成带SAS的地址,或者在脚本里用wget/curl时带上SAS参数。
4. 托管应用专属注意点
- 托管应用的ARM模板会按依赖顺序执行,节点池扩展会在节点创建后自动运行,不用额外设置依赖。
- 不同节点池需要不同脚本的话,在对应的
agentPoolProfiles里分别配置扩展就行。 - 排查问题可以去Azure门户看AKS节点的扩展状态,或者在脚本里把日志输出到节点本地文件。
可选替代方案
要是觉得节点级扩展不够灵活,也可以用AKS的kubeadmConfigPatches注入初始化脚本,或者在托管应用里加个后续步骤,用Azure Function或逻辑应用调用AKS API部署应用,这种方式更适合复杂的初始化场景。
内容的提问来源于stack exchange,提问作者Gianvito Grassi
相关产品推荐
相关产品推荐

