尝试 Service Entry
Service Entry 允许您将外部服务添加到 Istio 的内部服务注册表中,使网格中的服务能够访问和路由到这些手动指定的服务。本指南将向您展示如何使用 Service Entry 配置对外部服务的访问。
准备工作
在开始之前,请确保完成以下步骤:
-
使默认命名空间由 Kmesh 管理
-
部署 Httpbin 作为示例应用程序,并部署 Sleep 作为 curl 客户端
-
为默认命名空间安装 waypoint
以上步骤的详细说明可以参考 安装 Waypoint | Kmesh
验证环境设置
确认 httpbin 和 sleep 应用程序已正常运行:
kubectl get pods
您应该看到两个服务都处于 Running 状态:
NAME READY STATUS RESTARTS AGE
httpbin-6f4464f6c5-h9x2p 1/1 Running 0 30s
sleep-9454cc476-86vgb 1/1 Running 0 5m
配置 Service Entry
我们将创建一个 Service Entry 来定义一个虚拟的外部服务,该服务实际上会将流量路由到集群内的 httpbin 服务:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-fake-svc
namespace: default
spec:
exportTo:
- "*"
hosts:
- kmesh-fake.com
ports:
- name: http
number: 80
protocol: HTTP
endpoints:
- address: httpbin.default.svc.cluster.local
ports:
http: 8000
resolution: DNS
EOF
此配置的含义:
hosts: 定义虚拟主机名kmesh-fake.comports: 指定服务监听的端口和协议endpoints: 实际的后端服务地址(这里指向集群内的 httpbin 服务)resolution: DNS 解析类型
测试 Service Entry 配置
配置完成后,我们可以通过以下测试验证 Service Entry 是否正常工作:
1. 基础连通性测试
测试访问虚拟外部服务:
kubectl exec deploy/sleep -- curl -s http://kmesh-fake.com/headers
您应该看到来自 httpbin 服务的响应,注意 Host 头已经变成了我们定义的虚拟主机名:
{
"headers": {
"Accept": "*/*",
"Host": "kmesh-fake.com",
"User-Agent": "curl/8.16.0"
}
}
2. 详细请求信息验证
获取完整的请求信息:
kubectl exec deploy/sleep -- curl -s http://kmesh-fake.com/get
输出显示请求被成功路由到 httpbin 服务:
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "kmesh-fake.com",
"User-Agent": "curl/8.16.0"
},
"origin": "10.244.1.6",
"url": "http://kmesh-fake.com/get"
}
3. HTTP 状态码测试
测试不同的 HTTP 状态码响应:
# 测试正常状态码
kubectl exec deploy/sleep -- curl -s http://kmesh-fake.com/status/200
# 测试特定状态码并显示返回码
kubectl exec deploy/sleep -- curl -s -o /dev/null -w "%{http_code}\n" http://kmesh-fake.com/status/418
第二个命令应该返回 HTTP 状态码:
418
4. 响应头检查
检查完整的响应头信息:
kubectl exec deploy/sleep -- curl -IsS http://kmesh-fake.com/headers
您应该看到包含 Envoy 代理和路由信息的响应头:
HTTP/1.1 200 OK
server: envoy
date: Wed, 08 Oct 2025 07:51:51 GMT
content-type: application/json
content-length: 78
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 1
x-envoy-decorator-operation: httpbin.default.svc.cluster.local:8000/*
高级用例:配置真实外部服务
除了上面演示的将虚拟主机映射到集群内服务,您还可以配置访问真实的外部服务。
创建外部服务配置
创建一个 Service Entry 来访问真实的外部 httpbin.org 服务:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-httpbin-org
namespace: default
spec:
hosts:
- httpbin.org
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
EOF
此配置允许网格内的服务直接访问外部的 httpbin.org。
测试外部服务访问
测试对真实外部服务的访问:
kubectl exec deploy/sleep -- curl -s http://httpbin.org/headers
您应该看到来自真实 httpbin.org 服务的响应:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/8.16.0"
}
}
清理资源
完成测试后,删除创建的 Service Entry 资源:
kubectl delete serviceentry external-fake-svc -n default
kubectl delete serviceentry external-httpbin-org -n default
如果您不打算继续后续的实验,请参考 安装 Waypoint/清理 部分的说明来删除 waypoint 并清理应用程序。
总结
通过本指南,您学习了如何:
- 使用 Service Entry 将外部服务添加到 Istio 服务网格
- 配置虚拟主机名映射到集群内服务
- 配置对真实外部服务的访问
- 验证和测试 Service Entry 配置的有效性
Service Entry 是 Istio 中管理外部服务访问的重要工具,它提供了对外部依赖的可见性和控制能力。