0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Service在Kubernetes中的作用、使用方法及原理

马哥Linux运维 来源:马哥Linux运维 作者:陈成 2022-07-26 10:11 次阅读

【导读】本文主要讲述了K8S Service的基本概念,使用方式及实现原理。

故事的开始,让我们先从一件生产故障说起。5月29日,内部某系统出现大规模访问Service故障,发现Pod容器内无法正常访问ServiceIP:Port,整个故障持续时间超过12h,相关运维支撑人员没有找到根本原因和解决办法。

经过复盘,我们发现,大家对于K8S Service的原理不够清晰,导致对问题的定位不能做得到快速准确,如果当时能够按照如下的思路去思考问题,排查过程不至于花费如此久的时间。

下面,我们就来细说一下Service在Kubernetes中的作用、使用方法及原理

Service是一种暴露一组Pod网络的抽象方式,K8S Service提供了针对于一组Pod的负载均衡的暴露。通过这样的方式,可以避免不同的pod之间访问时需要知晓对应pod网络信息的痛苦。例如:前端->后端,由于前端POD IP随时变动,后端亦如此,如何处理前端POD和后端POD的通信,就需要Service这一抽象,来保证简单可靠。

Service的使用

1、典型服务配置方法

当配置了selector之后,Service Controller会自动查找匹配这个selector的pod,并且创建出一个同名的endpoint对象,负责具体service之后连接。

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  selector:    app: MyApp  ports:    - protocol: TCP      port: 80      targetPort: 9376

2、配置没有selector的服务

没有selector的service不会出现Endpoint的信息,需要手工创建Endpoint绑定,Endpoint可以是内部的pod,也可以是外部的服务。

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  ports:    - protocol: TCP      port: 80      targetPort: 9376---apiVersion: v1kind: Endpointsmetadata:  name: my-servicesubsets:  - addresses:      - ip: 192.0.2.42    ports:      - port: 9376

Service的类型

1.CluserIP

kubectl expose pod nginx --type=CluserIP --port=80 --name=ng-svc apiVersion: v1kind: Servicemetadata:  name: ng-svc  namespace: defaultspec:  selector:      name: nginx  clusterIP: 11.254.0.2  ports:  - name: http    port: 80    protocol: TCP    targetPort: 1234  sessionAffinity: None  type: ClusterIP

2.LoadBalance

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  selector:    app: MyApp  ports:  - protocol: TCP    port: 80    targetPort: 9376  clusterIP: 10.0.171.239  type: LoadBalancerstatus:  loadBalancer:    ingress:    - ip: 192.0.2.127
3.NodePort

apiVersion: v1kind: Servicemetadata:name: my-servicespec:type: NodePortselector:  app: MyAppports:  - port: 80    targetPort: 80    nodePort: 30007
4.ExternalName 5.Headless

apiVersion: v1kind: Servicemetadata:  labels:    run: curl  name: my-headless-service  namespace: defaultspec:  clusterIP: None  ports:  - port: 80    protocol: TCP    targetPort: 80  selector:    run: curl  type: ClusterIP
对定义了选择算符的无头服务,Endpoint 控制器在 API 中创建了 Endpoints 记录, 并且修改 DNS 配置返回 A 记录(IP 地址),通过这个地址直接到达 Service 的后端 Pod 上。

# ping my-headless-servicePING my-headless-service (172.200.6.207): 56 data bytes64 bytes from 172.200.6.207: seq=0 ttl=64 time=0.040 ms64bytesfrom172.200.6.207:seq=1ttl=64time=0.063ms

对没有定义选择算符的无头服务,Endpoint 控制器不会创建 Endpoints 记录。然而 DNS 系统会查找和配置,无论是:

对于 ExternalName 类型的服务,查找其 CNAME 记录

对所有其他类型的服务,查找与 Service 名称相同的任何 Endpoints 的记录

Service的实现方式

1.用户态代理访问

5ef8eec8-0c23-11ed-ba43-dac502259ad0.png

即:当对于每个Service,Kube-Proxy会在本地Node上打开一个随机选择的端口,连接到代理端口的请求,都会被代理转发给Pod。那么通过Iptables规则,捕获到达Service:Port的请求都会被转发到代理端口,代理端口重新转为对Pod的访问

