将外部服务定义为Service
普通的Service通过label selector 对后端endpoint 就行访问,如果后端服务不是pod集群,则Service 还可以抽象定义为任意其他服务,将一个k8s集群外的的服务定义为k8s内的一个service,供集群内其他应用访问,常见场景:
- 外部的集群:数据库、缓存服务等
- 其他k8s集群的某个服务
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
---
#把外面的服务包装成一个endpoint
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
#配置外面的访问IP和端口
subsets:
- address:
- IP: 192.168.3.4
ports:
- port: 80
将Service暴露到集群外部
目前Kubernetes支持以下四种类型的Service:
1.ClusterIP
ClusterIP是最基本的Service类型,为集群内部的服务提供了一个稳定的虚拟IP地址。它只能通过集群内部的其他对象访问,并且默认情况下不会将流量路由到外部。
2.NodePort
NodePort类型的Service提供了一个静态的端口号,可以将流量路由到集群中的任何节点上。外部客户端可以使用该端口访问该Service,分配给Service的每个Pod都会监听此端口号并处理传入的请求。
3.LoadBalancer
LoadBalancer类型的Service允许将外部流量自动负载均衡到多个Pod之间,通常需要与云提供商的负载均衡器结合使用。它创建了一个公共负载均衡器,该负载均衡器将目标端点映射到已分配的公共IP地址。
4.ExternalName
ExternalName类型的Service可用于将Kubernetes服务名称映射到DNS记录中的任何名称,而无需为其创建任何额外的资源对象。这对于在Kubernetes集群外运行的服务非常有用,因为它可以使这些服务更加透明和易于访问
NodePort类型
apiVersion: v1
kind: Service
metadata:
name: webapp-nodeport
spec:
//nodeport类型
type: NodePort
ports:
- port: 808
targetPort: 8080
//nodeport的端口
nodePort: 32700
selector:
app: webapp
kubectl create -f nodeport.yaml
获取本机的ip,并请求配置的node port的端口
[root@scms01 day10]# hostname -i
172.16.2.220
[root@scms01 day10]# curl 172.16.2.220:32700
LoadBalancer类型
在公有云环境中,设置servic类型为LoadBalancer,可以将Service映射到公有云提供的某个负载均衡器的IP地址上,客户度通过负载均衡器的IP和service的端口就可以访问到具体的服务,无须再给通过kube-proxy提高负载均衡机制进行流量转发,公有云提供的LoadBalancer可以直接讲流量转发到后端的Pod上。
apiVersion: v1
kind: Service
metadata:
name: my-servide
spec:
//设置为loadBalancer
type: LoadBalancer
selector:
app: MyApp
ports
- protocol: TCP
port: 80
targetPort: 9376
clusterIP: 10.0.171.239
在服务创建成功后,云服务商会在service的定义中补充loadBlancer的IP地址
Status:
loadBalancer:
ingress:
- ip: 192.0.2.127
ExternalName类型
这种类型的服务用于将集群外的服务定义为k8s集群的service,并且通过该字段指定外部服务的地址,可以使用域名或IP格式。集群内的客户端应用通过访问这个service就能访问外部的服务了,这种类型的service没有后端的pod,无需设置selecor
apiVersion: v1
kind: Service
metadat:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
~