随笔 - 14  文章 - 0  评论 - 1  阅读 - 13765

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)

 

posted on   啊哈好223  阅读(455)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示