精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

馬哥Linux運維 ? 來源:twt企業IT社區 ? 作者:陳成 ? 2022-03-15 10:41 ? 次閱讀

【作者】陳成,中國聯通軟件研究院容器云研發工程師,公共平臺與架構研發事業部云計算研發組長,長期從事大規?;A平臺建設相關工作,先后從事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規則

審核編輯:郭婷


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

    關注

    112

    文章

    16212

    瀏覽量

    177448
  • 云計算
    +關注

    關注

    39

    文章

    7743

    瀏覽量

    137209

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

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

收藏 人收藏

    評論

    相關推薦

    k8s微服務架構就是云原生嗎?兩者是什么關系

    k8s微服務架構就是云原生嗎?K8s微服務架構并不等同于云原生,但兩者之間存在密切的聯系。Kubernetes在云原生架構中扮演著核心組件的角色,它簡化了容器化應用程序的管理,提供了彈性、自動化
    的頭像 發表于 11-25 09:39 ?61次閱讀

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地與公有云分別建立K8s集群,并確保網絡連接。接著,配置kubeconfig文件連接兩集群,并安裝云服務插件以實現資源互通。然后,編寫Deployment文件部署應用,并使用kubectl命令
    的頭像 發表于 11-07 09:37 ?112次閱讀

    Docker和k8s的核心概念

    這是在HWL負責網校云業務線測試時,給同事分享的基礎概念文檔。
    的頭像 發表于 11-04 15:47 ?149次閱讀
    Docker和<b class='flag-5'>k8s</b>的核心<b class='flag-5'>概念</b>

    k8s可以部署私有云嗎?私有云部署全攻略

    Kubernetes(簡稱K8S)可以部署私有云。Kubernetes是一個開源的容器編排引擎,能夠自動化容器的部署、擴展和管理,使得應用可以在各種環境中高效運行。通過使用Kubernetes,企業可以在自己的數據中心或私有云環境中搭建和管理容器化的應用,實現高度的靈活性
    的頭像 發表于 10-25 09:32 ?131次閱讀

    k8s云原生開發要求

    Kubernetes(K8s)云原生開發對硬件有一定要求。CPU方面,建議至少配備2個邏輯核心,高性能CPU更佳。內存至少4GB,但8GB或更高更推薦。存儲需至少20-30GB可用空間,SSD提升
    的頭像 發表于 10-24 10:03 ?171次閱讀
    <b class='flag-5'>k8s</b>云原生開發要求

    k8s容器啟動失敗的常見原因及解決辦法

    k8s容器啟動失敗的問題通常出現在開發者使用Kubernetes進行容器編排時,可能的原因有多種,例如:配置錯誤、鏡像問題、資源限制、依賴問題、網絡問題、節點狀態異常、其他因素等,以下是對這些常見原因的詳細分析:
    的頭像 發表于 10-11 10:12 ?185次閱讀

    云服務器部署k8s需要什么配置?

    云服務器部署K8s需要至少2核CPU、4GB內存、50GBSSD存儲的主節點用于管理集群,工作節點建議至少2核CPU、2GB內存、20GBSSD。還需安裝Docker,選擇兼容的Kubernetes版本,配置網絡插件,以及確保系統安全、監控和備份措施到位。
    的頭像 發表于 10-09 15:31 ?172次閱讀

    納尼?自建K8s集群日志收集還能通過JMQ保存到JES

    作者:京東科技 劉恩浩 一、背景 基于K8s集群的私有化交付方案中,日志收集采用了ilogtail+logstash+kafka+es方案,其中ilogtail負責日志收集,logstash負責對數
    的頭像 發表于 09-30 14:45 ?187次閱讀

    常用的k8s容器網絡模式有哪些?

    常用的k8s容器網絡模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s的容器網絡模式多種多樣
    的頭像 發表于 09-19 11:29 ?205次閱讀

    基于DPU與SmartNIC的K8s Service解決方案

    1.? 方案背景 1.1. Kubernetes Service介紹 Kubernetes Service是Kubernetes中的一個核心概念,它定義了一種抽象,用于表示一組提供相同功能的Pods
    的頭像 發表于 09-02 17:01 ?873次閱讀
    基于DPU與SmartNIC的<b class='flag-5'>K8s</b> <b class='flag-5'>Service</b>解決方案

    K8S集群中使用JDOS KMS服務對敏感數據安全加密

    基本概念 KMS,Key Management Service,即密鑰管理服務,在K8S集群中,以驅動和插件的形式啟用對Secret,Configmap進行加密。以保護敏感數據, 驅動和插件需要
    的頭像 發表于 08-09 16:00 ?191次閱讀
    <b class='flag-5'>K8S</b>集群中使用JDOS KMS服務對敏感數據安全加密

    K8S學習教程三:在PetaExpress KubeSphere 容器部署 Wiki 系統 wiki.js 并啟用中文全文檢索

    K8S學習教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系統 wiki.js 并啟用中文全文檢索? 。
    的頭像 發表于 07-08 17:03 ?608次閱讀
    <b class='flag-5'>K8S</b>學習教程三:在PetaExpress KubeSphere 容器部署 Wiki 系統 wiki.js 并啟用中文全文檢索

    K8S學習教程(二):在 PetaExpress KubeSphere容器平臺部署高可用 Redis 集群

    并且需要手動重啟節點,相較之下,使用 PetaExpress 提供的 Kubernetes(k8s) 服務 進行 Redis 集群的部署,則展現出了顯著的優勢: 1、安裝便捷:使用鏡像或者 yaml 配置文件即可一件安裝,極大地簡化了安裝流程 2、縮擴容方便:在 擴容 、 縮容 方面的優點一鍵伸縮,
    的頭像 發表于 07-03 15:30 ?692次閱讀
    <b class='flag-5'>K8S</b>學習教程(二):在 PetaExpress KubeSphere容器平臺部署高可用 Redis 集群

    K8S落地實踐經驗分享

    k8s 即 Kubernetes,是一個開源的容器編排引擎,用來對容器化應用進行自動化部署、 擴縮和管理。
    的頭像 發表于 01-02 11:45 ?1041次閱讀
    <b class='flag-5'>K8S</b>落地實踐經驗分享

    amazon s3采用什么架構涉及的基本概念是什么

    用戶提供了存儲和備份的功能,還為開發者提供了存儲、下載和分發大型文件的能力。本文將詳細介紹Amazon S3的架構和基本概念。 S3的架構 Amazon S3采用了分布式架構,將數據分
    的頭像 發表于 12-03 16:37 ?1582次閱讀