参考
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关联的?需要特别注意一下几点:
- endpoint的名称必须要与service的名称相同,这样两者才能关联;
- service定义spec.ports的ports的时候,包含port端口、name端口名称、protocol协议;
- endpoint中定义外部服务的IP和端口,endpoint的名称一定要与service的名称一样,协议也要一样,端口的name也要与service的端口的name一样,端口协议也要与service的端口协议一样,不然endpoint不能与service进行关联。
下面是演示示例
- 在一台服务器(192.168.3.215)部署http服务,启动端口为80,可以使用浏览器正常访问
- 创建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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。