當前位置:編程學習大全網 - 編程語言 - kubernetes(九) Service介紹、類型及使用

kubernetes(九) Service介紹、類型及使用

在kubernetes中,pod是應用程序的載體,我們可以通過pod的ip來訪問應用程序,但是pod的ip地址不是固定的,這也就意味著不方便直接采用pod的ip對服務進行訪問。

為了解決這個問題,kubernetes提供了Service資源,Service會對提供同壹個服務的多個pod進行聚合,並且提供壹個統壹的入口地址。通過訪問Service的入口地址就能訪問到後面的pod服務。

Service在很多情況下只是壹個概念,真正起作用的其實是kube-proxy服務進程,每個Node節點上都運行著壹個kube-proxy服務進程。當創建Service的時候會通過api-server向etcd寫入創建的service的信息,而kube-proxy會基於監聽的機制發現這種Service的變動,然後 它會將最新的Service信息轉換成對應的訪問規則

規則有iptables,ipvs等,簡單介紹下ipvs規則

10.97.97.97:80 是service提供的訪問入口,當訪問這個入口的時候,可以發現後面有三個pod 的服務在等待調用,kube-proxy 會基於rr(輪詢)的策略,將請求分發到其中壹個pod上去,這個規則會同時在集群內的所有節點上都生成,所以在任何壹個節點上訪問都可以。

kube-proxy目前支持三種工作模式:

userspace 模式

userspace模式下,kube-proxy會為每壹個Service創建壹個監聽端口,發向Cluster IP的請求被Iptables規則重定向到kube-proxy監聽的端口上,kube-proxy根據LB算法選擇壹個提供服務的Pod並和其建立鏈接,以將請求轉發到Pod上。 該模式下,kube-proxy充當了壹個四層負責均衡器的角色。由於kube-proxy運行在userspace中,在進行轉發處理時會增加內核和用戶空間之間的數據拷貝,雖然比較穩定,但是效率比較低。

iptables 模式

iptables模式下,kube-proxy為service後端的每個Pod創建對應的iptables規則,直接將發向Cluster IP的請求重定向到壹個Pod IP。 該模式下kube-proxy不承擔四層負責均衡器的角色,只負責創建iptables規則。該模式的優點是較userspace模式效率更高,但不能提供靈活的LB策略,當後端Pod不可用時也無法進行重試。

ipvs 模式

ipvs模式和iptables類似,kube-proxy監控Pod的變化並創建相應的ipvs規則。ipvs相對iptables轉發效率更高。除此以外,ipvs支持更多的LB算法。

此模式必須安裝ipvs內核模塊,否則會降級為iptables,開啟ipvs

Service的資源清單文件:

type:

在使用service之前,首先利用Deployment創建出3個pod,註意要為pod設置 app=nginx-pod 的標簽

創建deployment.yaml,內容如下:

是集群內部地址,只能通過Node集群內部訪問,創建service-clusterip.yaml文件

Endpoint

Endpoint是kubernetes中的壹個資源對象,存儲在etcd中,用來記錄壹個service對應的所有pod的訪問地址,它是根據service配置文件中selector描述產生的。

壹個Service由壹組Pod組成,這些Pod通過Endpoints暴露出來, Endpoints是實現實際服務的端點集合 。換句話說,service和pod之間的聯系是通過endpoints實現的。

負載分發策略

對Service的訪問被分發到了後端的Pod上去,目前kubernetes提供了兩種負載分發策略:

在某些場景中,開發人員可能不想使用Service提供的負載均衡功能,而希望自己來控制負載均衡策略,針對這種情況,kubernetes提供了HeadLiness Service,這類Service不會分配Cluster IP,如果想要訪問service,只能通過service的域名進行查詢。

創建service-headliness.yaml

在之前的樣例中,創建的Service的ip地址只有集群內部才可以訪問,如果希望將Service暴露給集群外部使用,那麽就要使用到另外壹種類型的Service,稱為NodePort類型。NodePort的工作原理其實就是 將service的端口映射到Node的壹個端口上 ,然後就可以通過 NodeIp:NodePort 來訪問service了。

創建service-nodeport.yaml

LoadBalancer和NodePort很相似,目的都是向外部暴露壹個端口,區別在於LoadBalancer會在集群的外部再來做壹個負載均衡設備,而這個設備需要外部環境支持的,外部服務發送到這個設備上的請求,會被設備負載之後轉發到集群中。

ExternalName類型的Service用於引入集群外部的服務,它通過 externalName 屬性指定外部壹個服務的地址,然後在集群內部訪問此service就可以訪問到外部的服務了。

  • 上一篇:歌詞以simen開頭,然後是英文simen,再然後是英文simen。是什麽外國歌曲?
  • 下一篇:穿越時空的神樹
  • copyright 2024編程學習大全網