k8s的service部分

本文详细介绍了Kubernetes Service的IPVS模式,如何减轻iptables带来的CPU负担,以及ClusterIP、NodePort、LoadBalancer和ExternalName四种类型的Service的工作原理和使用示例。ClusterIP仅内部访问,NodePort开放节点端口,LoadBalancer适用于公有云,ExternalName则通过DNS映射外部服务。

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

一、IPVS模式的service

Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。 kube-proxy 通过 iptables 处理
Service 的过程,需要在宿主机上设置相当多的 iptables
规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
IPVS模式的service,可以使K8s集群支持更多量级的Pod。

kubectl edit cm kube-proxy -n kube-system 

修改内容
在这里插入图片描述
更新kube-proxy pod

kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

在这里插入图片描述
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP

vim svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
      app: myapp

在这里插入图片描述

ip addr

在这里插入图片描述
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod

在这里插入图片描述

二、k8s service的四种类型

1、ClusterIP

这个类型的service有一个ClusterIP,其实就一个VIP。具体实现原理依靠kubeproxy组件,通过iptables或是ipvs实现,这种类型的service只能在集群内访问

在这里插入图片描述

vim svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
      app: myapp
kubectl get svc 

在这里插入图片描述可以看到新建的service mysvc的类型为ClusterIP

在这里插入图片描述集群中可以相互访问
不在集群中就不能访问

2、NodePort

基于ClusterIp,另外在每个Node上开放一个端口,可以从所有的位置访问这个地址。
在这里插入图片描述

vim svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
      app: myapp
  type: NodePort

通过yaml文件创建NodePort类型的service
如果有其他类型的svc,想直接修改的话

kubectl edit svc mysvc 

将type修改成NodePort

在这里插入图片描述查询svc信息

kubectl get svc

在这里插入图片描述
可以看到这个服务为每个Node都打开了32416端口

netstat -antlp | grep 32416

在这里插入图片描述在其他集群中,这个端口也被打开

在外部主机进行测试

在这里插入图片描述

3、LoadBalancer

从外部访问 Service 的第二种方式,适用于公有云上的 Kubernetes 服务。这时候,你可以指定一个 LoadBalancer
类型的 Service。 在service提交后,Kubernetes就会调用 CloudProvider
在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端

在这里插入图片描述
更改kube-proxy配置

kubectl edit cm kube-proxy -n kube-system

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
将 strictARP: false 改为true

修改后刷新生效
kubectl get pod -n kube-system |grep kube-proxy |awk ‘{system(“kubectl delete pod “$1” -n kube-system”)}’

然后从网上拉去这俩个文件,并在harbor仓库里面建立

wget https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
wget https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml

然后编辑文件
修改/metallb.yaml
里面的内容
然后应用

kubectl appluy -f metallb.yaml
在这里插入图片描述
查看ns就可以发现被创建出来的新ns
在这里插入图片描述
查看新的ns所有信息
在这里插入图片描述

ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。

vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.25.32.10-172.25.32.20

然后应用创建cm
并查看创建的cm
在这里插入图片描述

vim lb-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: lb-svc
spec:
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: myapp
  type: LoadBalancer

创建类型为LoadBalancer的service

在这里插入图片描述
可以看到172.25.32.11后台有三个pod的ip

在这里插入图片描述然后在真机里面访问

在这里插入图片描述
就会发现是负载均衡的

4、ExternalName

vim ex-svc.yaml

以下 Service 定义将my-service 服务映射到www.westos.org

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type:  ExternalName
  externalName: www.westos.org

可以看到这个my-service的EXTERNAL-IP修改成了www.westos.org

解析一下这个服务的域名

dig -t A my-service.default.svc.cluster.local. @10.96.0.10

在这里插入图片描述
service允许为其分配一个公有IP

vim ext-ip.yaml
apiVersion: v1
kind: Service
metadata:
  name: ex-service