这种方式的缺点是存在内核态转为用户态,再有用户态转发的两次转换,性能较差,一般不再使用

2.Iptables模式

5f1bd4d8-0c23-11ed-ba43-dac502259ad0.png

3.Ipvs模式

5f43f0c6-0c23-11ed-ba43-dac502259ad0.png

Service Iptables实现原理

Iptables表和链及处理过程

5f66bebc-0c23-11ed-ba43-dac502259ad0.png

Service的Traffic流量将会通过prerouting和output重定向到kube-service链

-APREROUTING-mcomment--comment"kubernetesserviceportals"-jKUBE-SERVICES-APOSTROUTING-mcomment--comment"kubernetespostroutingrules"-jKUBE-POSTROUTING-A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES

KUBE-SERVICES->KUBE-SVC-XXXXXXXXXXXXXXXX->KUBE-SEP-XXXXXXXXXXXXXXXX represents a ClusterIP service

KUBE-NODEPORTS->KUBE-SVC-XXXXXXXXXXXXXXXX->KUBE-SEP-XXXXXXXXXXXXXXXX represents a NodePort service

几种不同类型的Service在Kube-Proxy启用Iptables模式下上的表现

ClusterIP

-A KUBE-SERVICES ! -s 172.200.0.0/16 -d 10.100.160.92/32 -p tcp -m comment --comment "default/ccs-gateway-clusterip:http cluster IP" -m tcp --dport 30080 -j KUBE-MARK-MASQ-A KUBE-SERVICES -d 10.100.160.92/32 -p tcp -m comment --comment "default/ccs-gateway-clusterip:http cluster IP" -m tcp --dport 30080 -j KUBE-SVC-76GERFBRR2RGHNBJ  

-A KUBE-SVC-76GERFBRR2RGHNBJ -m comment --comment "default/ccs-gateway-clusterip:http" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-GBVECAZBIC3ZKMXB-A KUBE-SVC-76GERFBRR2RGHNBJ -m comment --comment "default/ccs-gateway-clusterip:http" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-PVCYYXEU44D3IMGK-A KUBE-SVC-76GERFBRR2RGHNBJ -m comment --comment "default/ccs-gateway-clusterip:http" -j KUBE-SEP-JECGZLHE32MEARRX-AKUBE-SVC-CEZPIJSAUFW5MYPQ-mcomment--comment"kubernetes-dashboard/kubernetes-dashboard"-jKUBE-SEP-QO6MV4HR5U56RP7M

-A KUBE-SEP-GBVECAZBIC3ZKMXB -s 172.200.6.224/32 -m comment --comment "default/ccs-gateway-clusterip:http" -j KUBE-MARK-MASQ-AKUBE-SEP-GBVECAZBIC3ZKMXB-ptcp-mcomment--comment"default/ccs-gateway-clusterip:http"-mtcp-jDNAT--to-destination172.200.6.224:80...

NodePort

apiVersion: v1kind: Servicemetadata:labels:  app: ccs-gatewayspec:clusterIP: 10.101.156.39externalTrafficPolicy: Clusterports:- name: http  nodePort: 30081  port: 30080  protocol: TCP  targetPort: 80selector:  app: ccs-gatewaysessionAffinity: Nonetype: NodePort

