K8S中的Service的存在理由

2020-08-29 老顧聊技術

歡迎關注頭條號:老顧聊技術

精品原創技術分享,知識的組裝工

前言

上篇文章中老顧介紹了相關pod、容器、node之間的通信,通過pod的ip進行通信,存在一定的問題。

Kubernetes Pod是有生命周期的,它們可以被創建,也可以被銷毀,然而一旦被銷毀生命就永遠結束。 通過ReplicationController能夠動態地創建和銷毀Pod(例如,需要進行擴縮容,或者執行滾動升級)。 每個 Pod 都會獲取它自己的 IP 地址,可一旦銷毀後,重新創建後,IP位址會產生改變。 這會導致一個問題:在 Kubernetes 集群中,如果一組 Pod(稱為 backend)為其它 Pod (稱為 frontend)提供服務,一旦backend的Pod重新創建,那麼frontend的Pod該如何發現,並連接到這組 Pod 中的哪些 backend 呢?

Service

Service資源用於為pod對象提供一個固定、統一的訪問接口及負載均衡的能力,並藉助新一代DNS系統的服務發現功能,解決客戶端發現並訪問容器化應用的問題

注意:service只是在k8s集群內部起作用,集群外部訪問是無效的

實現原理

Service通過關註定義出多個POD對象組合而成的邏輯集合,以及訪問這組POD的策略,Service關聯POD需要標籤選擇器完成,其基於標籤選擇器將一組POD定義成一個邏輯集合,並通過自己的IP位址和埠調度代理請求至後端POD之上

apiVersion: v1kind: Servicemetadata: name: a-servicespec: selector: app: pod-label ports: - protocol: TCP port: 80 targetPort: 9376

上面的例子服務a-service關聯著label為【app:pod-label】的pod,這時候另一個服務B可以訪問跟a-service服務綁定的service,service信息是固定的提前告訴B就行了,service通過Label Selector跟a服務的pod綁定,無論a的pod如何變化對b來說都是透明的。

虛擬IP

service對象的IP位址稱為cluster IP,位於K8S集群配置指定的專用IP位址範圍內,其是一種虛擬IP位址,其在service對象創建後保持不變,並且能夠被同一集群中的POD資源訪問,service埠接受客戶端的請求並將其轉發至後端POD中的相應埠,因此,其又被稱為四層代理,因其工作在TCP/IP層。

一個service對象就是工作節點上的一些iptables或ipvs,用於將到達service對象的IP位址的流量轉發到相應的endpoint對象指定的IP位址和埠上,kube-proxy組件通過api-server持續監控著各個service及其相關的POD對象,並將其創建或變動實時反映到工作節點的iptable或ipvs上

服務代理

k8s群集中的每個節點都運行一個kube-proxy的組件,kube-proxy其實是一個代理層負責實現service

userspace模式

客戶端訪問ServiceIP(clusterIP)請求會先從用戶空間到內核中的iptables,然後回到用戶空間kube-proxy,kube-proxy負責代理工作。

具體細節:

請求到達service後,其被轉發到內核,經由套接字送往用戶空間的kube-proxy,而後經由kube-proxy送回內核空間,並調度至後端POD,其傳輸方式效率太低。在1.1 版本之前,其是默認的轉發策略。

iptables模式

客戶端訪問ServiceIP(clusterIP)請求會由iptables直接重定向到後端

具體細節:

客戶端IP請求時,直接請求本地內核service ip,根據iptables的規則直接將請求轉發到到各pod上,因為使用iptable NAT來完成轉發,也存在不可忽視的性能損耗。另外,如果集群中存在上萬的Service/Endpoint,那麼Node上的iptables rules將會非常龐大,性能還會再打折扣

Kubernetes v1.2之前默認是userspace之後是iptables模式,iptables模式性能和可靠性更好,但是iptables模式依賴健康檢查,在沒有健康檢查的情況下如果一個pod不響應,iptables模式不會切換另一個pod上

ipvs模型

此模型跟蹤API service上的service和endpoints對象的變動,據此來調用netlink接口創建IPVS規則,並確保API server中的變動保持同步,其流量調度策略在IPVS中實現,其餘的在iptables中實現。

ipvs 支持眾多調度算法,如rr、lc、dh、sh、sed和nq 等。

集群外部訪問

我們如何在集群外訪問service呢?k8s提供了幾種方式

NodePort

通過每個 Node 上的 IP 和靜態埠(NodePort)暴露服務。NodePort 服務會路由到 ClusterIP 服務,這個 ClusterIP 服務會自動創建。通過請求 NodeIP:Port,可以從集群的外部訪問一個 NodePort 服務。

