中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Service和Endpoint的原理和作用是什么

發布時間:2021-07-05 16:41:38 來源:億速云 閱讀:1488 作者:chen 欄目:云計算

本篇內容介紹了“Service和Endpoint的原理和作用是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

  Srevice

  Service 是將運行在一組 Pods 上的應用程序公開為網絡服務的抽象方法。如果我們使用 Deployment 部署 pod,則可以以 Deployment 為對象創建 Service。

  在 K8S 中,每個 Pod 都有其自己唯一的 ip 地址,而 Service 可以為多個 Pod(一組)提供相同的 DNS 名,并且可以在他們直接進行負載均衡

  假如有一組 nginx pod,如果 nginx 動態伸縮改變或因為某些原因 ip/端口發生改變,那么其 ip 和 端口都不是固定的,而且我們很難確定它新擴容的 pod 的地址是什么,又萬一 pod 被刪除,ip 不再可用。

  又假如一組 pod 稱為前端,如 web 服務,另一組 pod 稱為后端,例如 mysql。那么 前端 如何查找并跟蹤要連接的 ip 地址,以便前端可以使用工作負載的后端部分?

  這真是 Service 要解決的問題。Kubernetes Service 定義了一種抽象:邏輯上的一組 Pod,一種可以訪問它們的策略 —— 通常稱為微服務。當使用 Service 為一組 pod (Deployment 的方式創建的)創建服務時,無論我們創建了多少個 pod 副本,這些 pod 怎么變化,前端不需要關心它們調用了哪個后端副本,而且不需要知道后端 pod 的狀態也不需要跟蹤 pod。Service 把前后端的這種關聯抽象化,把它們解耦了。

  Service 的創建及現象

  現在按照下面的命令快速創建 pod,pod 將會在各個節點中部署運行。

  kubectl create deployment nginx --image=nginx:latest --replicas=3

  kubectl expose deployment nginx --type=LoadBalancer --port=80

  然后執行命令查看 Service:

  kubectl get services

  也就是說外部訪問端口是 30424。

  NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

  kubernetes ClusterIP 10.96.0.1 443/TCP 3d6h

  nginx LoadBalancer 10.101.132.236 80:30424/TCP 39s

  這時,我們可以通過公網和端口訪問這個 Service。

  我們可以查看此 Service 的 yaml 文件:

  kubectl get service nginx -o yaml

  apiVersion: v1kind: Servicemetadata:

  creationTimestamp: "2021-04-23T07:40:35Z"

  labels:

  app: nginx

  name: nginx

  namespace: default

  resourceVersion: "369738"

  uid: 8dc49805-2fc8-4407-adc0-8e31dc24fa79spec:

  clusterIP: 10.101.132.236

  clusterIPs:

  - 10.101.132.236

  externalTrafficPolicy: Cluster

  ipFamilies:

  - IPv4

  ipFamilyPolicy: SingleStack

  ports:

  - nodePort: 30424

  port: 80

  protocol: TCP

  targetPort: 80

  selector:

  app: nginx

  sessionAffinity: None

  type: LoadBalancerstatus:

  loadBalancer: {}

  有了標準的 yaml 文件模板,我們可以很方便地修改并定制一個 Service。

  我們查看通過 Deployment 創建的 pod:

  kubectl get pods -o wide

  NAME IP NODE NOMINATED NODE READINESS GATESnginx-55649fd747-9fzlr 192.168.56.56 instance-2 nginx-55649fd747-ckhrw 192.168.56.57 instance-2 nginx-55649fd747-ldzkf 192.168.23.138 instance-1

  注:pod 在哪個節點中運行,我們是不一樣的。

  當我們通過外部網絡訪問時,Service 會自動提供其中一個 pod 給我們,但是這個過程較為復雜,我們這里先將表面現象。

  ------------

  | |

  --- 公網ip --> | pod1 |

  | pod2 |

  | pod3 |

  ------------

  然后我們通過命令查看 iptables 配置:

  iptables-save

  然后查找 random 關鍵字:

  你可以看到有三個 default/nginx, 第一個 pod 被訪問的機會都是 0.33333...,然后 2/3 的概率中,2/3 的 0.5 的概率選擇第二個 pod,剩下的 1/3 概率選擇第三個 pod。

  如果要訪問 pod,可以以任意部署了 nginx pod 的節點的 ip 進行訪問。由于 master 不能部署 pod,所以不能通過 master 的 ip 進行訪問。

  當然,它并不是直接都是 0.33333.. 這樣的,iptables 的規則有點復雜,這里難以講清楚,我們只需要知道 外網能夠訪問 Service,而 Service 通過 iptable 為我們轉發流量。即使 Deployment 部署的 pod 不在同一個節點上, k8s 的 dns 服務等會正確處理的,我們不需要手動配置這些網絡。

  Service 定義

  在上一小節中,介紹了 Service 的創建方法(kubectl expose ...),也介紹了其依賴的 iptables,這里將繼續學習 Service 的定義方法。

  因為之前我們是通過 Deployment 進行操作,直接為一個 deployment 中的 pod (副本)統一映射。當然我們也可以為不同的 pod 進行網絡映射。

  apiVersion: v1kind: Servicemetadata:

  name: my-servicespec:

  selector:

  app: MyApp

  ports:

  - protocol: TCP

  port: 6666

  targetPort: 80

  這里我們使用了 selector 選擇器,一般 pod 的 Label 都會有 app,表示此 pod 的名稱(一般是鏡像名稱)。port、targetPort 分別是 pod 端口、提供給外界訪問的端口。

  當我們不通過 Deployment 或者 job 等對象處理 pod 時,可以通過 selector 來選擇合適的 pod。

  Service 能夠將一個接收 容器或者 pod 的端口 targetPort 映射到任意的 port 端口,port 是外部可以訪問的端口。 如果使用 kubectl expose 去映射端口,會默認隨機提供一個 30xxx 端口。而使用 yaml ,默認情況下,targetPort 將被設置為與 port 字段相同的值。

  Endpoint slices

  ”端點切片(Endpoint Slices) 提供了一種簡單的方法來跟蹤 Kubernetes 集群中的網絡端點 (network endpoints)。它們為 Endpoints 提供了一種可伸縮和可拓展的替代方案。“

  在 Kubernetes 中,EndpointSlice 包含對一組網絡端點的引用。 指定選擇器后控制面會自動為設置了 選擇算符 的 Kubernetes 服務創建 Endpoint。

  也就是說創建 Service(帶選擇運算符) 會自動創建 Endpiont。

  我們查看默認命名空間的 endpoint:

  kubectl get endpoints

  NAME ENDPOINTS AGEkubernetes 10.170.0.2:6443 3d7hnginx 192.168.56.24:80,192.168.56.25:80,192.168.56.26:80 59m

  這些都是 pod 的 ip 和端口,也就是說,通過 Endpoint 我們跟蹤 Kubernetes 集群中的網絡端點 (network endpoints)變得更加任意。不過這樣解釋是很難明白的,筆者翻了很多次資料,一點點試錯才搞懂。接下來我們一步步來上手操作,然后一點點理解這些操作的含義。

  創建 Endpoint、Service

  接下來我們手動創建 Service 和 Endpoint 和 ,需要先創建 Service ,再創建 Endpoint (這兩者創建順序可以隨意)。

  Service

  我們先刪除之前創建的 service。

  kubectl delete service nginx

  編寫 service.yaml 文件內容如下如下:

  apiVersion: v1kind: Servicemetadata:

  name: nginxspec:

  ports:

  - protocol: TCP

  port: 6666

  targetPort: 80

  應用這個 Service:

  kubectl apply -f service.yaml

  查看 service :

  kubectl get services

  NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 443/TCP 3d12hnginx ClusterIP 10.98.113.242 6666/TCP 6s

  由于此 Service 沒有映射任何 pod 等,因此沒有任何用處,但是此時已經可以給開發人員一個交待了,或者說確定下 nginx 的 Service 端口和地址。至于真正的 nginx 服務,后面再確定。創建 Service 和 Endpoint 的順序是任意的,只是這里我們提出抽象,先約定 端口,再提供服務,所以先創建 Service。

  創建應用

  我們隨便找臺 worker 或者 master 節點,創建一個 nginx 容器:

  docker run -itd -p 80:80 nginx:latest

  為什么不用 pod,直接創建容器?因為我們處于開發階段,如果把 nginx 改成 mysql,我們要 Debug 呢?測試自己的數據庫呢?要模擬數據呢?我們在生產時再通過 Deployment 創建應用,但是此時我們可以使用自己的數據庫或者本地應用。

  官方文檔說:

  希望在生產環境中使用外部的數據庫集群,但測試環境使用自己的數據庫。

  希望服務指向另一個 名字空間(Namespace) 中或其它集群中的服務。

  你正在將工作負載遷移到 Kubernetes。 在評估該方法時,你僅在 Kubernetes 中運行一部分后端。

  總之,我們創建了 Service,可以提供了抽象,至于怎么提供這個服務,我們可以使用 pod ,也可以直接使用命令執行機器上的二進制程序,也可以通過 docker 提供。而且 mysql 可能是在外部服務提供的,或者 mysql 直接部署在宿主機上,而不使用容器和 pod,我們可以通過 Endpoint 來跟蹤 mysql 服務的端口。

  然后查詢這個容器的 ip,:

  docker inspect {容器id} | grep IPAddress

  筆者得到的是:"IPAddress": "172.17.0.2",可以試試 curl 172.17.0.2 ,看看是否能夠訪問 nginx,如果沒問題我們來進行下一步。

  創建 Endpoint

  創建一個 endpoint.yaml 文件,內容如下(注意替換ip為你容器訪問ip):

  apiVersion: v1kind: Endpointsmetadata:

  name: nginxsubsets:

  - addresses:

  - ip: 172.17.0.2

  ports:

  - port: 80

  然后應用 yaml:

  kubectl apply -f endpoint.yaml

  查看 endpoint:

  kubectl get endpoints# 不能填寫成 endpoint

  然后訪問 Service 的 ip:

  curl 10.99.142.24:6666

  也可以通過公網訪問此 IP。

  如果 Endpoint 需要跟蹤多個 ip (多個 pod 或者容器或者應用),可以使用:

  - addresses:

  - ip: 172.17.0.2

  - ip: 172.17.0.3

  - ip: 172.17.0.4

“Service和Endpoint的原理和作用是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

田林县| 铁力市| 安丘市| 铜川市| 贡山| 榆中县| 九龙县| 应城市| 敖汉旗| 阿坝县| 天镇县| 新野县| 绵阳市| 台湾省| 定州市| 荆门市| 马关县| 轮台县| 壶关县| 明水县| 台安县| 政和县| 永嘉县| 营口市| 西宁市| 沅陵县| 宜黄县| 清苑县| 元江| 神农架林区| 黑河市| 建宁县| 天津市| 迭部县| 扬州市| 武邑县| 宁陵县| 西吉县| 宜春市| 碌曲县| 江城|