13 張圖帶你學懂 Kubernetes Service(轉載)


在 Kubernetes 中 Service 主要有4種不同的類型,其中的 ClusterIP 是最基礎的,如下圖所示:

當我們創建一個 NodePort 的 Service 時,它也會創建一個 ClusterIP,而如果你創建一個 LoadBalancer,它就會創建一個 NodePort,然后創建一個 ClusterIP

此外我們還需要明白 Service 是指向 pods 的,Service 不是直接指向 Deployments 或 ReplicaSets,而是直接使用 labels 標簽指向 Pod,這種方式就提供了極大的靈活性,因為通過什么方式創建的 Pod 其實并不重要。接下來我們通過一個簡單的例子開始,我們用不同的 Service 類型來逐步擴展,看看這些 Service 是如何建立的。

No Services

最開始我們沒有任何的 Services。

我們有兩個節點,一個 Pod,節點有外網(4.4.4.1、4.4.4.2)和內網(1.1.1.1、1.1.1.2)的 IP 地址,pod-python 這個 Pod 只有一個內部的 IP 地址。

現在我們添加第二個名為 pod-nginx 的 Pod,它被調度在 node-1 節點上。在 Kubernetes 中,所有的 Pod 之間都可以通過 Pod 的 IP 進行通信,不管它們運行在哪個節點上。這意味著 pod-nginx 可以使用其內部IP 1.1.1.3 來 ping 和連接 pod-python 這個 Pod。

現在如果 pod-python 掛掉了重新創建了一個新的 pod-python 出來(本文不涉及如何管理和控制 pods),重新分配了一個新的 1.1.1.5 的 Pod IP 地址,這個時候 pod-nginx 就無法再達到 1.1.1.3 這個之前的地址了,為了防止這種情況發生,我們就需要創建一個 Service 服務了!
?

ClusterIP

和上面同樣的場景,但是我們創建了一個名為 service-python 類型為 ClusterIP 的 Service 服務,一個 Service 并不像 Pod 那樣運行在一個特定的節點上,這里我們可以假設一個 Service 只是在整個集群內部的內存中可用就可以了。

pod-nginx 可以安全地連接到 1.1.10.1 這個 ClusterIP 或直接通過 dns 名service-python 進行通信,并被重定向到后面一個可用的 Pod 上去。

現在我們來稍微擴展下這個示例,啟動3個 python 實例,現在我們來顯示所有 Pod 和 Service 內部 IP 地址的端口。

集群內部的所有 Pods 都可以通過?http://1.1.10.1:3000?或者?http://service-python:3000?來訪問到后面的 python pods 的443端口。

service-python?這個 Service ?是隨機或輪詢的方式來轉發請求的,這個就是 ClusterIP Service 的作用,它通過一個名稱和一個 IP 讓集群內部的 Pods 可用。

上圖中的 service-python 這個 Service 可以用下面的 yaml 文件來創建:

apiVersion:?v1
kind:?Service
metadata:name:?service-python
spec:ports:-?port:?3000protocol:?TCPtargetPort:?443selector:run:?pod-pythontype:?ClusterIP

創建后,可以用?kubectl get svc?命令來查看:

NodePort

現在我們想讓 ClusterIP Service 可以從集群外部進行訪問,為此我們需要把它轉換成 NodePort 類型的 Service,在我們的例子中,我們只需要簡單修改上面的?service-python?這個 Service 服務即可:

apiVersion:?v1
kind:?Service
metadata:name:?service-python
spec:ports:-?port:?3000protocol:?TCPtargetPort:?443nodePort:?30080selector:run:?pod-pythontype:?NodePort

更新完成后,如下圖所示:

這意味著我們的內部的?service-python?這個 Service 現在也可以通過30080 端口從每個節點的內部和外部 IP 地址進行訪問了。

集群內部的 Pod 也可以通過內網節點 IP 連接到 30080 端口。

運行?kubectl get svc?命令來查看這個 NodePort 的 Service,可以看到同樣有一個 ClusterIP,只是類型和額外的節點端口不同。在內部,NodePort 服務仍然像之前的 ClusterIP 服務一樣。

LoadBalancer

如果我們希望有一個單獨的 IP 地址,將請求分配給所有的外部節點IP(比如使用 round robin),我們就可以使用 LoadBalancer 服務,所以它是建立在 NodePort 服務之上的。


