前言
业务上可能会有业务已经部署在一个集群,但是又有新的集群服务,不想使用新的域名,想简单地将外部集群服务接进来,最近研究了下,不通过nginx这类网关中间件,只使用k8s原生的一些资源组件
必要前提
- 2个集群内网通信,延迟较低
- 已部署集群A可以直连到接入集群B的所有节点的30000以上所有端口
实现思路
- B集群创建的服务,使用NodePort作为service的类型
- A集群创建无selector的serivice,同时创建endpointslices绑定这个service
- endpointslices的端口绑定B集群NodePort的端口,地址使用所有B集群节点地址
附A集群yaml实现
apiVersion: v1
kind: Service
metadata:
name: out-api
namespace: api
spec:
ports:
- protocol: TCP
port: 80
targetPort: 1234
---
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: out-api-nginx # 按惯例将服务的名称用作 EndpointSlice 名称的前缀
namespace: api
labels:
# 你应设置 "kubernetes.io/service-name" 标签。
# 设置其值以匹配服务的名称
kubernetes.io/service-name: out-api
addressType: IPv4
ports:
- name: '' # 留空,因为 port 9376 未被 IANA 分配为已注册端口
appProtocol: http
protocol: TCP
port: 1234
endpoints: # 此列表中的 IP 地址可以按任何顺序显示
- addresses:
- "10.95.248.64"
client-go代码编程要点
1.创建service的时候,结果会立刻返回一个service,此时绑定的NodePort值就已绑定在里面了
2.不加过滤条件遍历nodes,可以快速生成一份节点ip列表
3.可以通过watch api,快速定位节点和service NodePort的变化,保证服务一直可用
4.无selector的serivice,Port属性不可以使用name,否则会出现端口不通的情况