Kubernetes集群網(wǎng)絡(luò):k8s對外暴露服務(wù)的方式
一、Master集群網(wǎng)絡(luò)
master集群的網(wǎng)絡(luò)比較簡單,和通常的負(fù)載均衡集群一樣。多個節(jié)點的apiserver的ip與端口(6443)使用負(fù)載均衡的ip與端口。在master/node節(jié)點join時均使用此負(fù)載均衡的ip與端口,這樣就是master節(jié)點的集群網(wǎng)絡(luò)。
- master 節(jié)點之間的網(wǎng)絡(luò):如果有多個 master 節(jié)點,它們之間需要通過 etcd 這個分布式鍵值存儲來保持?jǐn)?shù)據(jù)的一致性。etcd 通常使用 Raft 協(xié)議來實現(xiàn)高可用和容錯性,它需要每個節(jié)點之間都能夠互相通信,因此需要配置一個可靠的網(wǎng)絡(luò)連接。
- master 節(jié)點和 node 節(jié)點之間的網(wǎng)絡(luò):master 節(jié)點和 node 節(jié)點之間需要通過 kube-apiserver 這個組件來進(jìn)行通信。kube-apiserver 是 master 節(jié)點上運行的組件,它提供了 RESTful 的 API 接口,供外部客戶端和內(nèi)部組件訪問 k8s 集群的資源和狀態(tài)。node 節(jié)點上運行著 kubelet 和 kube-proxy 這兩個組件,它們需要定期向 kube-apiserver 匯報節(jié)點和 Pod 的信息,或者接收 kube-apiserver 的指令。因此,需要配置一個安全和穩(wěn)定的網(wǎng)絡(luò)連接。
- master 節(jié)點和外部客戶端之間的網(wǎng)絡(luò):外部客戶端可以通過 kubectl 命令行工具或者其他方式來訪問 master 節(jié)點上的 kube-apiserver,從而對 k8s 集群進(jìn)行管理和操作。為了保證安全性和可訪問性,需要配置一個合適的網(wǎng)絡(luò)地址和端口,并且使用 TLS/SSL 加密通信。
二、Node集群網(wǎng)絡(luò)
K8s集群對外暴露服務(wù)的方式主要有以下幾種:
- NodePort:將服務(wù)暴露到集群中每個節(jié)點的固定端口,客戶端可以通過節(jié)點的 IP 地址和端口訪問服務(wù)。
- LoadBalancer:使用云平臺的負(fù)載均衡器將服務(wù)暴露到公網(wǎng),客戶端可以通過公網(wǎng) IP 地址和端口訪問服務(wù)。
- Ingress:使用 Ingress 控制器將服務(wù)暴露到公網(wǎng),并提供統(tǒng)一的域名訪問。
1、NodePort
NodePort 是 Kubernetes 提供的一種最簡單的服務(wù)暴露方式。當(dāng) Service 的類型為 NodePort 時,Kubernetes 會為該 Service 分配一個固定的端口,該端口會映射到集群中每個節(jié)點的相同端口??蛻舳丝梢酝ㄟ^集群中任何節(jié)點的 IP 地址和端口訪問服務(wù)。
NodePort 的配置非常簡單,只需要在 Service 的 spec 中設(shè)置 type 為 NodePort,并指定端口號即可。例如,以下 YAML 定義了一個 NodePort 服務(wù):
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30000
該服務(wù)將暴露到集群中每個節(jié)點的 30000 端口??蛻舳丝梢酝ㄟ^集群中任何節(jié)點的 IP 地址和 30000 端口訪問該服務(wù)。
NodePort 的優(yōu)點是簡單易用,可以快速將服務(wù)暴露到集群外部。但是,NodePort 也有一定的缺點。
Kubernetes NodePort 類型的服務(wù)將在每個節(jié)點上暴露一個端口,并分配一個 cluster IP 地址。外部客戶端可以通過 <NodeIP>:<NodePort> 來訪問該服務(wù)。NodePort 類型的服務(wù)適用于需要在集群外部訪問的服務(wù),例如 Web 服務(wù)。
NodePort 類型的服務(wù)有以下優(yōu)點:
- 配置簡單,只需要指定 type: NodePort 即可。
- 部署快速,不需要額外的組件。
- 可用于任何類型的服務(wù),包括 HTTP、TCP 和 UDP。
NodePort 類型的服務(wù)也有以下缺點:
- 端口范圍有限,只能使用 30000-32767 之間的端口。
- 每個端口只能提供一種服務(wù),無法同時提供多個服務(wù)。
- 需要手動打開防火墻來允許外部流量進(jìn)入集群。
2、LoadBalancer
LoadBalancer 是 Kubernetes 提供的一種更高級的服務(wù)暴露方式。當(dāng) Service 的類型為 LoadBalancer 時,Kubernetes 會在云平臺上創(chuàng)建一個負(fù)載均衡器(一般付費購買相應(yīng)的負(fù)載均衡產(chǎn)品),并將該負(fù)載均衡器綁定到 Service 上。客戶端可以通過負(fù)載均衡器的公網(wǎng) IP 地址和端口訪問服務(wù)。
LoadBalancer 類型的服務(wù)有以下優(yōu)點:
- 具有高可用性,可以保證服務(wù)始終可用。
- 可以為多個服務(wù)提供負(fù)載均衡,提高服務(wù)的性能。
- 可以使用任意端口來暴露服務(wù)。
- 可以為服務(wù)提供 SSL/TLS 保護(hù)。
LoadBalancer 類型的服務(wù)也有以下缺點:
- 配置復(fù)雜,需要指定負(fù)載均衡器的類型和配置。
- 部署需要額外的時間和資源。
- 可能需要額外付費,具體取決于負(fù)載均衡器的類型。
3、Ingress
Ingress 是 Kubernetes 提供的一種更靈活的服務(wù)暴露方式。Ingress 控制器可以將多個 Service 統(tǒng)一到一個域名下,并提供路由規(guī)則,使得客戶端可以通過統(tǒng)一的域名訪問不同的Service。
具體選擇哪種方式需要根據(jù)實際需求來決定。如果需要快速部署服務(wù),NodePort 是一個不錯的選擇。如果需要將服務(wù)暴露到公網(wǎng),LoadBalancer 或 Ingress 是更好的選擇。
它具有以下優(yōu)點:
- 靈活性和強大功能:Ingress 可以根據(jù)請求的路徑、主機名、HTTP 方法等來路由流量到不同的 Service。Ingress 還可以提供負(fù)載均衡、SSL/TLS 保護(hù)、緩存等功能。
- 易用性:ngress 的配置簡單,可以使用 YAML 文件來定義 Ingress 規(guī)則。
- 可擴展性:Ingress 可以使用多個 Ingress Controller 來實現(xiàn)負(fù)載均衡和高可用性。
Ingress 的缺點:
- 性能開銷:Ingress Controller 需要在集群中運行,會消耗一定的資源。
- 復(fù)雜性:Ingress 的配置可能比較復(fù)雜,需要一定的學(xué)習(xí)成本。
三、相關(guān)問題
1、已經(jīng)有了Service為什么還需要ingress?
Kubernetes Service 和 Ingress 都是用來將 Kubernetes 服務(wù)暴露給外部世界的資源對象。它們之間主要的區(qū)別如下:
- Service是Kubernetes 的核心概念,用于將 Pod 集合抽象成一個邏輯單元,并提供一個統(tǒng)一的訪問入口。Service 有四種類型:ClusterIP、NodePort、LoadBalancer 和 ExternalName。其中,ClusterIP 類型的 Service 只在集群內(nèi)部可用,NodePort 類型的 Service 在集群內(nèi)部和集群外部都可用,LoadBalancer 類型的 Service 在集群外部可用,ExternalName 類型的 Service 指向一個外部主機或域名。
- Ingress 是 Kubernetes 的擴展資源對象,用于為 Service 提供更靈活和強大的路由功能。Ingress 可以根據(jù)請求的路徑、主機名、HTTP 方法等來路由流量到不同的 Service。Ingress 還可以提供負(fù)載均衡、SSL/TLS 保護(hù)、緩存等功能。
因此,Service 和 Ingress 可以結(jié)合起來使用,以實現(xiàn)更靈活和強大的服務(wù)路由功能。例如,可以使用 Service 將 Pod 集合抽象成一個邏輯單元,然后使用 Ingress 為該 Service 提供路由和負(fù)載均衡功能。
2、是否可以使用nginx代替ingress?
Ingress 和外部 Nginx 之間的主要區(qū)別如下:
- 部署位置:Ingress 是 Kubernetes 中的資源對象,需要在 Kubernetes 集群中部署。外部 Nginx 可以部署在 Kubernetes 集群外部,也可以部署在 Kubernetes 集群內(nèi)部。
- 管理方式:Ingress 由 Kubernetes 控制器管理,可以使用 Kubernetes API 來管理 Ingress。外部 Nginx 需要通過外部工具或命令來管理。
- 功能:Ingress 提供了更豐富的功能,例如負(fù)載均衡、SSL/TLS 保護(hù)、緩存等。外部 Nginx 可以通過插件來擴展功能,但可能不如 Ingress 的功能豐富。
Ingress 是 Kubernetes 中更完整的解決方案,它提供了更豐富的功能和更靈活的配置方式。如果您需要使用 Kubernetes 集群中的所有功能,那么使用 Ingress 是更好的選擇。
以下是一些使用外部 Nginx 代替 Ingress 的場景:
- 您已經(jīng)有現(xiàn)有的 Nginx 服務(wù)器,并且不想部署 Ingress。
- 您需要使用外部 Nginx 的特定功能,例如特定的插件或配置。
- 您需要將 Kubernetes 服務(wù)暴露到外部網(wǎng)絡(luò),但不需要使用 Ingress 的所有功能。
3、NodePort vs Ingress
- NodePort是一種簡單易用的外部訪問方式,它在所有節(jié)點上開放一個端口,轉(zhuǎn)發(fā)流量到服務(wù)。它的優(yōu)點是不需要額外的IP地址或負(fù)載均衡器,但它的缺點是端口范圍有限(30000-32767),不安全(容易被攻擊),不支持七層協(xié)議(無法根據(jù)域名或路徑路由),并且性能受限于節(jié)點數(shù) 。
- Ingress是一種強大靈活的外部訪問方式,它在多個服務(wù)前端,根據(jù)路徑或域名路由流量到服務(wù)。它的優(yōu)點是可以暴露多個服務(wù),支持HTTP/HTTPS協(xié)議,提供高性能和高可用性,并且可以集成各種插件和功能(如SSL/TLS終止、認(rèn)證、重寫、限流等)。但它的缺點是復(fù)雜難懂,需要額外的控制器和插件,以及云環(huán)境或物理設(shè)備提供的負(fù)載均衡器 。
四、部署應(yīng)用的步驟
在 k8s node 集群節(jié)點部署的 java 應(yīng)用,要想向外提供訪問服務(wù),需要使用 k8s 的 Service 和 Ingress 這兩個資源對象。Service 是一種抽象,它定義了一組 Pod 的邏輯訪問方式,可以實現(xiàn) Pod 之間和 Pod 與外部網(wǎng)絡(luò)之間的負(fù)載均衡和服務(wù)發(fā)現(xiàn)。Ingress 是一種規(guī)則集合,它定義了如何將外部請求路由到集群內(nèi)部的 Service 上,可以實現(xiàn)域名、路徑、SSL/TLS 等高級功能 。具體可以通過以下幾個步驟來實現(xiàn):
- 首先,需要在 node 節(jié)點上創(chuàng)建一個 Deployment對象,來定義 java 應(yīng)用的 Pod 的數(shù)量、規(guī)格、鏡像等信息,并且為每個 Pod 分配一個 IP 地址。
- 然后,需要在 node 節(jié)點上創(chuàng)建一個 Service 對象,來定義 java 應(yīng)用的訪問方式,如端口、協(xié)議、選擇器等信息,并且為 Service 分配一個虛擬 IP 地址。
- 接著,需要在 node 節(jié)點上創(chuàng)建一個 Ingress 對象,來定義 java 應(yīng)用的外部訪問規(guī)則,如域名、路徑、證書等信息,并且為 Ingress 分配一個公網(wǎng) IP 地址或者域名。
- 最后,需要在 node 節(jié)點上安裝一個 Ingress Controller 組件,如 nginx-ingress、traefik 等,來根據(jù) Ingress 對象的規(guī)則,將外部請求轉(zhuǎn)發(fā)到對應(yīng)的 Service 上。