在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

K8S Service的基本概念和使用方式及實(shí)現(xiàn)原理

馬哥Linux運(yùn)維 ? 來源:twt企業(yè)IT社區(qū) ? 作者:陳成 ? 2022-03-15 10:41 ? 次閱讀

【作者】陳成,中國聯(lián)通軟件研究院容器云研發(fā)工程師,公共平臺(tái)與架構(gòu)研發(fā)事業(yè)部云計(jì)算研發(fā)組長,長期從事大規(guī)模基礎(chǔ)平臺(tái)建設(shè)相關(guān)工作,先后從事Mesos、KVM、K8S等研究,專注于容器云計(jì)算框架、集群調(diào)度、虛擬化等。

故事的開始,讓我們先從一件生產(chǎn)故障說起。5月29日,內(nèi)部某系統(tǒng)出現(xiàn)大規(guī)模訪問Service故障,發(fā)現(xiàn)Pod容器內(nèi)無法正常訪問ServiceIP:Port,整個(gè)故障持續(xù)時(shí)間超過12h,相關(guān)運(yùn)維支撐人員沒有找到根本原因和解決辦法。

經(jīng)過復(fù)盤,我們發(fā)現(xiàn),大家對于K8S Service的原理不夠清晰,導(dǎo)致對問題的定位不能做得到快速準(zhǔn)確,如果當(dāng)時(shí)能夠按照如下的思路去思考問題,排查過程不至于花費(fèi)如此久的時(shí)間。

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

下面,我們就來細(xì)說一下Service在Kubernetes中的作用、使用方法及原理

Service是一種暴露一組Pod網(wǎng)絡(luò)的抽象方式,K8S Service提供了針對于一組Pod的負(fù)載均衡的暴露。通過這樣的方式,可以避免不同的pod之間訪問時(shí)需要知曉對應(yīng)pod網(wǎng)絡(luò)信息的痛苦。例如:前端->后端,由于前端POD IP隨時(shí)變動(dòng),后端亦如此,如何處理前端POD和后端POD的通信,就需要Service這一抽象,來保證簡單可靠。

Service的使用

1、典型服務(wù)配置方法

當(dāng)配置了selector之后,Service Controller會(huì)自動(dòng)查找匹配這個(gè)selector的pod,并且創(chuàng)建出一個(gè)同名的endpoint對象,負(fù)責(zé)具體service之后連接。

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

2、配置沒有selector的服務(wù)

沒有selector的service不會(huì)出現(xiàn)Endpoint的信息,需要手工創(chuàng)建Endpoint綁定,Endpoint可以是內(nèi)部的pod,也可以是外部的服務(wù)。

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
對定義了選擇算符的無頭服務(wù),Endpoint 控制器在 API 中創(chuàng)建了 Endpoints 記錄, 并且修改 DNS 配置返回 A 記錄(IP 地址),通過這個(gè)地址直接到達(dá) 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

對沒有定義選擇算符的無頭服務(wù),Endpoint 控制器不會(huì)創(chuàng)建 Endpoints 記錄。然而 DNS 系統(tǒng)會(huì)查找和配置,無論是:

  • 對于 ExternalName 類型的服務(wù),查找其 CNAME 記錄

  • 對所有其他類型的服務(wù),查找與 Service 名稱相同的任何 Endpoints 的記錄

Service的實(shí)現(xiàn)方式

1.用戶態(tài)代理訪問

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

即:當(dāng)對于每個(gè)Service,Kube-Proxy會(huì)在本地Node上打開一個(gè)隨機(jī)選擇的端口,連接到代理端口的請求,都會(huì)被代理轉(zhuǎn)發(fā)給Pod。那么通過Iptables規(guī)則,捕獲到達(dá)Service:Port的請求都會(huì)被轉(zhuǎn)發(fā)到代理端口,代理端口重新轉(zhuǎn)為對Pod的訪問