這時要訪問這個Service的話,只需要通過訪問

<任何一臺宿主機器的IP>:Port

LoadBalancer

在NodePort基礎上,Kubernetes可以請求底層雲平臺cloud provider 創建一個外部的負載均衡器,並將請求轉發到每個Node作為後端,進行服務分發。

該模式需要底層雲平臺(例如GCE、AWS)支持。

ExternalName

創建一個dns別名指到service name上,主要是防止service name發生變化,要配合dns插件使用。通過返回 CNAME 和它的值,可以將服務映射到 externalName 欄位的內容。

這隻有 Kubernetes 1.7 或更高版本的 kube-dns 才支持

Ingress

上面我們提到幾種方式,但是當集群服務很多的時候,NodePort方式最大的缺點是會佔用很多集群機器的埠;LB方式最大的缺點則是每個service一個LB又有點浪費和麻煩,並且需要k8s之外的支持; 而ingress則只需要一個NodePort或者一個LB就可以滿足所有service對外服務的需求。工作機制大致可以用下圖表示:

Ingress是基於service實現7層路由轉發能力的

總結

K8S中的概念還是比較多的,老顧只是拋磚引玉,小夥伴需要了解更多詳細的可以查看更多詳細的資料。今天老顧就介紹到這裡了,謝謝!!!

---End---


老顧的微服務網關分享課程,請大家多多支持

推薦閱讀

a、

b、

c、

d、

e、

f、

h、

g、

i、

1基於RocketMq的SpringCloud Stream框架實戰入門

2、如何搭建消息中間件應用框架之SpringCloud Stream

3面試必備:網關異常了怎麼辦?如何做全局異常處理?

4Gateway網關系列(二):SpringCloud Gateway入門實戰,路由規則

5Gateway網關系列開篇:SpringCloud的官方網關Gateway介紹

6API網關在微服務架構中的應用,這一篇就夠了

7學習Lambda表達式看這篇就夠了,不會讓你失望的哦(續篇)

8Lambda用在哪裡?幾種場景?

9、為什麼會出現Lambda表達式,你知道嗎?

10、不說「分布式事務」理論,直接上大廠阿里的解決方案,絕對實用

11、女程式設計師問到這個問題,讓我思考了半天,Mysql的「三高」架構

12、大廠二面:CAP原則為什麼只能滿足其中兩項?而不能同時滿足

13、阿里P7二面:聊聊零拷貝的原理

14、秒殺系統的核心點都在這裡,快來取

15、你了解如何利用token方式實現分布式Session嗎?

16、Mysql索引結構演變,為什麼最終會是那個結構呢?讓你一看就懂

17、一場比賽涉及到的知識,用通俗易通的方式介紹並發協調

18、企業實戰Redis全方面思考,你思考了嗎?

19、面試題:Thread的start和run的區別

20、面試題:什麼是CAS?CAS的作用以及缺點

21、如何訪問redis中的海量數據?避免事故產生

22、如何解決Redis熱點問題?以及如何發現熱點?

23、如何設計API接口,實現統一格式返回?

24、你真的知道在生產環境下如何部署tomcat嗎?

25、分享一線網際網路大廠分布式唯一ID設計 之 snowflake方案

26、分享大廠分布式唯一ID設計方案,快來圍觀

27、你想了解一線大廠的分布式唯一ID生成方案嗎?

28、你知道如何處理大數據量嗎?(數據拆分篇)

29、如何永不遷移數據和避免熱點? 根據伺服器指標分配數據量(揭秘篇)

30、你知道怎麼分庫分表嗎?如何做到永不遷移數據和避免熱點嗎?

31、你了解大型網站的頁面靜態化嗎?

32、你知道如何更新緩存嗎?如何保證緩存和資料庫雙寫一致性?

33、你知道怎麼解決DB讀寫分離,導致數據不一致問題嗎?

34、DB讀寫分離情況下,如何解決緩存和資料庫不一致性問題?

35、你真的知道怎麼使用緩存嗎?

36、如何利用鎖,防止緩存擊穿?重構思想的重要性

37、海量訂單產生的業務高峰期,如何避免消息的重複消費?

38、你知道如何保障生產端100%消息投遞成功嗎?

39、微服務下的分布式session該如何管理?

40、阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

41、網際網路架構重要組員CDN,很多高級開發都沒有實操過,來看這裡

42、阿里二面:CDN緩存控制原理,看看能不能難住你