-AKUBE-NODEPORTS-ptcp-mcomment--comment"default/ccs-gateway-service:http"-mtcp--dport30081-jKUBE-MARK-MASQ-AKUBE-NODEPORTS-ptcp-mcomment--comment"default/ccs-gateway-service:http"-mtcp--dport30081-jKUBE-SVC-QYHRFFHL5VINYT2K############################-AKUBE-SVC-QYHRFFHL5VINYT2K-mcomment--comment"default/ccs-gateway-service:http"-mstatistic--moderandom--probability0.50000000000-jKUBE-SEP-2NPKETIWKKVUXGCL-AKUBE-SVC-QYHRFFHL5VINYT2K-mcomment--comment"default/ccs-gateway-service:http"-jKUBE-SEP-6O5FHQRN5IVNPW4Q##########################-AKUBE-SEP-2NPKETIWKKVUXGCL-s172.200.6.224/32-mcomment--comment"default/ccs-gateway-service:http"-jKUBE-MARK-MASQ-AKUBE-SEP-2NPKETIWKKVUXGCL-ptcp-mcomment--comment"default/ccs-gateway-service:http"-mtcp-jDNAT--to-destination172.200.6.224:80#########################-AKUBE-SEP-6O5FHQRN5IVNPW4Q-s172.200.6.225/32-mcomment--comment"default/ccs-gateway-service:http"-jKUBE-MARK-MASQ-A KUBE-SEP-6O5FHQRN5IVNPW4Q -p tcp -m comment --comment "default/ccs-gateway-service:http" -m tcp -j DNAT --to-destination 172.200.6.225:80

同时,可以看到Service所申请的端口38081被Kube-proxy所代理和监听

# netstat -ntlp | grep 30081tcp       0      00.0.0.0:30081           0.0.0.0:*               LISTEN     3665705/kube-proxy

LoadBalancer

不带有Endpoint的Service

kubectl create svc clusterip fake-endpoint --tcp=80 -A KUBE-SERVICES -d 10.101.117.0/32 -p tcp -m comment --comment "default/fake-endpoint:80 has no endpoints" -m tcp --dport 80 -j REJECT --reject-with icmp-port-unreachable

带有外部endpoint的Service

直接通过iptable规则转发到对应的外部ep地址

apiVersion: v1kind: Servicemetadata:  labels:    app: external  name: external  namespace: defaultspec:  ports:  - name: http    protocol: TCP    port: 80  sessionAffinity: None  type: ClusterIP---apiVersion: v1kind: Endpointsmetadata:  labels:    app: external  name: external  namespace: defaultsubsets:- addresses:  - ip: 10.124.142.43  ports:  - name: http    port: 80protocol: TCP

-A KUBE-SERVICES ! -s 172.200.0.0/16 -d 10.111.246.87/32 -p tcp -m comment --comment "default/external:http cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ-A KUBE-SERVICES -d 10.111.246.87/32 -p tcp -m comment --comment "default/external:http cluster IP" -m tcp --dport 80 -j KUBE-SVC-LI2K5327B6J24KJ3 

-A KUBE-SEP-QTGIPNOYXN2CZGD5 -s 10.124.142.43/32 -m comment --comment "default/external:http" -j KUBE-MARK-MASQ-A KUBE-SEP-QTGIPNOYXN2CZGD5 -p tcp -m comment --comment "default/external:http" -m tcp -j DNAT --to-destination 10.124.142.43:80

总结

ClusterIP类型,KubeProxy监听Service和Endpoint创建规则,采用DNAT将目标地址转换为Pod的ip和端口,当有多个ep时,按照策略进行转发,默认RR模式时,iptables采用:比如有4个实例,四条规则的概率分别为0.25, 0.33, 0.5和 1,按照顺序,一次匹配完成整个流量的分配。

NodePort类型,将会在上述ClusterIP模式之后,再加上Kube-Proxy的监听(为了确保其他服务不会占用该端口)和KUBE-NODEPORT的iptable规则

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15217

    浏览量

    171153
  • 网络信息
    +关注

    关注

    0

    文章

    26

    浏览量

    10220
  • Service
    +关注

    关注

    0

    文章

    30

    浏览量

    13716

