【环境】
- MacOS
- minikube version: v1.25.2
- minikube vm-driver: hyperkit
1. Service类型
Kubernetes的Service想要对外暴露,可以通过以下方式:
-
ClusterIP Service
+Ingress
:
Service type为ClusterIP时,我们一般认为是internal service,需要借助别的组件对外暴露,比如通过Ingress组件,再转到内部的service上。
参考:【k8s学习】Kubernetes Ingress介绍 -
NodePort Service
:
Service type为NodePort,通过配置NodePort(范围30000~32767),通过Node本身的IP进行访问。
参考:【k8s学习】布署Spring Boot项目到minikube上 -
LoadBalancer Service
:
Service type为LoadBalancer,通过配置NodePort(范围30000~32767),通过Node本身的IP进行访问。LoadBalancer Service是NodePort Service的扩展,它弥补了NodePort Service作为集群中一个固定的Node对外暴露的缺点。而是可以将部署在集群中不同的Node间的Service作负载均衡,并对外暴露。
参考:【k8s学习】在minikube上布署MongoDB和MongoExpress
参考:【k8s学习】Kubernetes Service介绍
【本文介绍另一种方式,即通过Cluster Service
+配置属性externalIPs
的方式对外暴露服务。】
2. ClusterIP Service使用externalIPs对外暴露服务
官网:https://kubernetes.io/docs/concepts/services-networking/service/#external-ips
2.1 准备一个Java Spring Boot项目
端口为8090
,开放了Rest API用来测试,/version
,返回字符串:hazelcast k8s test v1
docker build,docker push一系列操作后,上传到docker hub上。
2.2 创建deployment,运行。
image.png 可以看到pod在运行了: image.pngkubectl create deployment hazelcast-k8s --image=<your image>
2.3 创建Service:
这里配置了port为80,即Service自己的端口,targetPort为Pod中的container运行的Spring Boot项目的端口。
externalIPs为Kubernetes集群节点的IP,我用的是minikube,可以通过命令minikube ip
查询:
apiVersion: v1
kind: Service
metadata:
name: hazelcast-k8s
spec:
selector:
app: hazelcast-k8s
pod-template-hash: c4b67c848
ports:
- protocol: TCP
port: 80
targetPort: 8090
externalIPs:
- 192.168.64.10
创建好后查看service:
image.png
在集群外部通过配置的externalIPs即可访问:
image.png
【总结】
所以这里配置的externalIPs听上去像是配置外部的IP,其实配的是service所在的node节点的ip,意思是外部的人可以通过这个ip访问这个service,或者可以理解为这个service对外暴露了,ip为这个externalIP。
这里的service的port配置的是80,所以我们访问的时候就可以省略端口号了(默认端口号即为80)。
整个过程为:
访问url=http://192.168.64.10/version
--> 找到type为ClusterIP的service
--> 转发给port为8090的container
如果我们通过NodePort或是LoadBalancer暴露,那么端口因为限定了范围(30000~32767),所以必须要带上端口号访问,而本文这种,可以用默认端口80。另外,在文未的参考文章也对external ip service做了更为详细的介绍。
参考:
https://medium.com/swlh/kubernetes-external-ip-service-type-5e5e9ad62fcd
网友评论