這種方式的缺點(diǎn)是存在內(nèi)核態(tài)轉(zhuǎn)為用戶態(tài),再有用戶態(tài)轉(zhuǎn)發(fā)的兩次轉(zhuǎn)換,性能較差,一般不再使用

2.Iptables模式

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

3.Ipvs模式

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

Service Iptables實(shí)現(xiàn)原理

Iptables表和鏈及處理過程

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

Service的Traffic流量將會(huì)通過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模式下上的表現(xiàn)

  • 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

同時(shí),可以看到Service所申請的端口38081被Kube-proxy所代理和監(jiān)聽

# 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規(guī)則轉(zhuǎn)發(fā)到對應(yīng)的外部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

總結(jié)

  • ClusterIP類型,KubeProxy監(jiān)聽Service和Endpoint創(chuàng)建規(guī)則,采用DNAT將目標(biāo)地址轉(zhuǎn)換為Pod的ip和端口,當(dāng)有多個(gè)ep時(shí),按照策略進(jìn)行轉(zhuǎn)發(fā),默認(rèn)RR模式時(shí),iptables采用:比如有4個(gè)實(shí)例,四條規(guī)則的概率分別為0.25, 0.33, 0.5和 1,按照順序,一次匹配完成整個(gè)流量的分配。

  • NodePort類型,將會(huì)在上述ClusterIP模式之后,再加上Kube-Proxy的監(jiān)聽(為了確保其他服務(wù)不會(huì)占用該端口)和KUBE-NODEPORT的iptable規(guī)則

審核編輯:郭婷


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    16979

    瀏覽量

    182995
  • 云計(jì)算
    +關(guān)注

    關(guān)注

    39

    文章

    7972

    瀏覽量

    139388

