主頁 >  其他 > 一文搞懂什么是kubernetes Service

一文搞懂什么是kubernetes Service

2022-08-06 11:35:15 其他

1.什么是Service?

在kubernets中,Pod是應用程式的載體,Pod你可以想象成就是容器,為動態的一組Pod提供一個固定的訪問入口,它是以一種叫ClusterIP地址來進行標識,而ClusterIP就位于我們集群網路(Cluster Network)當中,我們可以通過Pod的IP地址來進行訪問,但是會遇到問題:

  1. 動態Pod的IP地址不是固定的,一旦Pod例外退出、節點故障,則會發生Pod重建,一旦發生重建客戶端則會訪問失敗;
  2. Pod如果擴容多個,會造成客戶端無法有效使用新增的Pod,如果Pod進行縮容則會造成客戶端訪問錯誤;
  3. 官方檔案: https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/

1.2 Service能干什么?

  1. 為了解決這個問題,K8s提供了Service資源,Service為動態的一組Pod提供一個固定的訪問入口;這個固定的訪問入口可以理解為是一組應用的前端的負載均衡器;就像LVS或Nginx為一組ReadyServer做負載均衡器是一樣的,你是看不見的,可以理解為Service就是負載均衡器,但是這種負載均衡器比傳統的負載均衡器要強大;Service資源通過"標簽選擇器Label Selector"把篩選出來的符合條件的一組Pod物件定義成一個邏輯集合,而后Service對外提供自己的IP和埠,
    image

  2. 當客戶端請求Service的IP和埠時,Service將請求調度給標簽匹配的所有的Pod,Service向客戶端隱藏了真實處理請求的Pod資源,使得客戶端的請求看上去是由Service直接處理并進行回應,

  3. Service物件的IP地址(Cluster IP或Service IP)是虛擬IP地址,由kubernetes系統在Service物件創建時在專有網路(Service Network)地址中自動分配或由用戶手動指定,其次Service是基于埠過濾,并根據事先定義好的規則將請求轉發至其后端Pod對應的埠上,因此這種代理機制也稱為"埠代理"或"四層代理"作業在TCP/IP協議堆疊的傳輸層;

1.3 Service的作用?

  1. 暴露流量,讓用戶可以通過ServiceIP+ServicePort訪問后端的Pod應用;
  2. 負載均衡: 提供基于4層的TCP/IP負載均衡,并不提供HTTP/HTTPS等負載均衡;
  3. 服務發現: 當發現新增Pod則自動加入至Service的后端,如發現Pod例外則會踢出Service后端;

1.4 Service的作業邏輯;

  1. Service持續監視API-Server,監視Service標簽選擇器所匹配的后端的Pod,并實時跟蹤這些Pod物件的變動情況,例如IP地址的變化、Pod物件增加或減少;
  2. Service并不直接與Pod建立關聯關系,他們之間還有一個中間層Endpoints,Endpoints物件是一個由IP地址和埠組成的串列,這些IP地址和埠來自于Service標簽選擇器所匹配到的Pod,默認情況下,創建Service資源時,關聯的Endpoints物件會被自動創建;

1.5 Endpoint資源

  1. 創建一個Service的時候會自動創建一個與Service同名的Endpoints,事實上,Service不但能夠把標簽選擇器選中的Pod識別為自己的后端端點,還能夠對后端埠做就緒狀態檢測,如果后端Pod是就緒的就把它加入到后端可用端點串列中,反之踢出;
  2. 這個功能不是Service來做的,而是Service借助一個中間組件,Endpoints也是kubernetes一個標準的資源型別;
  3. Service會自動去管理Endpoints,Endpoints真正能發揮作用的是Endpoint控制器,一旦創建一個Service,需要為Service指定的基本屬性是"Label Selector"隨后Service控制器會根據這個標簽選擇器創建一個同名的Endpoints資源,是由Sercice控制器請求創建一個同名的Endpoints資源,隨后Endpoints控制器就會介入,因為有一個自己的資源需要被創建,Endpoints控制器就會使用Endpoints的標簽選擇器與Service一模一樣,繼承Service的,Endpoints控制器會根據"標簽選擇器"去查找多少個符合篩選的Pod,最重要的是還會檢查Pod的就緒狀態,真正去系結的不是由Service做的,而是由Endpoints做的,Service只負責調度,如果關聯到了,Service只是把Endpoint幫查找到的所有處于就緒狀態的后端Pod告訴Service,于是成了Service的后端端點;

