0x01 介紹
每個
Pod
都有獨有的IP地址,而每次
Pod
重建後IP地址都會發生變化,那我們如何長期對一個
Pod
進行訪問呢?答案就是
Service
,
Servcie
可以理解為一組
Pod
的四層代理,
Service
作為
kubernets
一種標準的資源,它可以透過節點的
kube-proxy
從
apiserver
中獲取每個
Pod
的地址,從而實現代理功能。由下圖可見,每一個
Service
資源都有一個
endpoints
,
endpoints
主要記錄了每個
pod
的IP地址資訊,當
Pod
的IP發生變化時,endpoints會進行更新。
Service
常見的代理模式有兩種,一種是
IPVS
,一種是
iptables
;還有比較新的
cni:ebpf、nftables
。本篇使用的是
IPVS
,啟用
IPVS
可以透過以下方式進行設定:
1、使用
kubeadm
安裝的叢集配置
2、二進位制安裝的叢集配置
值得注意的是:當
kube-proxy
以
IPVS
代理模式啟動時,它將驗證
IPVS
核心模組是否可用。如果未檢測到
IPVS
核心模組,則
kube-proxy
將退回到以
iptables
代理模式執行。
0x02 Service快速入門
定義一個
deployment
資源
定義一個
service
資源
應用:
至此一個
Service
資源就建立好了,
Service
的
endpoint
為
labels app:nginx
的
pod.
檢視
Pod
檢視
Service
檢視Endpoints(建立Service後會自動建立一個同名的endpoints)
訪問:
檢視
IPVS
規則:
0x03 Service型別和應用
Service
支援4種類型:
ClusterIP
(預設模式)
NodePort
:主機埠模式
Headless ClusterIP
:無頭模式
LoadBalancer
:使用外部負載均衡
ExternalName
:將外部服務引入叢集內部
0x03.1 ClusterIP
不指定
Service
型別時,預設型別為
ClusterIP
,而這個
ClusterIP
的地址段在安裝叢集的時已經配置好了,ClusterIP一般
只能在叢集內訪問
,叢集外是無法訪問的。
配置位置:
ClusterIP
型別使用:
也可以指定
ClusterIP
0x03.2 NodePort
NodePort
型別的Service應用後,每個
Node
都會監聽該埠。我們可以透過任意一個
NodeIP:Port
來訪問。
建立一個
NodePort
型別的
Service
檢視
Service
,可以看到已經將80埠對映為31321埠了
隨便登入一臺主機,檢視埠監聽情況
叢集外訪問測試:
NodePort
型別的
Service
在不指定
Port
的情況下,將隨機分配一個
Port
,而分配的訪問預設為
30000-32767
,可以透過以下配置檔案進行修改:
也可以指定
NodePort
0x03.3 Headless ClusterIP無頭服務
無頭服務是一種特殊
ClusterIP
型別的
Service
,但是沒有
ClusterIP
,只能透過域名進行訪問,無頭服務一般在
StatfulSet
中使用。
定義一個
Headless ClusterIP
資源
檢視
Service
獲取叢集內
DNS
地址
叢集內訪問:
0x
03.4 ExternalName 將外部流量引入叢集內部
ExternalName
型別的
Service
透過
CNAM
E
和它的值,可以將服務對映到
externalName
欄位的內容引入外部服務到內部流量,即使用DNS
CNAME
機制把自己
CNAME
到你指定的另外一個域名上。
定義一個
externalName
型別
Service
:
pod
使用
mysql
進行訪問
0x
03.5
LoadBalancer
使用外部負載均衡
LoadBalancer
需要使用外部
Balancer
(負載均衡器)來實現,我的環境無法演示。
0x04 使用endpoint代理叢集外部服務
透過上面的例子,我們知道service是依靠endpoint實現的,而這個endpoint也是一種kuberntes資源,支援自定義,這就意味著我們也可以使用service實現叢集外部的資源代理訪問。
定義endpoints:
定義service(名字和endpoints一樣就可以自動關聯起來了):
檢視:
訪問:
——結束。