原文标题:K8S Service 实战与原理初探

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    光衰减器的作用 光衰减器的使用方法

    光衰减器是光子学中广泛应用的一种器件,它能够有效地调节入射光的强度,起到控制光信号亮度的作用。在许多光学系统和通信系统中,光衰减器的使用是必不可少的。本文将详细介绍光衰减器的作用使用方法以及
    的头像 发表于 01-25 10:57 375次阅读

    加湿器的作用及好处与坏处 加湿器的正确使用方法

    疾病的发生。然而,过度使用加湿器或错误使用也可能会导致空气中的细菌和霉菌增加,对健康产生负面影响。以下是关于加湿器的作用及好处与坏处以及正确使用方法。 加湿器的作用及好处: 改善干燥环境:加湿器能够在干燥环境
    的头像 发表于 01-25 09:52 404次阅读

    电容器的作用及原理 电容器的使用方法

    电容器,又称电容,是一种用于存储电能的装置。它由两个导体电极和介质组成,能够在这两个电极上存储和释放电荷。电容器的作用和原理,以及其使用方法都是电学中基础的概念。下面将详细介绍电容器的作用
    的头像 发表于 01-18 13:47 1433次阅读

    筋膜枪的作用使用方法

    筋膜枪是一种用于自我按摩和肌肉放松的工具,它使用高频率振动来促进肌肉的血液循环和新陈代谢,同时减轻压力和疼痛。这篇文章将详细介绍筋膜枪的作用使用方法。 一、筋膜枪的作用 放松肌肉:筋膜枪通过
    的头像 发表于 01-11 10:42 372次阅读

    磁场探头和电场探头的使用方法与技巧

    磁场探头和电场探头的使用方法与技巧  磁场探头和电场探头是用于测量磁场和电场的仪器。它们在科学实验、工程设计和实际应用中都起着重要的作用。本文将详细介绍磁场探头和电场探头的使用方法和技巧。 一、磁场
    的头像 发表于 01-05 14:31 389次阅读

    AT32 MCU Printf的功能使用方法

    AT32 MCU Printf的功能使用方法
    的头像 发表于 10-27 09:27 441次阅读
    AT32 MCU Printf的功能<b class='flag-5'>使用方法</b>

    去耦电容的有效使用方法有哪些

    去耦电容的有效使用方法之一是用多个(而非1个)电容进行去耦。使用多个电容时,使用相同容值的电容时和交织使用不同容值的电容时,效果是不同的。
    发表于 08-02 12:34 288次阅读
    去耦电容的有效<b class='flag-5'>使用方法</b>有哪些

    PTC温限传感器使用方法

    PTC温限传感器使用方法
    的头像 发表于 07-28 15:31 660次阅读
    PTC温限传感器<b class='flag-5'>使用方法</b>

    功率电感器的使用方法

    功率电感器的使用方法
    的头像 发表于 07-28 15:21 584次阅读
    功率电感器的<b class='flag-5'>使用方法</b>

    三坐标测量仪作用使用方法

    每一个人都可以使用的,那么三坐标测量仪如何使用?下面就由三本精密仪器小编为大家作出简单的介绍分析蔡司三坐标测量仪作用使用方法你了解吗?三坐标测量仪一:三坐标测量仪
    的头像 发表于 07-13 11:54 1466次阅读
    三坐标测量仪<b class='flag-5'>作用</b>和<b class='flag-5'>使用方法</b>

    Commvault:护航Kubernetes,不止Kubernetes

    Kubernetes已经不再是只存在于路线图中的未来产品。事实上,几乎所有(94%)已经采用容器的企业都在使用Kubernetes,大多数(86%)企业甚至认为它对他们的运营至关重要。这并不令人意外,Kubernetes正在帮助
    的头像 发表于 07-07 14:42 301次阅读

    各种网络组件在 Kubernetes 集群中是如何交互的

    Kubernetes 中有多种网络设置方法,以及 container runtime 的各种选项。这篇文章将使用 Flannel 作为 network provider,并使用 Containered 作为 container runtime。
    的头像 发表于 05-23 09:49 550次阅读
    各种网络组件在 <b class='flag-5'>Kubernetes</b> 集群中是如何交互的

    Kubernetes Pod如何独立工作

    在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod 都能获取 IP 地址。
    的头像 发表于 05-16 14:29 428次阅读
    <b class='flag-5'>Kubernetes</b> Pod如何独立工作

    安全光栅,光幕的使用方法

    安全光栅的使用方法
    的头像 发表于 05-16 09:51 669次阅读
    安全光栅,光幕的<b class='flag-5'>使用方法</b>

    Kubernetes特性有哪些?

    本文将介绍Kubernetes 的重要特性,这将有助于您更深入地了解 Kubernetes 的功能概念。
    的头像 发表于 05-12 16:16 656次阅读
    <b class='flag-5'>Kubernetes</b>特性有哪些?