当我们的某个服务在外部集群的时候,但是又想k8s集群内的应用连接它,这是可以创建一个service,用service代理外部服务,然后集群内就能连接该service,从而间接的访问外部服务。
创建一个service代理外部的服务
创建一个没有标签选择器的service,这样的service就不会关联到任何pod,从而也不会自动创建endpoint。这时我们手动创建一个与service同名的endpoint,使用endpoint来定义外部服务的地址端口,service会自动关联该endpoint。
service是如何与endpoint关联的?需要特别注意一下几点:
- endpoint的名称必须要与service的名称相同,这样两者才能关联;
- service定义spec.ports的ports的时候,包含port端口、name端口名称、protocol协议;
- endpoint中定义外部服务的IP和端口,endpoint的名称一定要与service的名称一样,协议也要一样,端口的name也要与service的端口的name一样,端口协议也要与service的端口协议一样,不然endpoint不能与service进行关联。
下面是演示示例:
1、在一台服务器上部署httpd服务,并将端口改为18080,保障服务正常运行,可以使用浏览器访问测试页面;
2、创建service和endpoint的配置文件,如下:
apiVersion: v1
kind: Service
metadata:
name: outside-svc # Service的名称,跟Endpoints名称保持一致
spec:
type: NodePort # Service的类型,需要对外提供服务的话,使用NodePort,如不需要外部访问,只限于内部访问,则使用ClusterIP
ports:
- name: out-agent-port # 端口名称,跟Endpoints的端口名称保持一致
port: 8080 #集群內部访问端口
nodePort: 32000 # 对外提供服务的端口,仅NodePort模式下生效
protocol: TCP # 协议类型
sessionAffinity: None
---
apiVersion: v1
kind: Endpoints
metadata:
name: outside-svc # Endpoints的名称,跟Service名称保持一致
subsets:
- addresses:
- ip: 11.0.1.7 # 需要被代理出去的服务器的IP,即我们上面部署了httpd服务的IP
ports:
- port: 18080 # httpd服务的端口
protocol: TCP # 协议类型,需要跟Service的保持一致
name: out-agent-port # 端口名称,跟Service的端口名称保持一致
3、应用该yaml文件,并查看状态:
[root@master1 ~]# kubectl get ep,svc
NAME ENDPOINTS AGE
endpoints/outside-svc 11.0.1.7:18080 31m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/outside-svc NodePort 10.99.100.57 <none> 8080:32000/TCP 31m
4、通过浏览器测试访问k8s节点的任意IP+32000端口
能正常访问测试页面,即表示反向代理配置完成了。