原文標(biāo)題:K8S Service實(shí)戰(zhàn)與原理初探

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    簡述K3SK8S的區(qū)別

    K3s 是CNCF 認(rèn)證的 Kubernetes 發(fā)行版和Sandbox項(xiàng)目,專為低資源環(huán)境而設(shè)計(jì)。由 Rancher Labs 維護(hù)著 K3s
    的頭像 發(fā)表于 04-18 10:27 ?283次閱讀

    如何通過Docker和K8S集群實(shí)現(xiàn)高效調(diào)用GPU

    在有GPU資源的主機(jī)安裝,改主機(jī)作為K8S集群的Node。
    的頭像 發(fā)表于 03-18 16:50 ?380次閱讀
    如何通過Docker和<b class='flag-5'>K8S</b>集群<b class='flag-5'>實(shí)現(xiàn)</b>高效調(diào)用GPU

    搭建k8s需要買幾臺(tái)云主機(jī)?

    至少3臺(tái)。搭建Kubernetes(K8s)集群所需的云主機(jī)數(shù)量因?qū)嶋H需求而異。一個(gè)基本的K8s集群通常需要至少3臺(tái)云主機(jī),包括1個(gè)Master節(jié)點(diǎn)和2個(gè)Worker節(jié)點(diǎn)。如果考慮高可用性和容錯(cuò)能力
    的頭像 發(fā)表于 02-20 10:40 ?347次閱讀

    自建K8S集群認(rèn)證過期

    今天使用kubectl命令查看pod信息時(shí),一直正常運(yùn)行的k8s集群突然不能訪問了,輸入任何命令都提示以下報(bào)錯(cuò)。
    的頭像 發(fā)表于 02-07 12:32 ?319次閱讀

    k8s和docker區(qū)別對比,哪個(gè)更強(qiáng)?

    部署、擴(kuò)展、管理和應(yīng)用生命周期管理能力,可實(shí)現(xiàn)高可用性和自動(dòng)伸縮,兩者常結(jié)合使用以優(yōu)化容器化和應(yīng)用管理。UU云小編將對k8s和docker區(qū)別進(jìn)行詳細(xì)對比:
    的頭像 發(fā)表于 12-11 13:55 ?558次閱讀

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

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

    Docker和k8s的核心概念

    這是在HWL負(fù)責(zé)網(wǎng)校云業(yè)務(wù)線測試時(shí),給同事分享的基礎(chǔ)概念文檔。
    的頭像 發(fā)表于 11-04 15:47 ?448次閱讀
    Docker和<b class='flag-5'>k8s</b>的核心<b class='flag-5'>概念</b>

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

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

    k8s云原生開發(fā)要求

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

    k8s容器啟動(dòng)失敗的常見原因及解決辦法

    k8s容器啟動(dòng)失敗的問題通常出現(xiàn)在開發(fā)者使用Kubernetes進(jìn)行容器編排時(shí),可能的原因有多種,例如:配置錯(cuò)誤、鏡像問題、資源限制、依賴問題、網(wǎng)絡(luò)問題、節(jié)點(diǎn)狀態(tài)異常、其他因素等,以下是對這些常見原因的詳細(xì)分析:
    的頭像 發(fā)表于 10-11 10:12 ?634次閱讀

    云服務(wù)器部署k8s需要什么配置?

    云服務(wù)器部署K8s需要至少2核CPU、4GB內(nèi)存、50GBSSD存儲(chǔ)的主節(jié)點(diǎn)用于管理集群,工作節(jié)點(diǎn)建議至少2核CPU、2GB內(nèi)存、20GBSSD。還需安裝Docker,選擇兼容的Kubernetes版本,配置網(wǎng)絡(luò)插件,以及確保系統(tǒng)安全、監(jiān)控和備份措施到位。
    的頭像 發(fā)表于 10-09 15:31 ?438次閱讀

    常用的k8s容器網(wǎng)絡(luò)模式有哪些?

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

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

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

    K8S集群中使用JDOS KMS服務(wù)對敏感數(shù)據(jù)安全加密

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

    K8S學(xué)習(xí)教程三:在PetaExpress KubeSphere 容器部署 Wiki 系統(tǒng) wiki.js 并啟用中文全文檢索

    K8S學(xué)習(xí)教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系統(tǒng) wiki.js 并啟用中文全文檢索? 。
    的頭像 發(fā)表于 07-08 17:03 ?945次閱讀
    <b class='flag-5'>K8S</b>學(xué)習(xí)教程三:在PetaExpress KubeSphere 容器部署 Wiki 系統(tǒng) wiki.js 并啟用中文全文檢索
    主站蜘蛛池模板: 1024 在线观看视频免费 | 网红和老师啪啪对白清晰 | 欧美亚洲另类在线观看 | 老子影院午夜精品欧美视频 | 不卡视频免费在线观看 | 一二三区在线观看 | 黄色污网站在线观看 | xxxx黄| 色婷婷综合久久久久中文一区二区 | 天天操穴 | 一级毛片aaa片免费观看 | 777色狠狠一区二区三区香蕉 | 精品香港经典三级在线看 | 欧美日韩中文字幕在线 | 可以免费看黄的网址 | аⅴ天堂 在线 | 午夜影视啪啪免费体验区深夜 | 永久免费观看午夜视频在线 | 国产综合色精品一区二区三区 | 四虎comwww最新地址 | 新版天堂中文网 | 性8sex亚洲区入口 | 午夜寂寞影 | 99久久精品国产免费 | www.看片| 亚洲一区 在线播放 | 男女交性视频免费视频 | 成年片色大黄全免费网址 | 天天透天天射 | 国产青草 | 欧美精品二区 | 欧美肥胖女人bbwbbw视频 | 国产在线色 | 欧美潘金莲一级风流片a级 欧美片欧美日韩国产综合片 | 国产成人精品一区二区三区 | 日韩免费高清一级毛片 | 人人爱天天做夜夜爽毛片 | 亚洲乱码一区二区三区在线观看 | 亚洲a视频在线 | 在线观看www日本免费网站 | 在线观看精品视频看看播放 |