k8s-service

本文详细解读了Kubernetes中的Service概念,包括clusterIp、nodePort、loadBalancer,特别介绍了无标签Service和HeadlessService的用法,以及如何实现外部访问集群内部的策略,涉及iptables和IPVS的负载均衡原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、service type

clusterIp: 虚拟的服务IP地址,仅仅用于kubernetes集群内部的pod访问,在node上kube-proxy通过设置的iptables规则转发

nodePort: 使用宿主机的端口,使能够访问node的外部客户端通过node的ip和端口号就可以访问pod里的服务

loadBalancer:使用外接负载均衡器完成到服务的负载分发

 service通过label标签来和pod关联,这些匹配到label的pod的ip和端口组成endPoints,然后由kube-proxy负责将服务IP负载均衡到这些endpoint

2、无label的service

若想将外部的一个服务纳管到集群中,可以创建一个无标签的service,由于无label则无法找到对应的pod,即无法生成对应的endpoint,

因此需要手动创建一个和该 Service同名的Endpoint,用于指向实际的后端访问地址

 3、Headless Service

若不使用kubernetes提供的负载均衡策略,而要自己来实现控制,Headless Service来实现这种功能, 即不为Service设置ClusterIP(入口IP地址),仅通过Label Selector将后 端的Pod列表返回给调用的客户端

clusterIp:None

4、外部访问集群内部

4.1 将容器里的端口号映射到物理机

通过设置容器级别的hostPort

4.2 通过设置pod级别的hostNetwork = true

此时如果不指定容器里的hostPort,则默认hostPort等于containerPort

4.3 将service的端口号映射到宿主机

指定service的type 为NodePort,同时指定ports里的节点端口号nodePort,同样,对该Service的访问也将被负载分发到后端的多个Pod上

5、service的负载均衡原理

service其实是对一组pod的抽象,它会根据访问策略来访问这组pod,在大多数情况下,service其实只是一种抽象的概念,其真正实现是运行在node上的kube-proxy进程

kube-proxy 一共经历了三次演变

第一次:客户端发起请求到service的clusterIp时,service根据iptables规则再将请求转发到本机的kube-proxy(用户态)上,然后由kube-proxy与pod建立起TCP/UDP连接,然后将请求转发到某个后端Pod上

第二次:kubernetes从1.2版本起,将iptables作为kube-proxy的默认模式,iptables模式下的kube-proxy不再起到代理的作用,其核心功能:通过API Server的WATCH机制实时监控service以及endpoint的变更信息,并更新对应的iptables规则,client的请求流量通过iptables的DNAT机制直接路由到目标pod上,此模式简单,但是有个缺陷:在集群中 的Service和Pod大量增加以后,iptables中的规则会急速膨胀,导致性能显著下降,在某些极端情况下甚至会出现规则丢失的情况,并且这种故 障难以重现与排查,由此引入第三代

第三次:将iptables升级为IPVS (实现机制同上,只是将iptables替换成了IPVS,在某些场景下还是需要与iptables搭配使用)

               iptables与IPVS虽然都是基于Netfilter实现的,但因为定位不同,二 者有着本质的差别:iptables是为防火墙而设计的;IPVS则专门用于高 性能负载均衡,并使用更高效的数据结构(Hash表),允许几乎无限的 规模扩张,因此被kube-proxy采纳为第三代模式,但由于IPVS无法提供包过滤、airpin-masquerade tricks(地址伪装)、SNAT等功能,因此在某些场景(如NodePort的实现)下还要与iptables 搭配使用。在IPVS模式下,kube-proxy又做了重要的升级,即使用 iptables的扩展ipset,而不是直接调用iptables来生成规则链。

 

 

 

 




 

### 配置和使用Prometheus Adapter #### 安装Prometheus Adapter 为了使Prometheus Adapter正常工作,在Kubernetes集群中必须先部署Prometheus实例[^1]。一旦Prometheus成功运行并收集到所需的度量指标,就可以通过Helm Chart或其他方式来安装Prometheus Adapter。 对于基于Helm的安装过程,通常会涉及如下命令: ```bash helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install prometheus-adapter prometheus-community/prometheus-adapter \ --namespace monitoring \ --set logLevel=debug \ --set customMetrics.enabled=true \ --set rules.default.rules.targetLimit=500 ``` 此脚本不仅启用了自定义度量的支持还设置了日志级别以便更好地调试任何潜在问题[^2]。 #### 自定义资源定义(CRD) Prometheus Adapter支持两种类型的CRD:`ServiceMonitor` 和 `PodMonitor` 。前者允许指定服务作为目标;后者则针对特定pod进行监控。当创建这些对象时,Adapter能够自动发现新的端点并将它们加入抓取列表中。 #### API聚合层集成 为了让API服务器识别来自Prometheus Adapter的新路径,需修改apiserver配置文件以包含外部插件选项: ```yaml apiVersion: apiservice.k8s.io/v1beta1 kind: APIService metadata: name: v1beta1.custom.metrics.k8s.io spec: service: namespace: "monitoring" name: "prometheus-adapter" group: "custom.metrics.k8s.io" version: "v1beta1" ``` 上述YAML片段展示了如何注册一个新的APIServices条目给定名称空间内的Prometheus Adapter服务[^4]。 #### 使用示例 假设已经有一个正在运行的应用程序,并希望根据CPU利用率调整其副本数量,则可以在Horizontal Pod Autoscaler (HPA) 中利用Prometheus Adapter提供的接口实现这一功能: ```yaml apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: example-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: example-app-deployment minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metricName: cpu_usage_ratio_per_pod targetAverageValue: 70m ``` 在此例子中,`cpu_usage_ratio_per_pod`是一个由Prometheus Adapter暴露出来的自定义度量标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值