k8s的service理解
1.关于几种port:
- port:service暴露在cluster ip上的端口,clusterIP:port 是提供给集群内部客户访问service的入口
- nodePort:首先,nodePort是kubernetes提供给集群外部客户访问service入口的一种方式(另一种方式是LoadBalancer),所以,nodeIP:nodePort 是提供给集群外部客户访问service的入口
- targetPort:targetPort是pod上的端口。从port和nodePort上来的数据,经过kube-proxy流入到后端pod上的targetPort,最终进入容器
Service的类型
K8S中Service分为四类,分别是ClusterIP,NodePort,LoadBalancer以及ExternalName。下面一张图描述了他们之间的关系以及服务类型:
ClusterIP
这是K8S默认的服务类型,只能在K8S中进行服务通信。在ClientIP中,K8S会在Service创建完毕后提供一个内部IP作为ClientIP属性,K8S内部服务可以通过ClientIP或者ServiceName来访问该服务。 service如果不指定类型,默认都是clusterIp,
NodePort
NodePort则是Service type是Nodeport的实现,NodePort通过配置nodePort属性,外部用户可以通过NodeIP:NodePort的方式单独访问每个Node上的服务。
apiVersion: v1 kind: Service metadata: name: service-nodeport spec: ports: - port: 3000 protocol: TCP targetPort: 443 nodePort: 30080 ##可配可不配,不配的话系统会分配一个随机的端口并保持不变 selector: app: pod-nodeport type: NodePort
ExternalName
Service的ExternalName方式实现,即设置Service的type为ExternalName。这样做是内部服务访问外部服务的时候是通过别名来访问的,屏蔽了外部服务的真实信息,外部服务对内部服务透明,外部服务的修改基本上不会影响到内部服务的访问,做到了内部服务和外部服务解耦合。
kind: Service apiVersion: v1 metadata: name: service-externalname spec: ports: - port: 3000 protocol: TCP targetPort: 443 type: ExternalName externalName: server.url.com
LoadBalancer
LoadBalancer类型的service 是可以实现集群外部访问服务的另外一种解决方案。不过并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型。负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过Service的status.loadBalancer字段被发布出去。
istio中暴露给外部的svc类型就是loadbalancer。可以增加ExternalIPs,来访问istio内部。
apiVersion: v1 kind: Service metadata: name: service-loadbalancer spec: ports: - port: 3000 protocol: TCP targetPort: 443 nodePort: 30080 selector: run: pod-loadbalancer type: LoadBalancer
Headless Service
上面了解service的使用方法和实现逻辑,主要就是代理一组pod容器提供负载均衡以及反向代理服务。但是有时候我们不需要这种负载均衡,比如下面的两个场景:
K8S部署某个kafka集群,此时就不需要service来负载均衡,客户端需要的是一组pod所有ip的列表。
客户端自己处理负载均衡的逻辑,比如K8S部署两个mysql,客户端自己处理负载请求,或者根本不处理这种负载,就要两套mysql然后手动控制读写请求。
基于上面的两个场景,K8S提供了headless serivce功能,字面意思是无头service,其实就是该service不显式的对外提供IP。
servicename的直接使用规则是:
<pod-name>.<svc-name>.<namespace>.svc.cluster.local:port
apiVersion: v1 kind: Service metadata: name: service-headless spec: ports: - port: 3000 protocol: TCP targetPort: 443 nodePort: 30080 clusterIP: None ##如此配置即开启了headless serivce selector: app: pod-headless type: NodePort
一般headless service会结合statefulset一起使用。
statefulset一般用于比如,mysql集群,redis集群等,应用场景有:
1、稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
2、稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
3、有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前的所有Pod必须都是Running和Ready状态),基于init containers来实现
4、有序收缩,有序删除(即从N-1到0)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)