1.6 Servcie的實作;

  1. 在kubernetes中,Service只是一個抽象的概念,真正起作用實作負載均衡規則的其實是kube-proxy這個行程,它在每一個節點都需要運行一個kube-proxy,用來完成負載均衡規則的創建;

1.7 Kube-Proxy代理模式

1.7.1UserSpace

  1. UserSpace模式下,kube-proxy為ServiceIP創建一個監聽埠,當用戶向ServiceIP發起請求;首先按請求會被Iptables規則攔截,然后重定向到kube-proxy對應的埠上,然后kube-proxy根據調度演算法挑選一個Pod,將請求調度到該Pod上;
  2. 該模式流量經過內核空間后,會送往用戶空間Kube-Proxy行程,而后又被送回內核空間,發往調度分配的目標后端Pod;效率太差,報文先到內核空間再回到用戶空間,因為報文在用戶空間來回切換兩次以上,
    1.7.2iptables
  3. iptables模式下,kube-proxy為Service后端的所有Pod創建對應的iptables規則,當用戶向ServiceIP發起請求;首先iptables會攔截用戶請求,然后直接將請求調度給后端的Pod;問題是一個Service會創建大量的Iptables規則,且不支持更高級的調度演算法;
    1.7.3IPVS
    ipvs模式和iptables類似,kube-proxy為Service后端所有的Pod創建對應的IPVS規則, 一個Service只生成一條規則,所以規模較大的場景應使用IPVS,其次IPVS支持更多的高級演算法;

2.Service的型別

2.1 Service資源規范

apiVersion: v1       # API的版本
kind: Service        # 資源型別定義為Service
metadata:           
  name: ...          # Serivce的名稱
  namespace: ...     # 默認的default
  labels:
     key1: value1   # 標簽 key:value格式;
     key2: value2
spec:
  type <string>      # Service型別,默認為ClusterIP;
  selector <map[string]string> #  標簽選擇器
  ports:                       #  ClusterIP:ServicePort
  targetPort: <string>  #后端目標行程的埠號或名稱,
  nodePort: <integer>  # 節點埠號,僅適用于NodePort和loadbalancer型別,  "建議動態選擇30000-32767" 
 clusterIP <string> # Service的集群IP,建議由系統自動分配
 externalTrafficPolicy <string> # 外部流量策略處理方式,local表示由當前節點處理,cluster表示向集群范圍調度
 loadBalancerIP <string> # 外部負載均衡器使用的IP地址,僅適用于loadbalancer,前提是你的公有云得支持你自己指定;
 externalName <string> # 外部服務名稱,該名稱作為Service的DNS CNAME值

2.2 ClusterIP

ClusterIP: 通過集群內部IP暴露服務,選擇ServiceIP只能夠在集群內部訪問,這也是默認的Service型別;該地址僅在集群內部可見、可達,無法被集群外部客戶端訪問;而且是默認型別,創建的任何Service默認就是ClusterIP型別,而且只能接受集群內部客戶端的訪問,

2.2.1 ClusterIP示例;

root@kubernetes-master01:~# cat services-clusterip-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-clusterip
  namespace: default
  labels:
     app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  clusterIP:
  selector:     # 標簽選擇器 
    app: nginx   
  ports:
  - name: http  # 埠名稱
    protocol: TCP   # 協議型別,目前支持TCP、UDP、SCTP默認為TCP
    port: 80   # Service的埠號
    targetPort: 80  # 后端目標行程的埠號
root@kubernetes-master01:~# kubectl apply -f services-clusterip-nginx.yaml 
pod/nginx-clusterip created
service/nginx-svc created

2.2.1.1查看Service;

root@kubernetes-master01:~# kubectl get svc
nginx-svc    ClusterIP   10.106.70.164    <none>        80/TCP    3m

2.2.1.2 可以看到后端就一個Pod;