43、SpringCloud Alibaba之Nacos多環境多項目管理

44、SpringCloud Alibaba系列之Nacos配置中心玩法

45、SpringCloud Alibaba之Nacos註冊中心

46、SpringCloud Plus版本之SpringCloud Alibaba

47、SpringCloud Alibaba之Nacos集群、持久化

48、SpringCloud Alibaba之Nacos共享配置、灰度配置

49、SpringCloud Alibaba之Sentinel工作原理

50、SpringCloud Alibaba之Sentinel流控管理

51、SpringCloud Alibaba之Sentinel降級管理

52、SpringCloud Alibaba之Sentinel熱點參數限流

53、SpringCloud Alibaba之Sentinel的API實戰

相關焦點

  • K8S中的Service的存在理由
    POD資源訪問,service埠接受客戶端的請求並將其轉發至後端POD中的相應埠,因此,其又被稱為四層代理,因其工作在TCP/IP層。k8s群集中的每個節點都運行一個kube-proxy的組件,kube-proxy其實是一個代理層負責實現serviceuserspace模式客戶端訪問ServiceIP(clusterIP)請求會先從用戶空間到內核中的iptables,然後回到用戶空間kube-proxy,kube-proxy負責代理工作。
  • 容器編排系統k8s之Service資源
    Service資源在k8s上主要用來解決pod訪問問題;我們知道在k8s上pod由於各種原因重建,對於重建後的podip地址和名稱都是變化的,這樣一來使得我們訪問pod就變得有些不便;為了解決pod訪問能有一個固定的端點,在k8s上就是用service來解決的;簡單來講,service對象就是工作在節點上的一組iptables或ipvs規則,用於將到達service對象ip
  • k8s重器之Service
    Service是k8s的核心,通過創建Service,可以為一組具有相同功能的容器應用提供一個統一的入口地址,並將請求進行負載分發到各個容器應用上。內部埠 status: loadBalancer: ingress: ip: string hostname: string上述定義中的spec.type有兩個選項:當為NodePort時,需要配置nodePort映射到指定埠當為LoadBalancer,需要在status中設置外部負載均衡器二、Service基本用法
  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-service的介紹和基本操作
    通過k8s部署集群並提供服務的時候,會部署很多的pod以及pod副本來保證服務的高可用。這也帶來了一個問題!!這麼多pod提供服務,外部如何訪問這些服務?在k8s中,每個pod都會被分配一個ip,即每個pod都唯一的ip。
  • k8s之Service資源
    Service為四層調度器service而kube-proxy為DaemonSet 控制器將會在集群中每個節點運行一個Pod或者守護進程 如果需要轉換ipvs規則,則需要手動加載ipvs模塊進入內核iptables代理模式,對於每個Service對象,kube-proxy會創建iptables規則直接捕獲到達cluster ip和Port流量,並將其重定向至當前Service對象的後端Pod資源,對於每個Endpoint
  • 乾貨|帶您了解k8s
    客戶端是通過service來找到pod的,service是通過pod的標籤選擇器來找到pod的。service只是一個iptables方式的net地址轉換路由規則,不過到了k8s最新版本1.11,支持了ipvs方式的分發規則,支持各種調度算法,這也就實現了負載均衡。。裝完k8s後,就需要創建一個DNS pod,這是因為service的名字需要DNS伺服器來進行解析。
  • 深入解析Kubernetes service 概念
    在Kubernetes中,每個節點都安裝了kube-proxy,kube-proxy通過kubernetes中固有的watch請求方法持續監聽apiserver。Pod網絡 Pod網絡地址是配置在Pod網絡之上節點網絡和Pod網絡都是配置在某個設備之上,可以是硬體也可以是虛擬網絡Cluster Network(svc network) virtual IP svc ip沒有配置在某個網絡接口上,它只是存在service的規則當中Service
  • 14 - MLSQL on k8s(2) - Spark on k8s
    下面筆者將基於spark native方式部署,分別講解如下三種模式:spark submit從物理機cluster模式提交spark submit從物理機client模式提交spark submit從container client模式提交首先,先構建spark的鏡像,因為鏡像要被共享,因此要放到一個鏡像庫中,筆者用docker搭了一個鏡像庫:
  • Kubernetes Service配合Spring Cloud Eureka
    但是,這裡存在一些問題,比如,kubernetes的pod重啟,微服務提供方在eurkeka 註冊的IP位址就會更新,其它微服務使用方也要跟著更新在客戶端緩存的IP位址列表。但是,如果微服務提供方在eurkeka 註冊的不是IP位址,而是kubernetes service的話,雖然,微服務使用方也會定期更新在客戶端緩存的IP位址列表,但是由於kubernetes service是不變的,而且,負載均衡功能可以交給服務端控制,所以,可以改動如下:eureka: instance: instance-id: test-order.econ
  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-命令行操作k8s太麻煩?
    前面幾篇中,查看和操作k8s的資源都是通過命令行操作,每次查詢一個資源的狀態都需要手動執行命令。這種方式。。。。多少有點。。。。。不方便。而且,k8s不光面向運維,有時候開發也需要關注集群中某些服務的狀態,做一些簡單的配置。
  • k8s版本平滑升級
    容器化技術興起後,k8s無疑成為了容器編排技術的事實標準。各行各業軟體領域的廣泛應用,進一步促進了k8s的快速發展,對應版本的更新也層出不窮。實際項目使用過程中,可能會遇到框架層面的bug在新版本中得到修復,高版本的一些特性剛好滿足新的業務需求,這時候就需要在原有k8s集群上進行升級。如何快速、平滑的實現k8s的版本更新?
  • 初識K8S之理論和搭建
    一、什麼是k8sk8s是分布式系統集中式管理。它可以看作是一個分布式系統支撐平臺。二、為什麼要用k8s,它有什麼好處1、 開發人員發布的是鏡像,鏡像裡面是包括環境和包括代碼。所以說本地和線上的運行環境是一樣的。不會存在本地可以。
  • 記一次Gitlab-CI集成K8S實錄
    部署環境的搭建和配置向來繁雜,雲原生之前的年代,搭建和配置部署環境還存在大量人工而且重複地勞動,浪費了大量時間和精力在環境部署上,而且環境難以移植,微服務的興起更是加劇了環境搭建和配置的難度,對運維也是一大挑戰。容器及其編排技術因此而孕育而生,宿主環境的無感知,極易地擴縮容,容器技術存在巨大優勢。但容器及其編排環境搭建本身也不是一件容易的事情,各種套件你方唱罷我登場。
  • k8s監控系統prometheus-operator
    /prometheus-serviceMonitorKube*serviceMonitor/prometheus-serviceMonitorKubeControllerManager.yaml-    matchNames:serviceMonitor/prometheus-serviceMonitorKubeControllerManager.yaml-&
  • 樹莓派centos7-arm64-安裝k8s 1.18版本
    k8s需要安裝etcd,因此需要使用安裝etcd的命令1.systemctl daemon-reload2.systemctl enable etcd.service3.systemctl start etcd.service------------------------檢查是否安裝成功etcdctl cluster-health
  • 「Kubernetes」第六章:service
    在實際生產環境中,可能有不同的service需求,比如業務一個,管理一個等。k8s需要一種管理服務的服務。那就是ingress,這個比較複雜,專門放一篇文章裡面寫。ClusterIP:默認類型,自動分配一個僅內部可以訪問的虛擬IP。在每個node節點使用iptables。
  • kubernetes的service和pod是如何關聯的?
    模式下,kube-proxy監聽API Server中service和endpoint的變化情況,調用netlink接口創建相應的ipvs規則,並定期將ipvs規則與Kubernetes服 Services和Endpoints同步。
  • k8s service 負載均衡:proxy mode介紹
    service具有以下功能:自動發現機制,監聽service下pod的啟動/停止狀態;提供單一DNS名稱和service下pod集合ip地址映射;負載均衡service下pod集合的網絡訪問。通過以上定義我們發現:k8s中的service對象具有微服務的服務治理能力。
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-k8s安裝與部署
    上一章我們介紹了k8s的核心組件,了解了這些,我們就可以開始k8s的安裝和部署了。來吧,動手吧!準備好兩伺服器(系統是centos7.3),分別作為matser和node,如下:要讓k8s能夠管理我們的集群,需要在所有的節點上面分別安裝k8s的組件。在安裝之前,需要在兩臺節點上做如下的操作。
  • 和我一起學k8s(一)初識kubernetes
    使用kubernetes的理由千千萬,而技術驅動永遠都是IT行業的第一驅動力。第三,簡化了服務上雲的難度,同時現在多家公有雲也均支持k8s。1、ETCD集群ETCD集群作為一個分布式集群,具有響應快,一致性key-value的優勢,在k8s架構中,API-SERVER是唯一一個可以與ETCD集群通信的組件,將包括pod、rs、service等一切創建的對象寫入到etcd