APIM无法访问VNet子网内AKS服务问题求助
首先看你的AKS服务状态:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) todosvc LoadBalancer 10.0.196.84 10.0.1.4 8002:30409/TCP 19m
服务已经获取了子网内的IP 10.0.1.4,端口转发能访问说明AKS侧服务正常,接下来帮你解决连通性验证和Swagger导入的问题:
一、类似Ping的连通性验证方法
作为APIM新手,给你几个实用的双向连通性验证手段:
从AKS Pod测试到APIM的连通性
进入AKS任意运行中的Pod,用ping和curl测试APIM的私网IP(可以在Azure Portal的APIM实例概览页找到):kubectl exec -it <你的Pod名称> -- /bin/bash # 测试基础连通性 ping <APIM私网IP> # 测试APIM健康状态(APIM专属健康检查路径) curl http://<APIM私网IP>/status-0123456789abcdef如果
curl返回200状态码,说明AKS到APIM的网络是通的。从APIM测试到AKS服务的连通性
利用APIM自带的工具就能验证,不用额外部署VM:- 在APIM中创建一个临时测试API,添加一个指向AKS服务端点(
http://10.0.1.4:8002)的GET操作 - 进入该操作的测试控制台,发送请求,查看是否能收到AKS服务的正常响应
- 或者用自定义策略快速验证(在API的入站策略中添加):
调用这个API后,如果能返回AKS服务的内容,说明APIM到AKS的网络连通正常。<send-request mode="new" response-variable-name="aksResponse" timeout="20" ignore-error="false"> <set-url>http://10.0.1.4:8002</set-url> <set-method>GET</set-method> </send-request> <return-response> <set-status code="200" reason="OK" /> <set-body>@(((IResponse)context.Variables["aksResponse"]).Body.As<string>())</set-body> </return-response>
- 在APIM中创建一个临时测试API,添加一个指向AKS服务端点(
检查子网NSG规则
确认APIM子网和AKS服务所在子网的网络安全组(NSG)都允许双向流量:- 允许APIM子网的IP段访问AKS服务的8002端口
- 允许AKS子网的IP段响应APIM的请求(比如允许出站的HTTP响应)
二、Swagger导入问题排查(已确认端点可直接访问)
既然你能直接访问AKS服务端点,那Swagger导入失败大概率是以下几个原因:
Swagger文档的URL无法被APIM访问
你导入时填写的Swagger URL是不是http://10.0.1.4:8002/swagger/v1/swagger.json这类内网地址?先用上面的APIM测试方法验证这个URL是否能正常访问。如果Swagger地址用了相对路径、公网域名(而AKS服务没暴露公网),APIM自然无法获取文档。Swagger文档中的Server配置错误
打开Swagger文档查看servers字段,如果配置的是公网地址或者不正确的内网地址,APIM导入后会无法正确映射端点。可以手动修改Swagger文档,把servers改成http://10.0.1.4:8002,再重新导入。Swagger端点需要认证
如果你的Swagger文档接口需要API密钥、Bearer Token等认证,APIM导入时默认不会携带这些信息,导致无法获取文档。可以在导入Swagger的“高级”选项里添加对应的请求头(比如Authorization: Bearer <你的Token>),或者临时关闭Swagger端点的认证,导入完成后再开启。APIM VNet配置细节遗漏
确认APIM确实是外部模式关联到了目标子网,同时如果AKS服务用的是服务名称(而不是IP),要确保APIM的私有DNS区域能正确解析这个服务名(如果配置了VNet集成的DNS)。
内容的提问来源于stack exchange,提问作者prakashrajansakthivel

