下面將詳細(xì)介紹ingress 的基本概念、原生 ingress 資源對(duì)象以及ingress controller 涉及的概念。
Kubernetes Ingress 是一種資源,用于添加Rules以將流量從外部源路由到 kubernetes 集群中運(yùn)行的應(yīng)用程序。
主要包括下面幾個(gè)方面的內(nèi)容:
- 什么是 Kubernetes Ingress?
- 在 Kubernetes Ingress 之前?
- Kubernetes Ingress 是如何工作的?
- Kubernetes 入口資源
- Kubernetes 入口控制器
- 入口控制器如何工作?
- 入口和入口控制器架構(gòu)
- Kubernetes 入口控制器列表
- 部署你的第一個(gè)入口控制器
- Kubernetes Ingress 常見問題解答
Ingress是指進(jìn)入集群的流量,egress是指離開集群的流量。

Ingress 是原生的 Kubernetes 資源,如 pod、deployments 等。使用 ingress,您可以維護(hù) DNS 路由配置。入口控制器通過從存儲(chǔ)在 etcd 中的入口對(duì)象讀取路由規(guī)則來進(jìn)行實(shí)際路由。
讓我們通過一個(gè)高級(jí)示例來了解Ingress。
在沒有 Kubernetes ingress 的情況下,要將應(yīng)用程序暴露給外界,您將向部署添加服務(wù)類型 Loadbalancer。這是它的樣子。(我已經(jīng)顯示了 nodePort 只是為了顯示流量)

在相同的實(shí)現(xiàn)中,對(duì)于Ingress,在負(fù)載均衡器和 kubernetes 服務(wù)端點(diǎn)之間有一個(gè)反向代理層(入口控制器實(shí)現(xiàn))。
這是Ingress實(shí)現(xiàn)的一個(gè)非常高級(jí)的視圖。在后面的部分中,我們將看到涵蓋所有關(guān)鍵概念的詳細(xì)架構(gòu)。

在 Kubernetes Ingress 之前?
在 Kubernetes Ingress 穩(wěn)定之前,自定義 Nginx 或 HAproxy kubernetes 部署將作為 Loadbalancer 服務(wù)公開,用于將外部流量路由到內(nèi)部集群服務(wù)。
路由規(guī)則作為配置映射添加到 Nginx/HAProxy pod 中。每當(dāng) dns 發(fā)生變化或要添加新的路由條目時(shí),它都會(huì)在 configmap 中更新,并且 pod 配置會(huì)重新加載,或者重新部署。
Kubernetes ingress 也遵循類似的模式,將路由規(guī)則維護(hù)為本地 Kubernetes ingress 對(duì)象而不是 configmap。
在 Nginx/HAProxy 的位置,我們有入口控制器、Nginx/HAProxy 的自定義版本等,它可以動(dòng)態(tài)獲取路由規(guī)則。
此外,還有使用 consul 和其他服務(wù)發(fā)現(xiàn)工具的實(shí)現(xiàn),無需停機(jī)即可將 DNS 更改更新到 Nginx 或 HAproxy,這帶來了作為入口的確切實(shí)現(xiàn)。
當(dāng)談到 openshift 時(shí),路由器(HAproxy 實(shí)現(xiàn))概念使得在集群外暴露服務(wù)端點(diǎn)變得容易。您所要做的就是進(jìn)行路由器配置(Openshift YAML 對(duì)象),openshift 路由器會(huì)處理所有事情。它類似于 Kubernetes 入口。
Kubernetes Ingress 是如何工作的?
如果您是初學(xué)者并試圖了解 ingress,可能會(huì)對(duì)它的工作原理感到困惑。
例如,您可能會(huì)問,嘿,我創(chuàng)建了入口規(guī)則,但我不確定如何將其映射到域名或?qū)⑼獠苛髁柯酚傻絻?nèi)部部署。
您需要非常清楚兩個(gè)關(guān)鍵概念才能理解這一點(diǎn)。
- Kubernetes Ingress Resource: Kubernetes Ingress Resource 負(fù)責(zé)存儲(chǔ)集群中的 DNS 路由規(guī)則。
- Kubernetes 入口控制器: Kubernetes 入口控制器(Nginx/HAProxy 等)負(fù)責(zé)通過訪問通過入口資源應(yīng)用的 DNS 規(guī)則來進(jìn)行路由。

