跳到主要内容
版本:3.9.x

配置 Kubernetes 服务发现

与直接配置上游不同,你可以使用 Kubernetes 服务发现(Service Discovery)来动态探测 Kubernetes 集群中的上游节点。这样,当你的服务在 Kubernetes 中扩缩容时,API7 网关可以自动发现并使用最新的服务端点。

本指南将向你展示如何配置 Kubernetes 服务发现以动态管理上游节点。

信息

服务(Service)一旦发布,便无法直接在已配置的上游节点和服务发现之间切换。你必须通过金丝雀发布来配置。

前提条件

  1. 安装 API7 企业版
  2. 网关组中至少包含一个网关实例
  3. 拥有一个正在运行的 Kubernetes 集群。

创建服务账户

为了让 API7 企业版能够访问 Kubernetes API Server 并发现服务,你需要创建一个具有适当权限的服务账户。

创建服务账户和 ClusterRole

  1. 创建一个 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
  1. 应用该配置:
kubectl apply -f api7-service-account.yaml

创建 Secret 和 Token

从 Kubernetes 1.24 开始,Secret 不再自动为服务账户生成。你需要手动创建 Secret:

  1. 创建一个 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
  1. 应用该配置:
kubectl apply -f api7-secret.yaml
  1. 获取 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 的获取方式。

获取 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)。

添加服务注册中心连接

  1. 从侧边导航栏选择你的网关组下的 服务注册中心(Service Registries),然后点击 添加服务注册中心连接(Add Service Registry Connection)

  2. 在对话框中,执行以下操作:

    • 名称(Name) 字段中,输入 Kubernetes Registry
    • 发现类型(Discovery Type) 字段中,选择 Kubernetes
    • API Server 地址(API Server Address) 字段中,填写上一步获取的 API Server 地址(例如 https://192.168.1.100:6443)。
    • Token 值(Token Value) 字段中,粘贴之前获取的服务账户 Token。
    • 点击 添加(Add)
    健康的Kubernetes服务注册中心状态
  3. 等待并确保该服务注册中心的状态变为 健康(Healthy)

Healthy K8s Service Discovery

配置使用服务发现的上游

创建服务注册中心连接后,你可以配置服务使用 Kubernetes 服务发现来自动发现上游节点。

  1. 从侧边导航栏选择你的网关组下的 已发布服务(Published Services),然后点击 添加服务(Add Service)

  2. 选择 手动添加(Add Manually)

  3. 添加服务(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
  4. 点击 添加(Add)。这将会创建一个处于“无版本(No Version)”状态的新服务。

验证配置

配置完成后,API7 网关将自动发现 Kubernetes 服务的端点。你可以通过以下方式验证:

  1. 已发布服务(Published Services) 中查看你创建的服务。
  2. 检查服务的上游节点是否自动填充了 Kubernetes 服务的端点。
  3. 当 Kubernetes 服务扩缩容时,API7 网关会自动更新上游节点列表。

其他资源