配置 Kubernetes 服务发现
与直接配置上游不同,你可以使用 Kubernetes 服务发现(Service Discovery)来动态探测 Kubernetes 集群中的上游节点。这样,当你的服务在 Kubernetes 中扩缩容时,API7 网关可以自动发现并使用最新的服务端点。
本指南将向你展示如何配置 Kubernetes 服务发现以动态管理上游节点。
服务(Service)一旦发布,便无法直接在已配置的上游节点和服务发现之间切换。你必须通过金丝雀发布来配置。
前提条件
- 安装 API7 企业版。
- 网关组中至少包含一个网关实例。
- 拥有一个正在运行的 Kubernetes 集群。
创建服务账户
为了让 API7 企业版能够访问 Kubernetes API Server 并发现服务,你需要创建一个具有适当权限的服务账户。
创建服务账户和 ClusterRole
- 创建一个 YAML 文件(例如
api7-service-account.yaml),包含以下内容:
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: api7-service-discovery
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: api7-service-discovery
rules:
- apiGroups:
- ""
resources:
- endpoints
- pods
- services
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: api7-service-discovery
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: api7-service-discovery
subjects:
- kind: ServiceAccount
name: api7-service-discovery
namespace: default
- 应用该配置:
kubectl apply -f api7-service-account.yaml
创建 Secret 和 Token
- Kubernetes 1.24 及更高版本
- Kubernetes 1.23 及更早版本
从 Kubernetes 1.24 开始,Secret 不再自动为服务账户生成。你需要手动创建 Secret:
- 创建一个 YAML 文件( 例如
api7-secret.yaml):
apiVersion: v1
kind: Secret
metadata:
name: api7-service-discovery-token
namespace: default
annotations:
kubernetes.io/service-account.name: api7-service-discovery
type: kubernetes.io/service-account-token
- 应用该配置:
kubectl apply -f api7-secret.yaml
- 获取 Token:
kubectl get secret api7-service-discovery-token -n default -o jsonpath='{.data.token}' | base64 -d
在 Kubernetes 1.24+ 中,手动创建的 Secret 不会自动出现在 ServiceAccount 的 secrets 列表中。如果你运行这一步后,结果为空,这是正常现象,你无需将 Secret 添加到 ServiceAccount 即可使用上面的命令获取 Token。
如果你有特殊需求需要将 Secret 关联到 ServiceAccount(例如兼容某些旧工具),可以手动执行以下命令:
kubectl patch serviceaccount api7-service-discovery -n default -p '{"secrets":[{"name":"api7-service-discovery-token"}]}'
但请注意,这一步不是必须的,添加后也不会影响 Token 的获取方式。
Kubernetes 1.23 及更早版本已停止维护,强烈建议你升级到更新版本。如果你仍在使用这些版本,请遵循以下步骤。
在 Kubernetes 1.23 及更早版本中,Secret 会自动为服务账户生成。
- 获取 Secret 名称:
kubectl get serviceaccount api7-service-discovery -n default -o jsonpath='{.secrets[0].name}'
- 使用上一步获取的 Secret 名称来获取 Token:
kubectl get secret <secret-name> -n default -o jsonpath='{.data.token}' | base64 -d
获取 API Server 地址
运行以下命令获取 Kubernetes API Server 地址:
kubectl cluster-info
输出示例:
Kubernetes control plane is running at https://192.168.1.100:6443
使用输出中的 API Server 地址(例如 https://192.168.1.100:6443)。
添加服务注册中心连接
-
从侧边导航栏选择你的网关组下的 服务注册中心(Service Registries),然后点击 添加服务注册中心连接(Add Service Registry Connection)。
-
在对话框中,执行以下操作:
- 在 名称(Name) 字段中,输入
Kubernetes Registry。 - 在 发现类型(Discovery Type) 字段中,选择
Kubernetes。 - 在 API Server 地址(API Server Address) 字段中,填写上一步获取的 API Server 地址(例如
https://192.168.1.100:6443)。 - 在 Token 值(Token Value) 字段中,粘贴之前获取的服务账户 Token。
- 点击 添加(Add)。
- 在 名称(Name) 字段中,输入
-
等待并确保该服务注册中心的状态变为
健康(Healthy)。

配置使用服务发现的上游
创建服务注册中心连接后,你可以配置服务使用 Kubernetes 服务发现来自动发现上游节点。
-
从侧边导航栏选择你的网关组下的 已发布服务(Published Services),然后点击 添加服务(Add Service)。
-
选择 手动添加(Add Manually)。
-
在 添加服务(Add Service) 对话框中,执行以下操作:
- 在 名称(Name) 字段中,输 入服务名称(例如
httpbin)。 - 在 服务类型(Service Type) 字段中,选择
HTTP (七层代理)。 - 在 上游协议(Upstream Scheme) 字段中,选择
HTTP。 - 在 如何寻找上游(How to find the upstream) 字段中,选择
使用服务发现(Use Service Discovery)。 - 在 服务注册中心(Service Registry) 字段中选择
Kubernetes Registry,然后依次选择对应的:- 命名空间(Namespace):Kubernetes 服务所在的命名空间(例如
default) - 服务名称(Service Name):Kubernetes 服务的名称(例如
httpbin)
- 命名空间(Namespace):Kubernetes 服务所在的命名空间(例如
- 在 名称(Name) 字段中,输 入服务名称(例如
-
点击 添加(Add)。这将会创建一个处于“无版本(No Version)”状态的新服务。
验证配置
配置完成后,API7 网关将自动发现 Kubernetes 服务的端点。你可以通过以下方式验证:
- 在 已发布服务(Published Services) 中查看你创建的服务。
- 检查服务的上游节点是否自动填充了 Kubernetes 服务的端点。
- 当 Kubernetes 服务扩缩容时,API7 网关会自动更新上游节点列表。
其他资源
- 核心概念
- 快速入门