国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

K8S Service的基本概念和使用方式及實現原理

馬哥Linux運維 ? 來源:twt企業IT社區 ? 作者:陳成 ? 2022-03-15 10:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【作者】陳成,中國聯通軟件研究院容器云研發工程師,公共平臺與架構研發事業部云計算研發組長,長期從事大規模基礎平臺建設相關工作,先后從事Mesos、KVM、K8S等研究,專注于容器云計算框架、集群調度、虛擬化等。

故事的開始,讓我們先從一件生產故障說起。5月29日,內部某系統出現大規模訪問Service故障,發現Pod容器內無法正常訪問ServiceIP:Port,整個故障持續時間超過12h,相關運維支撐人員沒有找到根本原因和解決辦法。

經過復盤,我們發現,大家對于K8S Service的原理不夠清晰,導致對問題的定位不能做得到快速準確,如果當時能夠按照如下的思路去思考問題,排查過程不至于花費如此久的時間。

5679cccc-9883-11ec-952b-dac502259ad0.png

下面,我們就來細說一下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.ExternalName5.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.用戶態代理訪問

569063ba-9883-11ec-952b-dac502259ad0.png

即:當對于每個Service,Kube-Proxy會在本地Node上打開一個隨機選擇的端口,連接到代理端口的請求,都會被代理轉發給Pod。那么通過Iptables規則,捕獲到達Service:Port的請求都會被轉發到代理端口,代理端口重新轉為對Pod的訪問

這種方式的缺點是存在內核態轉為用戶態,再有用戶態轉發的兩次轉換,性能較差,一般不再使用

2.Iptables模式

56a87a18-9883-11ec-952b-dac502259ad0.png

3.Ipvs模式

56b85848-9883-11ec-952b-dac502259ad0.png

Service Iptables實現原理

Iptables表和鏈及處理過程

56ce1b6a-9883-11ec-952b-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規則

審核編輯:郭婷


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    114

    文章

    17791

    瀏覽量

    193187
  • 云計算
    +關注

    關注

    39

    文章

    8021

    瀏覽量

    144413

原文標題:K8S Service實戰與原理初探

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Helm包管理與模板化部署實戰

    直接用kubectl管理K8s資源,10個微服務就要維護幾十個YAML文件,版本管理靠文件夾命名,回滾靠手動替換文件。Helm把一組相關的K8s資源打包成Chart,支持模板化、版本管理、一鍵部署和回滾,是K8s生態中事實上的包
    的頭像 發表于 02-26 16:37 ?198次閱讀

    Kubernetes容器運行時containerd與CRI-O如何選擇

    Kubernetes 1.24版本正式移除了dockershim,Docker不再是K8s的默認容器運行時。這個變化直接影響了所有K8s集群的運維方式——升級到1.24+必須切換到containerd或CRI-O。
    的頭像 發表于 02-26 09:54 ?188次閱讀

    Kubernetes故障排查手冊

    K8s集群出故障是常態。Pod起不來、Service訪問不通、節點NotReady、證書過期、etcd磁盤滿——每一個問題都可能導致業務中斷。和傳統運維不同,K8s的故障鏈路更長:一個請求從
    的頭像 發表于 02-26 09:47 ?187次閱讀

    一文帶你徹底搞懂K8s網絡

    說實話,K8s 網絡是我見過最讓新手頭疼的知識點,沒有之一。記得我剛接觸 K8s 那會兒,看著流量在 Pod、Service、Node 之間穿梭,完全是一臉懵逼。后來踩了無數坑,熬了無數夜,總算把這套網絡模型摸透了。今天這篇文章
    的頭像 發表于 02-06 10:15 ?446次閱讀

    K8s生產環境10大踩坑記錄復盤

    這篇文章記錄了我這些年在 K8s 生產環境踩過的坑。每一個案例都是血淚教訓,有些甚至導致了生產事故。希望通過分享這些經歷,能幫助大家避免重蹈覆轍。
    的頭像 發表于 02-05 15:51 ?310次閱讀

    K8s集群性能調優實戰技巧

    大多數團隊在遇到K8s性能問題時,第一反應是"加機器"。但根據我對超過50個生產集群的分析,80%的性能問題源于配置不當,而非資源不足。
    的頭像 發表于 09-08 09:36 ?789次閱讀

    K8s存儲類設計與Ceph集成實戰

    在云原生時代,存儲是制約應用性能的關鍵瓶頸。本文將帶你深入理解K8s存儲類的設計原理,并手把手實現與Ceph的完美集成,讓你的集群存儲性能提升300%!
    的頭像 發表于 08-22 11:50 ?871次閱讀

    Linux內核參數調優方案

    在高并發微服務環境中,網絡性能往往成為K8s集群的瓶頸。本文將深入探討如何通過精細化的Linux內核參數調優,讓你的K8s節點網絡性能提升30%以上。
    的頭像 發表于 08-06 17:50 ?957次閱讀

    解析K8S實用命令

    前言: 作為運維工程師,掌握 Kubernetes 命令行工具是日常工作的核心技能。本文將深入解析 K8S 最實用的命令,從基礎操作到高級技巧,助你成為容器化集群管理專家。
    的頭像 發表于 07-24 14:07 ?870次閱讀

    k8s權限管理指南說明

    我們在目前的k8s集群環境里面,只能在master節點上執行kubectl的一些命令,在其他節點上執行就會報錯。
    的頭像 發表于 06-26 14:06 ?736次閱讀

    什么是 K8S,如何使用 K8S

    和回滾。 Service:為 Pod 提供穩定的訪問入口,支持負載均衡。 Namespace:邏輯隔離機制,用于劃分資源域。 二、如何使用 K8S 安裝與部署 環境要求: 操作系統:CentOS
    發表于 06-25 06:45

    k8s網絡的基本介紹

    Kubernetes網絡是指在Kubernetes集群中不同組件之間進行通信和交互的網絡架構。
    的頭像 發表于 06-16 13:42 ?943次閱讀

    第十三章 通訊的基本概念

    本章介紹通訊基本概念,包括串行/并行、全雙工/半雙工/單工、同步/異步通訊,還提及通訊速率中比特率與波特率的概念
    的頭像 發表于 05-22 17:29 ?2068次閱讀
    第十三章 通訊的<b class='flag-5'>基本概念</b>

    簡述K3SK8S的區別

    K3s 是CNCF 認證的 Kubernetes 發行版和Sandbox項目,專為低資源環境而設計。由 Rancher Labs 維護著 K3s
    的頭像 發表于 04-18 10:27 ?1730次閱讀

    如何通過Docker和K8S集群實現高效調用GPU

    在有GPU資源的主機安裝,改主機作為K8S集群的Node。
    的頭像 發表于 03-18 16:50 ?1215次閱讀
    如何通過Docker和<b class='flag-5'>K8S</b>集群<b class='flag-5'>實現</b>高效調用GPU