spec:
  selector:
    app: myapp![在这里插入图片描述](https://img-blog.csdnimg.cn/84157fef41064b11a2da7d7354df81a0.png#pic_center)

  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  externalIPs:
  - 172.25.32.100

在这里插入图片描述
在这里插入图片描述
但是访问不通

externalIPs不会被k8s管理,它属于集群管理员的职责范畴

在这里插入图片描述
在集群的另一个机子里面

ip addr add 172.25.32.100/24 dev eth0

就能访问了

在这里插入图片描述

<think>嗯,用户现在问的是Kubernetes Service的负载均衡策略。我需要先回忆一下Kubernetes中Service的作用以及负载均衡的不同类型。首先,Servicek8s中主要用来暴露应用,让其他服务或外部用户能够访问到Pod。而负载均衡策略则是决定流量如何分发到后端Pod的关键。 用户可能已经了解Service的基本概念,但想深入了解具体的负载均衡策略。我需要先确认Kubernetes支持的几种策略,比如默认的轮询、会话保持(Session Affinity),还有可能的其他方式,比如基于客户端IP的亲和性,或者外部负载均衡器提供的策略。另外,不同云服务商(如AWS、GCP)可能有不同的实现,需要提到这一点吗? 记得之前的回答中,用户问过发版流程,现在转向Service的负载均衡,可能是在实际工作中遇到了流量管理的问题,或者想优化服务性能。用户可能是一个运维工程师或者开发人员,负责维护k8s集群,需要确保服务的高可用和高效负载均衡。 接下来要整理Kubernetes Service的负载均衡策略。首先,Service类型有ClusterIP、NodePort、LoadBalancer和ExternalName,但这里主要关注负载均衡策略,无论Service类型如何。负载均衡策略分为两个层面:kube-proxy的代理模式和外部负载均衡器的配置。 kube-proxy支持三种模式:userspace(已弃用)、iptables和ipvs。其中,ipvs模式提供了更多的负载均衡算法,如轮询(rr)、加权轮询(wrr)、最少连接(lc)、加权最少连接(wlc)等。而默认的iptables模式是基于概率的轮询,没有这些高级算法。 另外,Service的sessionAffinity配置,可以设置基于客户端IP的会话保持,确保同一客户端的请求转发到同一个Pod。但这不是严格的负载均衡策略,而是会话亲和性。 此外,使用Ingress控制器(如Nginx、Traefik)或服务网格(如Istio)时,它们可能提供更复杂的负载均衡策略,比如基于路径、头部的路由,或更高级的算法如一致性哈希。这部分是否需要包含进来?可能用户想知道的是Service本身的策略,而不是外部组件的,但为了全面性,可以简要提及。 需要注意,Kubernetes的Service负载均衡是四层(TCP/UDP)的,而七层(HTTP)的负载均衡通常由Ingress控制器处理。因此,在回答时要区分清楚不同层次的负载均衡策略。 用户的问题是否包括外部负载均衡器?比如,当使用LoadBalancer类型的Service时,云提供商的负载均衡器可能会有自己的策略,如AWS的ALB使用轮询或最少异常算法。这部分是否需要解释?可能用户关心的是k8s自身提供的策略,但结合实际情况,云服务商的策略也很重要,特别是当Service类型为LoadBalancer时。 另外,需要提到如何配置这些策略,比如在Servicespec中设置sessionAffinity,或者选择不同的kube-proxy模式。如果有示例yaml配置会更好,方便用户理解。 总结一下,我需要分点回答:首先介绍Service的负载均衡机制,包括kube-proxy的不同模式及其策略,然后讨论sessionAffinity,接着提到外部负载均衡器和Ingress控制器的策略,最后给出配置示例和选择建议。 可能还需要注意用户的实际应用场景,比如是否需要会话保持,是否需要更高效的负载均衡算法,以及如何根据需求选择合适的策略。例如,高性能场景可能倾向于使用ipvs模式,而需要会话保持的应用则需配置sessionAffinity。 还要检查是否有最新的Kubernetes版本中的变化,比如是否引入了新的负载均衡策略或废弃了旧有的。例如,ipvs模式现在是否已成为默认?或者某些配置是否有更新。 最后,确保回答结构清晰,分点说明,并给出实际工作中的建议,比如如何选择模式,如何配置,以及常见的使用场景和注意事项。</think>以下为Kubernetes Service负载均衡策略的深度解析(附生产环境实战配置): 一、Service负载均衡核心机制 1. 流量代理层级架构 - 四层负载均衡:Service IP + kube-proxy实现TCP/UDP流量转发 - 七层负载均衡:需配合Ingress Controller(如Nginx、Traefik) 2. kube-proxy工作模式对比 | 模式 | 实现原理 | 算法支持 | 性能指标 | |-----------|---------------------|--------------------------|---------------| | iptables | 生成概率轮询规则链 | 随机均衡 | 万级Pod性能下降明显 | | ipvs | 内核级连接调度 | rr/wrr/lc/wlc等8种算法 | 支持十万级Pod连接 | | userspace | 用户态代理(已弃用) | 轮询 | 仅用于兼容旧版本 | 二、Service级别负载均衡策略 1. 基础会话亲和性配置 ```yaml apiVersion: v1 kind: Service spec: sessionAffinity: ClientIP # 可选None/ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 # 默认3小时 ``` 2. IPVS高级调度算法(需启用ipvs模式) ```bash # kube-proxy启动参数配置 --proxy-mode=ipvs --ipvs-scheduler=wlc # 可选rr|wrr|lc|wlc|lblc|lblcr等 ``` 3. 特定云厂商增强策略(以AWS为例): ```yaml metadata: annotations: service.beta.kubernetes.io/aws-load-balancer-attributes: | load_balancing.algorithm.type=least_outstanding_requests ``` 三、Ingress层七层负载均衡策略 1. Nginx Ingress示例(加权轮询) ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri" # 一致性哈希 nginx.ingress.kubernetes.io/load-balance: "ewma" # 指数加权移动平均 ``` 2. 金丝雀流量分配策略 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20" ``` 四、生产环境选型建议 1. 算法选择指南 - 无状态服务:默认轮询(rr) - 长连接场景:最少连接(lc) - 硬件异构:加权轮询(wrr) - 缓存优化:一致性哈希(需Ingress配合) 2. 性能调优参数 ```bash # kube-proxy ipvs模式优化 --ipvs-exclude-cidrs=10.0.0.0/8 # 排除集群内部通信 --ipvs-strict-arp=true # 避免ARP冲突 --ipvs-sync-period=5s # 同步周期 ``` 五、诊断命令工具箱 1. 查看实际负载分布 ```bash # 查看Service端点 kubectl get endpoints <service-name> # IPVS连接统计 ipvsadm -Ln --stats ``` 2. 实时流量监控 ```bash # 跟踪kube-proxy日志 kubectl logs -f <kube-proxy-pod> -n kube-system | grep "SyncProxyRules" # TCP连接数统计 ss -ntp | grep <service-ip> ``` 六、特殊场景处理方案 1. 本地流量优先(拓扑感知路由) ```yaml apiVersion: v1 kind: Service metadata: annotations: service.kubernetes.io/topology-mode: Auto ``` 2. 服务网格增强策略(以Istio为例) ```yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule spec: trafficPolicy: loadBalancer: simple: LEAST_CONN consistentHash: httpHeaderName: X-User-ID ``` 实际生产建议: - 中小规模集群(<100节点)优先使用ipvs + wrr组合 - 有状态服务必须配置sessionAffinity并合理设置超时时间 - 结合Prometheus监控连接数分布,定期分析负载均衡效果 - 重要服务建议在Ingress层和应用层做双重负载均衡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值