如何在Azure DevOps Pipeline中通过YAML配置Kong服务与路由
实现Kong资源批量创建的方案
一、使用Kong官方CLI工具Deck(推荐)
Deck是Kong官方提供的配置管理工具,专门用于批量同步、导入导出Kong的服务、路由、插件等资源,适配CI/CD流水线场景的稳定性和效率需求。
步骤1:在Azure DevOps流水线中安装Deck
根据流水线代理的操作系统,添加对应的安装步骤:
- script: | curl -sL https://github.com/Kong/deck/releases/latest/download/deck_$(uname -s)_$(uname -m).tar.gz -o deck.tar.gz tar -xf deck.tar.gz sudo mv deck /usr/local/bin/ deck version displayName: 'Install Kong Deck (Linux)' condition: eq(variables['Agent.OS'], 'Linux')
步骤2:调整现有YAML为Deck兼容格式
Deck的配置YAML有固定结构,若你现有文件格式不符,需调整为如下示例结构(已有类似结构可直接复用):
_format_version: "1.1" services: - name: example-service url: http://example-api:8080 routes: - name: example-route paths: - /example plugins: - name: rate-limiting config: minute: 100 hour: 1000
如果现有YAML是零散的资源集合,也可以用deck file add命令逐步构建合规配置文件。
步骤3:在流水线中执行批量同步
使用deck sync命令将YAML配置同步到Kong实例,该命令会自动对比现有资源,完成创建/更新/删除的差异操作;若仅需新增资源不删除现有内容,可改用deck import --mode create:
- script: | deck sync --kong-uri $(KONG_ADMIN_URL) --config kong-config.yaml displayName: 'Sync Kong Config with Deck' env: KONG_ADMIN_URL: $(KongAdminUrl) # 从Azure DevOps变量组中读取Kong Admin地址
若Kong启用了Admin Token认证,需添加--kong-token参数传入凭证:
deck sync --kong-uri $(KONG_ADMIN_URL) --kong-token $(KongAdminToken) --config kong-config.yaml
二、不使用Deck的备选方案(直接调用API批量处理)
如果不想引入新工具,可借助yq解析YAML文件,结合curl批量发送请求:
步骤1:安装yq(YAML解析工具)
- script: | sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq sudo chmod +x /usr/bin/yq displayName: 'Install yq (Linux)'
步骤2:编写脚本遍历YAML并创建资源
假设你的YAML文件以services数组为顶层结构,每个服务包含routes和plugins节点,可编写如下bash脚本:
#!/bin/bash KONG_URI=$KONG_ADMIN_URL # 遍历创建服务 yq e '.services[]' kong-config.yaml | while read -r service; do SERVICE_NAME=$(echo "$service" | yq e '.name') SERVICE_URL=$(echo "$service" | yq e '.url') curl -X POST "$KONG_URI/services" -H "Content-Type: application/json" -d "{\"name\":\"$SERVICE_NAME\",\"url\":\"$SERVICE_URL\"}" # 遍历创建当前服务的路由 echo "$service" | yq e '.routes[]' | while read -r route; do ROUTE_NAME=$(echo "$route" | yq e '.name') ROUTE_PATH=$(echo "$route" | yq e '.paths[0]') curl -X POST "$KONG_URI/services/$SERVICE_NAME/routes" -H "Content-Type: application/json" -d "{\"name\":\"$ROUTE_NAME\",\"paths\":[\"$ROUTE_PATH\"]}" done # 遍历创建当前服务的插件 echo "$service" | yq e '.plugins[]' | while read -r plugin; do PLUGIN_NAME=$(echo "$plugin" | yq e '.name') PLUGIN_CONFIG=$(echo "$plugin" | yq e '.config | tojson') curl -X POST "$KONG_URI/services/$SERVICE_NAME/plugins" -H "Content-Type: application/json" -d "{\"name\":\"$PLUGIN_NAME\",\"config\":$PLUGIN_CONFIG}" done done
随后在流水线中执行该脚本:
- script: | chmod +x import-kong-resources.sh ./import-kong-resources.sh displayName: 'Import Kong Resources via curl and yq' env: KONG_ADMIN_URL: $(KongAdminUrl)
注意事项
- Kong Admin API的地址、认证凭证需存储在Azure DevOps安全变量组中,禁止硬编码。
- 使用
deck sync前建议先在测试环境验证,避免误操作生产环境资源。 - 若你的YAML结构与示例不符,需对应调整
yq的解析路径或Deck的配置结构。
内容的提问来源于stack exchange,提问作者Paula Gouveia
相关产品推荐
相关产品推荐

