【kubernetes】Endpoint和Service介紹與應用

0x01 介紹

每個

Pod

都有獨有的IP地址,而每次

Pod

重建後IP地址都會發生變化,那我們如何長期對一個

Pod

進行訪問呢?答案就是

Service

Servcie

可以理解為一組

Pod

的四層代理,

Service

作為

kubernets

一種標準的資源,它可以透過節點的

kube-proxy

apiserver

中獲取每個

Pod

的地址,從而實現代理功能。由下圖可見,每一個

Service

資源都有一個

endpoints

endpoints

主要記錄了每個

pod

的IP地址資訊,當

Pod

的IP發生變化時,endpoints會進行更新。

【kubernetes】Endpoint和Service介紹與應用

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)

【kubernetes】Endpoint和Service介紹與應用

訪問:

【kubernetes】Endpoint和Service介紹與應用

檢視

IPVS

規則:

0x03 Service型別和應用

Service

支援4種類型:

ClusterIP

(預設模式)

NodePort

:主機埠模式

Headless ClusterIP

:無頭模式

LoadBalancer

:使用外部負載均衡

ExternalName

:將外部服務引入叢集內部

0x03.1 ClusterIP

不指定

Service

型別時,預設型別為

ClusterIP

,而這個

ClusterIP

的地址段在安裝叢集的時已經配置好了,ClusterIP一般

只能在叢集內訪問

,叢集外是無法訪問的。

【kubernetes】Endpoint和Service介紹與應用

配置位置:

ClusterIP

型別使用:

也可以指定

ClusterIP

0x03.2 NodePort

NodePort

型別的Service應用後,每個

Node

都會監聽該埠。我們可以透過任意一個

NodeIP:Port

來訪問。

【kubernetes】Endpoint和Service介紹與應用

建立一個

NodePort

型別的

Service

檢視

Service

,可以看到已經將80埠對映為31321埠了

隨便登入一臺主機,檢視埠監聽情況

叢集外訪問測試:

NodePort

型別的

Service

在不指定

Port

的情況下,將隨機分配一個

Port

,而分配的訪問預設為

30000-32767

,可以透過以下配置檔案進行修改:

也可以指定

NodePort

0x03.3 Headless ClusterIP無頭服務

無頭服務是一種特殊

ClusterIP

型別的

Service

,但是沒有

ClusterIP

,只能透過域名進行訪問,無頭服務一般在

StatfulSet

中使用。

定義一個

Headless ClusterIP

資源

檢視

Service

【kubernetes】Endpoint和Service介紹與應用

獲取叢集內

DNS

地址

叢集內訪問:

0x

03.4 ExternalName 將外部流量引入叢集內部

ExternalName

型別的

Service

透過

CNAM

E

和它的值,可以將服務對映到

externalName

欄位的內容引入外部服務到內部流量,即使用DNS

CNAME

機制把自己

CNAME

到你指定的另外一個域名上。

【kubernetes】Endpoint和Service介紹與應用

定義一個

externalName

型別

Service

pod

使用

mysql

進行訪問

【kubernetes】Endpoint和Service介紹與應用

0x

03.5

LoadBalancer

使用外部負載均衡

LoadBalancer

需要使用外部

Balancer

(負載均衡器)來實現,我的環境無法演示。

【kubernetes】Endpoint和Service介紹與應用

0x04 使用endpoint代理叢集外部服務

透過上面的例子,我們知道service是依靠endpoint實現的,而這個endpoint也是一種kuberntes資源,支援自定義,這就意味著我們也可以使用service實現叢集外部的資源代理訪問。

【kubernetes】Endpoint和Service介紹與應用

定義endpoints:

定義service(名字和endpoints一樣就可以自動關聯起來了):

檢視:

訪問:

【kubernetes】Endpoint和Service介紹與應用

——結束。

TAG: ServiceClusterIP叢集PodIPVS