一個 LoadBalancer 服務創建了一個 NodePort 服務,NodePort 服務創建了一個 ClusterIP 服務。我們也只需要將服務類型更改為 LoadBalancer 即可。

apiVersion:?v1
kind:?Service
metadata:name:?service-python
spec:ports:-?port:?3000protocol:?TCPtargetPort:?443nodePort:?30080selector:run:?pod-pythontype:?LoadBalancer

LoadBalancer 服務所做的就是創建一個 NodePort 服務,此外,它還會向托管 Kubernetes 集群的提供商發送一條消息,要求設置一個指向所有外部節點 IP 和特定 nodePort 端口的負載均衡器,當然前提條件是要提供商支持。

現在運行?kubectl get svc?可以看到新增了 external-IP 和 LoadBalancer 的類型。

LoadBalancer 服務仍然像和以前一樣在節點內部和外部 IP 上打開 30080 端口。

ExternalName

最后是 ExternalName 服務,這個服務和前面的幾種類型的服務有點分離。它創建一個內部服務,其端點指向一個 DNS 名。

我們假設 pod-nginx 運行在 Kubernetes 集群中,但是 python api 服務在集群外部。

這里?pod-nginx?這個 Pod 可以直接通過 http://remote.server.url.com 連接到外部的 python api 服務上去,但是如果我們考慮到以后某個時間節點希望把這個 python api 服務集成到 Kubernetes 集群中去,還不希望去更改連接的地址,這個時候我們就可以創建一個 ExternalName 類型的 Service 服務了。

對應的 YAML 資源清單文件如下所示:

kind:?Service
apiVersion:?v1
metadata:name:?service-python
spec:ports:-?port:?3000protocol:?TCPtargetPort:?443type:?ExternalNameexternalName:?remote.server.url.com

現在?pod-nginx?就可以很方便地通過?http://service-python:3000?進行通信了,就像使用 ClusterIP 服務一樣,當我們決定將 python api 這個服務也遷移到我們 Kubernetes 集群中時,我們只需要將服務改為 ClusterIP 服務,并設置正確的標簽即可,其他都不需要更改了。

到這里我們就用 13 張圖將 Kubernetes 中的 Service 解釋得明明白白清清楚楚真真切切了。
原文鏈接:https://medium.com/swlh/kubernetes-services-simply-visually-explained-2d84e58d70e5

本文轉載自:「K8s 技術圈」,原文:https://tinyurl.com/y5v5hcuk,版權歸原作者所有

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535455.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基礎:Java異常機制

異常是程序運行過程中出現的錯誤。Java 把異常當作對象來處理,把異常信息封裝成了一個類,并定義一個基類java.lang.Throwable作為所有異常的超類。Throwable : 它是所有錯誤與異常的超類(祖宗類),有兩個子類 Error 和 Exception。…

JavaWeb:Servlet的應用及接口介紹

廣義的 Servlet 泛指在服務器上運行的 Java 程序,但是這個 Java 程序,并不能獨立運行(因為 Servlet 沒有 main 方法),需要部署在相應的 Servlet 容器中,比如 Tomcat 和 Jetty。Servlet 主要功能在于交互式地…

DOCKERFILE參數注解

Dockerfile由一行行命令語句組成,并且支持以#開頭的注釋行。 一般的,Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。 Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為…

Zookeeper:分布式過程協同技術

Zookeeper 是一個高性能的分布式一致系統,在分布式系統中有著廣泛的應用。基于它,可以實現諸如“分布式同步”、“配置管理”、“命名空間管理”等眾多功能,是分布式系統中常見的基礎系統。Zookeeper 主要用來解決分布式集群中應用系統的一致…

面試題2021-2-24

給某CentOs6慮擬機添加了新的數據盤,設備名為/de/sdd.寫命令格式化滿加的效的并掛載到指定目錄/opt fdisk -l mkfs.ext4 /de/sdd mount /de/sdd /opt 如何查看與RabbtMQ服務器之間的establish狀態連接數?netstat -an |grep ESTABLISHED |grep tcp |wc -l…

Zookeeper:在三種模式下的部署

zookeeper 安裝模式有三種:單機模式:單機單 server;集群模式:多機多 server,形成集群;偽集群模式:單機多 server,形成偽集群。 ~ 本篇內容包括:Zookeeper 官網下載、Zook…

