下面將詳細(xì)介紹ingress 的基本概念、原生 ingress 資源對象以及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 路由配置顷蟆。入口控制器通過從存儲在 etcd 中的入口對象讀取路由規(guī)則來進(jìn)行實(shí)際路由。
讓我們通過一個(gè)高級示例來了解Ingress腐魂。
在沒有 Kubernetes ingress 的情況下帐偎,要將應(yīng)用程序暴露給外界,您將向部署添加服務(wù)類型 Loadbalancer挤渔。這是它的樣子肮街。(我已經(jīng)顯示了 nodePort 只是為了顯示流量)
在相同的實(shí)現(xiàn)中,對于Ingress判导,在負(fù)載均衡器和 kubernetes 服務(wù)端點(diǎn)之間有一個(gè)反向代理層(入口控制器實(shí)現(xiàn))嫉父。
這是Ingress實(shí)現(xiàn)的一個(gè)非常高級的視圖沛硅。在后面的部分中,我們將看到涵蓋所有關(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í)树碱,它都會在 configmap 中更新肯适,并且 pod 配置會重新加載,或者重新部署成榜。
Kubernetes ingress 也遵循類似的模式框舔,將路由規(guī)則維護(hù)為本地 Kubernetes ingress 對象而不是 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 對象)向瓷,openshift 路由器會處理所有事情肠套。它類似于 Kubernetes 入口舰涌。
Kubernetes Ingress 是如何工作的?
如果您是初學(xué)者并試圖了解 ingress你稚,可能會對它的工作原理感到困惑瓷耙。
例如,您可能會問刁赖,嘿搁痛,我創(chuàng)建了入口規(guī)則,但我不確定如何將其映射到域名或?qū)⑼獠苛髁柯酚傻絻?nèi)部部署宇弛。
您需要非常清楚兩個(gè)關(guān)鍵概念才能理解這一點(diǎn)鸡典。
- Kubernetes Ingress Resource: Kubernetes Ingress Resource 負(fù)責(zé)存儲集群中的 DNS 路由規(guī)則。
- Kubernetes 入口控制器: Kubernetes 入口控制器(Nginx/HAProxy 等)負(fù)責(zé)通過訪問通過入口資源應(yīng)用的 DNS 規(guī)則來進(jìn)行路由枪芒。
讓我們詳細(xì)看看入口資源和入口控制器彻况。
Kubernetes 入口資源
Kubernetes Ingress 資源是一種本地 kubernetes 資源谁尸,您可以在其中指定 DNS 路由規(guī)則。這意味著纽甘,您將外部 DNS 流量映射到內(nèi)部 Kubernetes 服務(wù)端點(diǎn)良蛮。
它需要一個(gè)入口控制器來路由入口對象中指定的規(guī)則。讓我們來看看一個(gè)非澈酚基本的入口資源决瞳。
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
上面的聲明意味著,所有對的調(diào)用都應(yīng)該命中駐留在 dev 命名空間中的test.apps.example.com
命名服務(wù)左权。hello-service
如您所見皮胡,它只有路由規(guī)則。您可以為基于路徑的路由添加多個(gè)路由端點(diǎn)赏迟,您可以添加 TLS 配置等胸囱。
關(guān)于入口對象需要了解的關(guān)鍵事項(xiàng)。
- 入口對象需要入口控制器來路由流量瀑梗。
- 最重要的是烹笔,外部流量不會到達(dá)入口 API,而是會到達(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)識符添加到注釋中。
入口控制器如何工作圾叼?
Nginx 是廣泛使用的入口控制器之一蛤克。
那么讓我們以 Nginx 入口控制器實(shí)現(xiàn)為例來了解它是如何工作的。
- Nginx controller pod 中的文件是一個(gè) lua 模板夷蚊,可以與Kubernetes ingress API
nginx.conf
通信并實(shí)時(shí)獲取流量路由的最新值构挤。這是模板文件。 - Nginx 控制器與 Kubernetes ingress API 對話惕鼓,以檢查是否為流量路由創(chuàng)建了任何規(guī)則筋现。
- 如果找到任何入口規(guī)則,Nginx 控制器會在
/etc/nginx/conf.d
每個(gè) nginx pod 內(nèi)的位置生成一個(gè)路由配置。 - 對于您創(chuàng)建的每個(gè)入口資源矾飞,Nginx 都會在內(nèi)部位置生成一個(gè)配置
/etc/nginx/conf.d
彻犁。 - 主
/etc/nginx/nginx.conf
文件包含來自etc/nginx/conf.d.
- 如果您使用新配置更新入口對象,Nginx 配置將再次更新并重新加載配置凰慈。
如果您使用 exec 連接到 Nginx ingress controller pod 并檢查該/etc/nginx/nginx.conf
文件汞幢,您可以看到在 conf 文件中應(yīng)用的 ingress 對象中指定的所有規(guī)則。
入口和入口控制器架構(gòu)
這是解釋 kubernetes 集群上的入口和入口控制器設(shè)置的架構(gòu)圖微谓。
它顯示了將流量路由到兩個(gè)payment
應(yīng)用auth
程序的入口規(guī)則
現(xiàn)在森篷,如果您查看架構(gòu),它會更有意義豺型,并且您可能能夠理解每個(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 對象。Nginx 用作入口控制器(反向代理)属桦。
我們可以使用入口將流量路由到多條路徑嗎熊痴?
是的他爸。使用單個(gè)入口定義聂宾,您可以添加多個(gè)基于路徑的路由配置。
ingress是否支持TLS配置诊笤?
是的系谐。您可以在入口對象定義中包含 TLS 配置。TLS 證書將作為 Kubernetes 秘密添加并在入口對象中引用。
結(jié)論
在本Kubernetes Ingress 教程中纪他,我們了解了 ingress 在 Kubernetes 中的工作原理鄙煤。及其相關(guān)組件。為生產(chǎn)選擇入口控制器取決于各種因素和要求茶袒。