前言

业务上可能会有业务已经部署在一个集群,但是又有新的集群服务,不想使用新的域名,想简单地将外部集群服务接进来,最近研究了下,不通过nginx这类网关中间件,只使用k8s原生的一些资源组件

必要前提

  1. 2个集群内网通信,延迟较低
  2. 已部署集群A可以直连到接入集群B的所有节点的30000以上所有端口

实现思路

  1. B集群创建的服务,使用NodePort作为service的类型
  2. A集群创建无selector的serivice,同时创建endpointslices绑定这个service
  3. 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,否则会出现端口不通的情况