配置 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