root@kubernetes-master01:~# kubectl get pods --show-labels -l app=nginx -o wide
NAME              READY   STATUS    RESTARTS   AGE     IP            NODE                NOMINATED NODE   READINESS GATES   LABELS
nginx-clusterip   1/1     Running   0          8m58s   10.244.4.49   kubernetes-node01   <none>           <none>            app=nginx

2.2.1.3查看Endpoint資源,Endpoints可以簡寫為ep;

root@kubernetes-master01:~# kubectl get endpoints
nginx-svc    10.244.4.49:80                                10m

2.2.1.4測驗訪問;只能在集群內部訪問,外部無法訪問;

root@kubernetes-master01:~# curl -I  10.106.70.164
HTTP/1.1 200 OK
Server: nginx/1.21.5
Content-Type: text/html
Content-Length: 615
Connection: keep-alive
ETag: "61cb5be0-267"
Accept-Ranges: bytes

2.3 NodePort

NodePort:首先是一種ClusterIP型別,也就是說,NodePort是ClusterIP的擴展型別,NodePort型別的Service不僅僅能夠被集群內部的客戶端可見,還能對外部客戶端可見,怎么可見呢?它會與ClusterIP的功能之外在每個節點上使用一個相同的埠號"注意是在每個節點上使用一個相同的埠號"將外部流量引入到該Service上來,

2.3.1 NodePort示例;

root@kubernetes-master01:~# cat services-nodeport-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-svc
  namespace: default
spec:
  type: NodePort
  clusterIP:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80   # 后端Pod監聽什么埠就寫什么埠,要不然到達Service的請求轉發給Pod,Pod沒有那個埠也沒用,一定真正轉發到后端程式監聽的埠,如果沒有特殊情況的話,ServicePort和TargetPort保持一致,NodePort可以不用指定,
    nodePort:        # 正常情況下應由系統自己分配,默認是3000~32767
root@kubernetes-master01:~# kubectl apply -f services-nodeport-nginx.yaml 
service/nginx-nodeport-svc created

2.3.1.1查看Service,意味著訪問宿主機IP+nodeport埠就可以訪問服務;

root@kubernetes-master01:~# kubectl get svc
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes           ClusterIP   10.96.0.1        <none>        443/TCP        36d
nginx-nodeport-svc   NodePort    10.111.124.121   <none>        80:32049/TCP   5s
nginx-svc            ClusterIP   10.106.70.164    <none>        80/TCP         34m

2.3.1.2 測驗,這是windows的命令列,也是沒有問題;

C:\Users\海棠>curl -I  10.0.0.1xx:30824
HTTP/1.1 200 OK
Server: nginx/1.21.5
Content-Type: text/html
Content-Length: 615
Connection: keep-alive
ETag: "61cb5be0-267"
Accept-Ranges: bytes

2.4 LoadBalancer

loadBalancer: 這類Service依賴云廠商,需要通過云廠商呼叫API介面創建軟體負載均衡將服務暴露到集群外部,當創建LoadBalancer型別的Service物件時,它會在集群上自動創建一個NodePort型別的Service,集群外部的請求流量會先路由至該負載均衡,并由該負載均衡調度至各個節點的NodePort;

2.4.1 LoadBalancer示例;

root@kubernetes-master01:~# cat  services-loadbalancer-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-loadbalancer-svc
  namespace: default
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  loadBalancerIP: 1.2.3.4

2.4.1.2測驗訪問;

# 我們還是只能是通過NodePort來訪問,因為沒有LoadBalancer的IP;
# LoadBalancer其實就是一個增強的NodePort,而LoadBalancer沒有限制流量調度策略的,外部流量策略對loadbalancer依然使用,因為LoadBalancer首先是一個NodePort的Service,
C:\Users\冷雨夜>curl -I 10.0.0.1XX:31943
HTTP/1.1 200 OK
Server: nginx/1.21.5
Content-Type: text/html
Content-Length: 615
Connection: kep-alive
ETag: "61cb5be0-267"
Accept-Ranges: bytes

2.5 ExternalName

此型別不是用來定義如何訪問集群內服務的,而是把集群外部的某些服務以DNS CANME方式映射到集群內,從而讓集群內的Pod資源能夠訪問外部服務的一種實作方式,

我們一直奔跑在進步的旅途

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/501141.html

標籤:其他

上一篇:Serverless之Knative部署應用實體;

下一篇:Unity實作調色板

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more