需求
在k8s中各服务之间通过内部域名【服务名.namespace】的形式进行调用非常方便, 但是容器集群内的服务如何调用部署在集群外的中间件,比如外部的数据库服务,redis服务等。k8s的Service 可以通过独立配置Endpoints的方法,直接代理外部服务并支持代理多个端口。
实现方式
1.单独创建Endpoints(多个端口)
kind: Endpoints
apiVersion: v1
metadata:
name: mysql-proxy
namespace: mysql
subsets:
- addresses:
- ip: 192.168.1.2 # 外部服务的IP列表
- ip: 192.168.1.3
ports:
- name: fuwu1 # 外部服务的端口列表,与Service中映射的端口名相对应
port: 3306
- addresses:
- ip: 192.168.2.5 # 外部服务的IP列表
- ip: 192.168.2.6
ports:
- name: rw2 # 外部服务的端口列表,与Service中映射的端口名相对应
port: 3306
2.创建service,名称和Endpoints的名称保持一致
apiVersion: v1
kind: Service
metadata:
name: mysql-proxy # 资源名称,必须与Endpoints中metadata.name相同
namespace: mysql # 资源命名空间,必须与Endpoints中metadata.namespace相同
spec:
type: NodePort # 如果为ClusterIP模式,配置为:type: ClusterIP
ports:
- port: 6446 # 集群内部使用的端口
nodePort: 30306 # 如果NodePort模式才需要配置
name: fuwu1 # 必须与Endpoints中定义的端口名相同
- port: 6448 # 集群内部使用的端口
nodePort: 30308 # 如果NodePort模式才需要配置
name: fuwu2 # 必须与Endpoints中定义的端口名相同
重要提示:Endpoints 相当于配置 Service 的 targetPort,端口的名称必须相同。
三.针对单个端口反向代理到外部服务
---
apiVersion: v1
kind: Endpoints
metadata:
name: oralce-db
namespace: default
subsets:
- addresses:
- ip: 10.10.20.3
ports:
- name: oracle
port: 1521
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: oracle-db
namespace: default
spec:
ports:
- name: oracle
port: 1548
protocol: TCP
targetPort: 1521
四.反代外部域名: ExternalName
这种配置方式不支持IP作为终点,仅支持 dns名称。
apiVersion: v1
Kind: Service
metadata:
lables:
key: value
name: svc-externalName
Namespace: default
spec:
#如果port端口为80,可不需要定义
ports:
- name: http
port: 80
protocol: tcp
targePort: 80
sessionAffinity: None
type: ExternalName
externalName: www.baidu.com
通过访问service反向代理到www.baidu.com网站上。