参考
https://blog.csdn.net/weixin_43334786/article/details/128432325

当我们的某个服务在外部集群的时候,但是又想k8s集群内的应用连接它,这是可以创建一个service,用service代理外部服务,然后集群内就能连接该service,从而间接的访问外部服务。

创建一个service代理外部的服务

创建一个没有标签选择器的service,这样的service就不会关联到任何pod,从而也不会自动创建endpoint。这时我们手动创建一个与service同名的endpoint,使用endpoint来定义外部服务的地址端口,service会自动关联该endpoint。
service是如何与endpoint关联的?需要特别注意一下几点:

  1. endpoint的名称必须要与service的名称相同,这样两者才能关联;
  2. service定义spec.ports的ports的时候,包含port端口、name端口名称、protocol协议;
  3. endpoint中定义外部服务的IP和端口,endpoint的名称一定要与service的名称一样,协议也要一样,端口的name也要与service的端口的name一样,端口协议也要与service的端口协议一样,不然endpoint不能与service进行关联。

下面是演示示例

  1. 在一台服务器(192.168.3.215)部署http服务,启动端口为80,可以使用浏览器正常访问
  2. 创建service和endpoint的配置文件,如下
# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: outside-svc # Service的名称,跟Endpoints名称保持一致
spec:
  type: NodePort # Service的类型,需要对外提供服务的话,使用NodePort,如不需要外部访问,只限于内部访问,则使用ClusterIP
  ports:
  - name: out-agent-port # 端口名称,跟Endpoints的端口名称保持一致
    port: 80 #集群內部访问端口
    nodePort: 32000 # 对外提供服务的端口,仅NodePort模式下生效
    protocol: TCP # 协议类型
  sessionAffinity: None
---
apiVersion: v1
kind: Endpoints 
metadata:
  name: outside-svc # Endpoints的名称,跟Service名称保持一致
subsets:
- addresses:
  - ip: 192.168.3.215 # 需要被代理出去的服务器的IP,即我们上面部署了httpd服务的IP
  ports:
  - port: 80 # httpd服务的端口
    protocol: TCP # 协议类型,需要跟Service的保持一致
    name: out-agent-port # 端口名称,跟Service的端口名称保持一致

部署

# kubectl apply -f svc.yaml

查看部署的svc和ep

# kubectl get svc outside-svc
NAME          TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
outside-svc   NodePort   10.0.0.161   <none>        80:32000/TCP   10m
# kubectl get ep outside-svc
NAME          ENDPOINTS          AGE
outside-svc   192.168.3.215:80   10m

可以看到epoints指向是k8s集群外部地址
外部使用node地址+nodeport映射端口可以访问即以下两个地址访问的服务是一致的

# 源服务器访问
# http://192.168.3.215
# k8s集群node地址+nodeport访问
# http://192.168.3.65:32000