Linux namespace概述

操作系統通過虛擬內存技術,使得每個用戶進程都認為自己擁有所有的物理內存,這是操作系統對內存的虛擬化。操作系統通過分時調度系統,每個進程都能被【公平地】調度執行,即每個進程都能獲取到CPU,使得每個進程都認為自己…

Zookeeper:Zookeeper的主從選舉機制

ZAB 協議,全稱 Zookeeper Atomic Broadcast(Zookeeper 原子廣播協議),是為分布式協調服務 ZooKeeper 專門設計的一種支持崩潰恢復的一致性協議。基于該協議,ZooKeeper 實現了一種主從模式的系統架構來保持集群中各個副…

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔離hostname和NIS Domain name資源,使得一個宿主機可擁有多個主機名或Domain Name。換句話說,可讓不同namespace中的進程看到不同的主機名。 例如,使用unshare命令(較新版本L…

Zookeeper:事件監聽和通知機制

Zookeeper 允許客戶端向服務端的某個 Znode 注冊一個 Watcher 監聽,當服務端的一些指定事件觸發了這個 Watcher,服務端會向指定客戶端發送一個事件通知來實現分布式的通知功能,然后客戶端根據 Watcher 通知狀態和事件類型做出業務上的改變。 …

Linux namespace之:mount namespace

理解mount namespace 用戶通常使用mount命令來掛載普通文件系統,但實際上mount能掛載的東西非常多,甚至連現在功能完善的Linux系統,其內核的正常運行也都依賴于掛載功能,比如掛載根文件系統/。其實所有的掛載功能和掛載信息都由內…

Linux namespace之:network namespace

理解network namespace network namespace用來隔離網絡環境,「在network namespace中,網絡設備、端口、套接字、網絡協議棧、路由表、防火墻規則等都是獨立的」。 因network namespace中具有獨立的網絡協議棧,因此每個network namespace中都…

Kubernetes 的原理

kubernetes 已經成為容器編排領域的王者,它是基于容器的集群編排引擎,具備擴展集群、滾動升級回滾、彈性伸縮、自動治愈、服務發現等多種特性能力。 本文將帶著大家快速了解 kubernetes ,了解我們談論 kubernetes 都是在談論什么。 kuberne…

Zookeeper:實現“分布式鎖”的 Demo

Zookeeper 能保證數據的強一致性,用戶任何時候都可以相信集群中每個節點的數據都是相同的。一個用戶創建一個節點作為鎖,另一個用戶檢測該節點,如果存在,代表別的用戶已經鎖住,如果不存在,則可以創建一個節…

JavaIO流:案例

java.io 包下需要掌握的流有 16 個,本篇內容包括:java.io包下需要掌握的流、Java IO 案例。 文章目錄一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1(FileInputStream)2、Demo 2(FileInputStream)3…

比對excel數據

#!/usr/bin/env pythonimport openpyxl from openpyxl.styles import PatternFill from openpyxl.styles import colors from openpyxl.styles import Font, Color aD:/測算單位設置/比對/吉林/tmp001.xlsx bD:/測算單位設置/比對/吉林/國網吉林電力.xlsx cD:/測算單位設置/比對…

CPU 是如何執行任務的

前言 你清楚下面這幾個問題嗎? 有了內存,為什么還需要 CPU Cache? CPU 是怎么讀寫數據的? 如何讓 CPU 能讀取數據更快一些? CPU 偽共享是如何發生的?又該如何避免? CPU 是如何調度任務的&a…

Ansible 的自動化運維

1、Ansible 特點 Ansible 自 2012 年發布以來,很快在全球流行,其特點如下: Ansible 基于 Python 開發,運維工程師對其二次開發相對比較容易; Ansible 豐富的內置模塊,幾乎可以滿足一切要求; …

Shell 信號發送與捕捉

1、Linux信號類型 信號(Signal):信號是在軟件層次上對中斷機制的一種模擬,通過給一個進程發送信號,執行相應的處理函數。 進程可以通過三種方式來響應一個信號: 1)忽略信號,即對信…

運維面試題總結

集群相關 簡述 ETCD 及其特點? etcd 是 CoreOS 團隊發起的開源項目,是一個管理配置信息和服務發現(service discovery)的項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫&#x…