讓我們?cè)敿?xì)看看入口資源和入口控制器。
Kubernetes 入口資源
Kubernetes Ingress 資源是一種本地 kubernetes 資源,您可以在其中指定 DNS 路由規(guī)則。這意味著,您將外部 DNS 流量映射到內(nèi)部 Kubernetes 服務(wù)端點(diǎn)。
它需要一個(gè)入口控制器來路由入口對(duì)象中指定的規(guī)則。讓我們來看看一個(gè)非?;镜娜肟谫Y源。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
rules:
- host: test.apps.example.com
http:
paths:
- backend:
serviceName: hello-service
servicePort: 80
上面的聲明意味著,所有對(duì)的調(diào)用都應(yīng)該命中駐留在 dev 命名空間中的test.apps.example.com命名服務(wù)。hello-service
如您所見,它只有路由規(guī)則。您可以為基于路徑的路由添加多個(gè)路由端點(diǎn),您可以添加 TLS 配置等。
關(guān)于入口對(duì)象需要了解的關(guān)鍵事項(xiàng)。
- 入口對(duì)象需要入口控制器來路由流量。
- 最重要的是,外部流量不會(huì)到達(dá)入口 API,而是會(huì)到達(dá)直接使用負(fù)載均衡器配置的入口控制器服務(wù)端點(diǎn)。
現(xiàn)在,讓我們了解入口控制器。
Kubernetes 入口控制器
入口控制器不是原生的 Kubernetes 實(shí)現(xiàn)。這意味著它在集群中不是默認(rèn)的。
我們需要為入口規(guī)則設(shè)置一個(gè)入口控制器。有幾個(gè)可用的開源和企業(yè)入口控制器。
入口控制器通常是集群中的反向 Web 代理服務(wù)器實(shí)現(xiàn)。在 kubernetes 術(shù)語中,它是一個(gè)反向代理服務(wù)器部署為kubernetes 部署暴露給服務(wù)類型 Loadbalancer。
您可以將集群中的多個(gè)入口控制器映射到多個(gè)負(fù)載均衡器。每個(gè)入口控制器都應(yīng)該有一個(gè)名為ingress-class 的唯一標(biāo)識(shí)符添加到注釋中。
入口控制器如何工作?
Nginx 是廣泛使用的入口控制器之一。
那么讓我們以 Nginx 入口控制器實(shí)現(xiàn)為例來了解它是如何工作的。

- Nginx controller pod 中的文件是一個(gè) lua 模板,可以與Kubernetes ingress API
nginx.conf通信并實(shí)時(shí)獲取流量路由的最新值。這是模板文件。 - Nginx 控制器與 Kubernetes ingress API 對(duì)話,以檢查是否為流量路由創(chuàng)建了任何規(guī)則。
- 如果找到任何入口規(guī)則,Nginx 控制器會(huì)在
/etc/nginx/conf.d每個(gè) nginx pod 內(nèi)的位置生成一個(gè)路由配置。 - 對(duì)于您創(chuàng)建的每個(gè)入口資源,Nginx 都會(huì)在內(nèi)部位置生成一個(gè)配置
/etc/nginx/conf.d。 - 主
/etc/nginx/nginx.conf文件包含來自etc/nginx/conf.d. - 如果您使用新配置更新入口對(duì)象,Nginx 配置將再次更新并重新加載配置。
如果您使用 exec 連接到 Nginx ingress controller pod 并檢查該/etc/nginx/nginx.conf文件,您可以看到在 conf 文件中應(yīng)用的 ingress 對(duì)象中指定的所有規(guī)則。
入口和入口控制器架構(gòu)
這是解釋 kubernetes 集群上的入口和入口控制器設(shè)置的架構(gòu)圖。
它顯示了將流量路由到兩個(gè)payment應(yīng)用auth程序的入口規(guī)則
現(xiàn)在,如果您查看架構(gòu),它會(huì)更有意義,并且您可能能夠理解每個(gè)入口工作流的工作原理。

部署你的第一個(gè)入口控制器
為了更好地理解入口和入口控制器,您應(yīng)該親自動(dòng)手實(shí)現(xiàn)。
我已經(jīng)發(fā)布了關(guān)于設(shè)置 Nginx 入口控制器的詳細(xì)指南。
我還詳細(xì)介紹了一些基本概念,例如入口準(zhǔn)入控制器。
此外,我已經(jīng)給出了逐步的清單部署和解釋以獲得深刻的理解。
Kubernetes Ingress 常見問題解答
Ingress 是負(fù)載均衡器嗎?
Ingress 不是負(fù)載均衡器。它包含所有路由規(guī)則、自定義標(biāo)頭和 TLS 配置。入口控制器充當(dāng)負(fù)載平衡器。
為什么我需要入口控制器?
入口控制器負(fù)責(zé)將外部流量實(shí)際路由到 kubernetes 服務(wù)端點(diǎn)。沒有入口控制器,添加到入口的路由規(guī)則將不起作用。
ingress 和 Nginx 有什么區(qū)別?
Ingress 是一個(gè) kubernetes 對(duì)象。Nginx 用作入口控制器(反向代理)。
我們可以使用入口將流量路由到多條路徑嗎?
是的。使用單個(gè)入口定義,您可以添加多個(gè)基于路徑的路由配置。
ingress是否支持TLS配置?
是的。您可以在入口對(duì)象定義中包含 TLS 配置。TLS 證書將作為 Kubernetes 秘密添加并在入口對(duì)象中引用。
結(jié)論
在本Kubernetes Ingress 教程中,我們了解了 ingress 在 Kubernetes 中的工作原理。及其相關(guān)組件。為生產(chǎn)選擇入口控制器取決于各種因素和要求。