亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

對k8s有點了解技術人員,應該都只知道k8s是有服務注冊發現的,今天就分析下這個原理,看看怎么實現的。

什么是服務注冊與發現

服務注冊與發現是一種機制,用于在集群中動態地發現和連接不同的服務,比如我們在開發微服務時,經常使用的Eureka、Nacos等

Kubernetes 中的服務注冊與發現原理分析

Service B 把自己注冊到 Service Registry 叫做 服務注冊

Service A 從 Service Registry 發現 Service B 的節點信息叫做 服務發現

K8s 中為什么需要服務發現

動態性

在K8s集群中,Pod和服務的數量和位置都是動態變化的,Pod有可能伸縮、重新部署或遷移,在這樣的環境下,如果硬編碼的服務地址是不可行的,所以服務注冊與發現使得我們的系統能夠自動感知到這種變化。

透明性

服務注冊與發現使得我們的系統可以使用服務名稱來訪問其他服務,而不需要關心具體的IP地址和端口號。

負載均衡

通過服務注冊與發現可以實現負載均衡,將請求均勻地分發到多個后端服務實例。

容錯性

當服務實例發生故障或不可用時,服務注冊與發現可以自動檢測并從服務發現機制中移除不可用的實例。這樣,請求將被自動路由到可用的實例上,提高應用程序的容錯性和可用性。

k8s 服務注冊發現原理

基于上面的介紹,我們了解到K8s中的Pod的生命周期是短暫的,他們的IP地址會不斷變化,如果讓服務消費方去管理這些Pod IP在做負載均衡調用Pod,那么會很復雜,為了對外提供統一的入口來提供服務,所以k8s創建了Service,不管是內部還是外部統一調用 Service,然后再由 Service 轉發到后端Pod

Kubernetes 中的服務注冊與發現原理分析

Endpoints

Pod 的地址管理則由Endpoints管理,根據Service名稱可以查詢Endpoints信息,當通過API創建/修改service對象時,endpoints控制器的監聽到Service對象,然后根據Service的配置的選擇器創建一個endpoints對象,此對象將pod的IP、容器端口信息存儲到etcd中。

他們之間關系如下:

Kubernetes 中的服務注冊與發現原理分析

同時Endpoints控制器會監聽與Pod相關的事件,包括上下線事件,一旦Endpoints控制器接收到這些事件,它會相應地更新Endpoints資源,將不可用的Pod從Endpoints列表中移除。

域名解析

由于Service的 IP有可能會變,如果在代碼里面寫死Service IP后期維護起來也是比較麻煩的事情,所以通過在創建一個Service時,CoreDNS會為該Service添加一個域名解析記錄,將Service的名稱解析為相應的Cluster IP地址。這樣其他Pod或服務可以通過使用Service名稱來訪問該Service。

Kubernetes 中的服務注冊與發現原理分析

kube-proxy

kube-proxy 是集群中每個節點上運行的網絡代理,它負責將集群內部的Service暴露給其他Pod或外部網絡。它通過在Node節點上設置網絡規則和轉發規則,將Service的請求轉發到正確的目標Pod

同時kube-proxy實現負載均衡算法,將進入Service的請求均勻地分發到后端的Pod實例。這確保了在多個副本的情況下,Service能夠平衡地處理請求,提高可用性和性能。

kube-proxy 通過監聽知道了Service、endpoints對象的創建,然后把Service的CLUSTER-IP 和端口信息拿出來,創建iptables NAT規則做轉發或通過ipvs模塊創建VS服務器,這樣經過CLUSTER-IP的流量都被轉發到后端pod。

Kubernetes 中的服務注冊與發現原理分析

當Service的目標Pod位于同一節點上時,kube-proxy會將請求直接轉發到該節點上的Pod,而不會跨節點轉發。這種情況下,請求不會被發送到其他節點上。

然而,如果Service的目標Pod分布在多個節點上,kube-proxy可以通過負載均衡算法將請求轉發到其他節點上的Pod。

示例演示

下面我們基于兩個配置文件,驗證下上面的結論

Nginx-deployment.yaml

apiVersion: Apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      contAIners:
      - name: nginx
        image: mirrorgooglecontainers/serve_hostname
        ports:
        - containerPort: 80

serve_hostname是k8s官方提供的debug鏡像,返回hostname的web server,訪問pod時會返回hostname。

nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
    - name: service-port
      port: 80
      protocol: TCP
      targetPort: 9376
  selector:
    app: nginx
  type: ClusterIP

可以看到service 的selector屬性指定了app: nginx,這樣就能匹配 deplyment 中定義的 nginx pod

我們依次執行以上兩個文件,最后獲取到信息如下

Service地址查看

kubectl get svc nginx-service

Kubernetes 中的服務注冊與發現原理分析

Pod信息查看

kubectl get pods -l app=nginx -o wide

Kubernetes 中的服務注冊與發現原理分析

Endpoints信息查看

根據service名稱查詢

kubectl get ep nginx-service

Kubernetes 中的服務注冊與發現原理分析

CoreDNS信息驗證

登錄任意Pod,執行ping命令,可以看到根據Service 名稱解析到了Service cluster ip

Kubernetes 中的服務注冊與發現原理分析

負載均衡驗證

登錄任意 pod,執行curl nginx-service,請求 service的 80 端口,會返回目標 pod名稱

Kubernetes 中的服務注冊與發現原理分析

以上我們講了什么是服務發現,以及 k8s 的服務發現是怎么實現的,希望對你有所幫助。

分享到:
標簽:Kubernetes
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定