成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

6張圖帶你學(xué)懂 Kubernetes Ingress

系統(tǒng) Linux
本文我們希望用一個(gè)簡(jiǎn)單清晰的概述,讓你來(lái)了解 Kubernetes Ingress 背后的東西,讓你更容易理解使用的 Ingress。

 Kubernetes Ingress 只是 Kubernetes 中的一個(gè)普通資源對(duì)象,需要一個(gè)對(duì)應(yīng)的 Ingress 控制器來(lái)解析 Ingress 的規(guī)則,暴露服務(wù)到外部,比如 ingress-nginx,本質(zhì)上來(lái)說(shuō)它只是一個(gè) Nginx Pod,然后將請(qǐng)求重定向到其他內(nèi)部(ClusterIP)服務(wù)去,這個(gè) Pod 本身也是通過(guò) Kubernetes 服務(wù)暴露出去,最常見(jiàn)的方式是通過(guò) LoadBalancer 來(lái)實(shí)現(xiàn)的。

同樣本文我們希望用一個(gè)簡(jiǎn)單清晰的概述,讓你來(lái)了解 Kubernetes Ingress 背后的東西,讓你更容易理解使用的 Ingress。

我們可以使用 Ingress 來(lái)使內(nèi)部服務(wù)暴露到集群外部去,它為你節(jié)省了寶貴的靜態(tài) IP,因?yàn)槟悴恍枰暶鞫鄠€(gè) LoadBalancer 服務(wù)了,此次,它還可以進(jìn)行更多的額外配置。下面我們通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)對(duì) Ingress 進(jìn)行一些說(shuō)明吧。

簡(jiǎn)單 HTTP server

首先,我們先回到容器、Kubernetes 之前的時(shí)代。之前我們更多會(huì)使用一個(gè)(Nginx)HTTP server 來(lái)托管我們的服務(wù),它可以通過(guò) HTTP 協(xié)議接收到一個(gè)特定文件路徑的請(qǐng)求,然后在文件系統(tǒng)中檢查這個(gè)文件路徑,如果存在則就返回即可。

例如,在 Nginx 中,我們可以通過(guò)下面的配置來(lái)實(shí)現(xiàn)這個(gè)功能。 

  1. location /folder {    
  2.     root /var/www/;    
  3.     index index.html;    
  4. }   

除了上面提到的功能之外,我們可以當(dāng) HTTP server 接收到請(qǐng)求后,將該請(qǐng)求重定向到另一個(gè)服務(wù)器(意味著它作為代理)去,然后將該服務(wù)器的響應(yīng)重定向到客戶端去。對(duì)于客戶端來(lái)說(shuō),什么都沒(méi)有改變,接收到的結(jié)果仍然還是請(qǐng)求的文件(如果存在的話)。

同樣如果在 Nginx 中,重定向可以配置成下面的樣子: 

  1. location /folder {    
  2.     proxy_pass http://second-nginx-server:8000;    
  3. }   

這意味著 Nginx 可以從文件系統(tǒng)中提供文件,或者通過(guò)代理將響應(yīng)重定向到其他服務(wù)器并返回它們的響應(yīng)。

簡(jiǎn)單的 Kubernetes 示例

使用 ClusterIP 服務(wù)

在 Kubernetes 中部署應(yīng)用后,我們應(yīng)該先去了解 Kubernetes Service 服務(wù)(前文中講解的)。比如我們有兩個(gè) worker 節(jié)點(diǎn),有兩個(gè)服務(wù) service-nginx 和 service-python,它們指向不同的 pods。這兩個(gè)服務(wù)沒(méi)有被調(diào)度到任何特定的節(jié)點(diǎn)上,也就是在任何節(jié)點(diǎn)上都有可能,如下圖所示:

在集群內(nèi)部我們可以通過(guò)他們的 Service 服務(wù)來(lái)請(qǐng)求到 Nginx pods 和 Python pods 上去,現(xiàn)在我們想讓這些服務(wù)也能從集群外部進(jìn)行訪問(wèn),按照前文提到的我們就需要將這些服務(wù)轉(zhuǎn)換為 LoadBalancer 服務(wù)。

使用 LoadBalancer 服務(wù)

當(dāng)然使用 LoadBalancer 服務(wù)的前提是我們的 Kubernetes 集群的托管服務(wù)商要能支持才行,如果支持我們可以將上面的 ClusterIP 服務(wù)轉(zhuǎn)換為 LoadBalancer 服務(wù),可以創(chuàng)建兩個(gè)外部負(fù)載均衡器,將請(qǐng)求重定向到我們的節(jié)點(diǎn) IP,然后重定向到內(nèi)部的 ClusterIP 服務(wù)。

我們可以看到兩個(gè) LoadBalancers 都有自己的 IP,如果我們向 LoadBalancer 22.33.44.55 發(fā)送請(qǐng)求,它請(qǐng)被重定向到我們的內(nèi)部的 service-nginx 服務(wù)去。如果發(fā)送請(qǐng)求到 77.66.55.44,它將被重定向到我們的內(nèi)部的 service-python 服務(wù)。

這個(gè)確實(shí)很方便,但是要知道 IP 地址是比較稀有的,而且價(jià)格可不便宜。想象下我們 Kubernetes 集群中不只是兩個(gè)服務(wù),有很多的話,我們?yōu)檫@些服務(wù)創(chuàng)建 LoadBalancers 成本是不是就成倍增加了。那么是否有另一種解決方案可以讓我們只使用一個(gè) LoadBalancer 就可以把請(qǐng)求轉(zhuǎn)發(fā)給我們的內(nèi)部服務(wù)呢?我們先通過(guò)手動(dòng)(非 Kubernetes)的方式來(lái)探討下這個(gè)問(wèn)題。

手動(dòng)配置 Nginx 代理服務(wù)

我們知道 Nginx 可以作為一個(gè)代理使用,所以我們可以很容易想到運(yùn)行一個(gè) Nginx 來(lái)代理我們的服務(wù)。如下圖所示,我們新增了一個(gè)名為 service-nginx-proxy 的新服務(wù),它實(shí)際上是我們唯一的一個(gè) LoadBalancer 服務(wù)。service-nginx-proxy 仍然會(huì)指向一個(gè)或多個(gè) Nginx-pod-endpoints(為了簡(jiǎn)單沒(méi)有在圖上標(biāo)識(shí)),之前的另外兩個(gè)服務(wù)轉(zhuǎn)換為簡(jiǎn)單的 ClusterIP 服務(wù)了。

可以看到我們只分配了一個(gè) IP 地址為 11.22.33.44 的負(fù)載均衡器,對(duì)于不同的 http 請(qǐng)求路徑我們用黃色來(lái)進(jìn)行標(biāo)記,他們的目標(biāo)是一致的,只是包含的不同的請(qǐng)求 URL。service-nginx-proxy 服務(wù)會(huì)根據(jù)請(qǐng)求的 URL 來(lái)決定他們應(yīng)該將請(qǐng)求重定向到哪個(gè)服務(wù)去。在上圖中我們有兩個(gè)背后的服務(wù),分別用紅色和藍(lán)色進(jìn)行了標(biāo)記,紅色會(huì)重定向到 service-nginx 服務(wù),藍(lán)色重定向到 service-python 服務(wù)。對(duì)應(yīng)的 Nginx 代理配置如下所示: 

  1. location /folder {    
  2.     proxy_pass http://service-nginx:3001;    
  3. }    
  4. location /other {    
  5.     proxy_pass http://service-python:3002;    
  6. }   

只是目前我們需要去手動(dòng)配置 service-nginx-proxy 服務(wù),比如新增了一個(gè)請(qǐng)求路徑需要路由到其他服務(wù)去,我們就需要去重新配置 Nginx 的配置讓其生效,但是這個(gè)確實(shí)是一個(gè)可行的解決方案,只是有點(diǎn)麻煩而已。而 Kubernetes Ingress 就是為了讓我們的配置更加容易、更加智能、更容易管理出現(xiàn)的,所以在 Kubernetes 集群中我們會(huì)用 Ingress 來(lái)代替上面的手動(dòng)配置的方式將服務(wù)暴露到集群外去。

使用 Kubernetes Ingress

現(xiàn)在我們將上面手動(dòng)配置代理的方式轉(zhuǎn)換為 Kubernetes Ingress 的方式,如下圖所示,我們只是使用了一個(gè)預(yù)先配置好的 Nginx(Ingress),它已經(jīng)為我們做了所有的代理重定向工作,這為我們節(jié)省了大量的手動(dòng)配置工作了。

 

這其實(shí)就已經(jīng)說(shuō)明了 Kubernetes Ingress 是什么,下面讓我們來(lái)看看一些配置實(shí)例吧。

安裝 Ingress 控制器

Ingress 只是 Kubernetes 的一種資源對(duì)象而已,在這個(gè)資源中我們可以去配置我們的服務(wù)路由規(guī)則,但是要真正去實(shí)現(xiàn)識(shí)別這個(gè) Ingress 并提供代理路由功能,還需要安裝一個(gè)對(duì)應(yīng)的控制器才能實(shí)現(xiàn)。 

  1. $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml   
  2. $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/provider/cloud-generic.yaml   

使用下面的命令,可以看到安裝在命名空間 ingress-nginx 中的 k8s 資源。

我們可以看到一個(gè)正常的 LoadBalancer 服務(wù),有一個(gè)外部 IP 和一個(gè)所屬的 pod,我們可以使用命令 kubectl exec 進(jìn)入該 pod,里面包含一個(gè)預(yù)配置的 Nginx 服務(wù)器。

其中的 nginx.conf 文件就包含各種代理重定向設(shè)置和其他相關(guān)配置。

Ingress 配置示例

我們所使用的 Ingress yaml 例子可以是這樣的。 

  1. # just example, not tested    
  2. apiVersion: networking.k8s.io/v1beta1    
  3. kind: Ingress    
  4. metadata:    
  5.   annotations:    
  6.     kubernetes.io/ingress.class: nginx    
  7.   namespace: default    
  8.   name: test-ingress    
  9. spec:    
  10.   rules:    
  11.   - http:    
  12.       paths:    
  13.       - path: /folder   
  14.         backend:    
  15.           serviceName: service-nginx    
  16.           servicePort: 3001    
  17.   - http:    
  18.       paths:    
  19.       - path: /other    
  20.         backend:    
  21.           serviceName: service-python    
  22.           servicePort: 3002   

和其他資源對(duì)象一樣,通過(guò) kubectl create -f ingress.yaml 來(lái)創(chuàng)建這個(gè)資源對(duì)象即可,創(chuàng)建完成后這個(gè) Ingress 對(duì)象會(huì)被上面安裝的 Ingress 控制器轉(zhuǎn)換為對(duì)應(yīng)的 Nginx 配置。

如果你的一個(gè)內(nèi)部服務(wù),即 Ingress 應(yīng)該重定向到的服務(wù),是在不同的命名空間里,怎么辦?因?yàn)槲覀兌x的 Ingress 資源是命名空間級(jí)別的。在 Ingress 配置中,只能重定向到同一命名空間的服務(wù)。如果你定義了多個(gè) Ingress yaml 配置,那么這些配置會(huì)被一個(gè)單一的Ingress 控制器合并成一個(gè) Nginx 配置。也就是說(shuō)所有的人都在使用同一個(gè) LoadBalancer IP。

配置 Ingress Nginx

有時(shí)候我們需要對(duì) Ingress Nginx 進(jìn)行一些微調(diào)配置,我們可以通過(guò) Ingress 資源對(duì)象中的 annotations 注解來(lái)實(shí)現(xiàn),比如我們可以配置各種平時(shí)直接在 Nginx 中的配置選項(xiàng)。 

  1. kind: Ingress    
  2. metadata:    
  3.   name: ingress    
  4.   annotations:    
  5.       kubernetes.io/ingress.class: nginx    
  6.       nginx.ingress.kubernetes.io/proxy-connect-timeout: '30'    
  7.       nginx.ingress.kubernetes.io/proxy-send-timeout: '500'    
  8.       nginx.ingress.kubernetes.io/proxy-read-timeout: '500'    
  9.       nginx.ingress.kubernetes.io/send-timeout: "500"    
  10.       nginx.ingress.kubernetes.io/enable-cors: "true"    
  11.       nginx.ingress.kubernetes.io/cors-allow-methods: "*"    
  12.       nginx.ingress.kubernetes.io/cors-allow-origin: "*"    
  13. ...   

此外也可以做更細(xì)粒度的規(guī)則配置,如下所示: 

  1. nginx.ingress.kubernetes.io/configuration-snippet: |    
  2.   if ($host = 'www.qikqiak.com' ) {    
  3.     rewrite ^ https://qikqiak.com$request_uri permanent;    
  4.   }   

這些注釋都將被轉(zhuǎn)換成 Nginx 配置,你可以通過(guò)手動(dòng)連接(kubectl exec)到 nginx pod 中檢查這些配置。關(guān)于 ingress-nginx 更多的配置使用可以參考官方文檔相關(guān)說(shuō)明:

查看 ingress-nginx 日志

要排查問(wèn)題,通過(guò)查看 Ingress 控制器的日志非常有幫助。

使用 Curl 測(cè)試

如果我們想測(cè)試 Ingress 重定向規(guī)則,最好使用 curl -v [yourhost.com](http://yourhost.com) 來(lái)代替瀏覽器,可以避免緩存等帶來(lái)的問(wèn)題。

重定向規(guī)則

在本文的示例中我們使用 /folder 和 /other/directory 等路徑來(lái)重定向到不同的服務(wù),此外我們也可以通過(guò)主機(jī)名來(lái)區(qū)分請(qǐng)求,比如將 api.myurl.com 和 site.myurl.com 重定向到不同的內(nèi)部 ClusterIP 服務(wù)去。 

  1. apiVersion: networking.k8s.io/v1beta1    
  2. kind: Ingress    
  3. metadata:    
  4.   name: simple-fanout-example   
  5. spec:    
  6.   rules:    
  7.   - host: api.myurl.com    
  8.     http:    
  9.       paths:    
  10.       - path: /foo   
  11.         backend:   
  12.            serviceName: service1    
  13.           servicePort: 4200    
  14.       - path: /bar    
  15.         backend:    
  16.           serviceName: service2    
  17.           servicePort: 8080    
  18.   - host: website.myurl.com    
  19.     http:    
  20.       paths:    
  21.       - path: /    
  22.         backend:    
  23.           serviceName: service3    
  24.           servicePort: 3333   

SSL/HTTPS

可能我們想讓網(wǎng)站使用安全的 HTTPS 服務(wù),Kubernetes Ingress 也提供了簡(jiǎn)單的 TLS 校驗(yàn),這意味著它會(huì)處理所有的 SSL 通信、解密/校驗(yàn) SSL 請(qǐng)求,然后將這些解密后的請(qǐng)求發(fā)送到內(nèi)部服務(wù)去。

如果你的多個(gè)內(nèi)部服務(wù)使用相同(可能是通配符)的 SSL 證書(shū),這樣我們就只需要在 Ingress 上配置一次,而不需要在內(nèi)部服務(wù)上去配置,Ingress 可以使用配置的 TLS Kubernetes Secret 來(lái)配置 SSL 證書(shū)。 

  1. apiVersion: networking.k8s.io/v1beta1   
  2. kind: Ingress    
  3. metadata:    
  4.   name: tls-example-ingress    
  5. spec:    
  6.   tls:    
  7.   - hosts:    
  8.     - sslexample.foo.com    
  9.     secretName: testsecret-tls    
  10.   rules:    
  11.     - host: sslexample.foo.com    
  12.       http:    
  13.         paths:    
  14.         - path: /    
  15.           backend:    
  16.             serviceName: service1   
  17.             servicePort: 80   

不過(guò)需要注意的是如果你在不同的命名空間有多個(gè) Ingress 資源,那么你的 TLS secret 也需要在你使用的 Ingress 資源的所有命名空間中可用。

總結(jié)

這里我們簡(jiǎn)單介紹了 Kubernetes Ingress 的原理,簡(jiǎn)單來(lái)說(shuō):它不過(guò)是一種輕松配置 Nginx 服務(wù)器的方法,它可以將請(qǐng)求重定向到其他內(nèi)部服務(wù)去。這為我們節(jié)省了寶貴的靜態(tài) IP 和 LoadBalancers 資源。

另外需要注意的是還有其他的 Kubernetes Ingress 類型,它們內(nèi)部沒(méi)有設(shè)置 Nginx 服務(wù),但可能使用其他代理技術(shù),一樣也可以實(shí)現(xiàn)上面的所有功能。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 奇妙的Linux世界
相關(guān)推薦

2022-06-11 18:15:26

KubernetesDockerLinux

2023-04-11 08:35:22

RocketMQ云原生

2021-01-28 10:55:47

Kubernetes IPLinux

2020-06-28 07:39:44

Kafka分布式消息

2020-09-23 11:23:25

推薦系統(tǒng)廣告

2021-11-29 07:47:56

RocketMQ分布式消息

2022-02-28 11:10:42

ZGCG1收集器

2021-05-07 17:11:19

負(fù)載均衡運(yùn)維服務(wù)

2022-07-18 14:45:22

Kubernetes暴露方案

2015-05-08 11:15:16

塊數(shù)據(jù)大數(shù)據(jù)

2021-01-20 08:34:37

HBaseNoSQL數(shù)據(jù)庫(kù)

2024-07-03 08:28:44

HWKafkaLEO

2020-12-14 10:15:03

負(fù)載均衡器Linux服務(wù)器

2022-07-11 11:06:11

RocketMQ函數(shù).消費(fèi)端

2021-04-25 10:45:59

Docker架構(gòu)Job

2020-09-12 16:45:49

Git

2024-08-26 08:44:54

2022-06-13 11:05:35

RocketMQ消費(fèi)者線程

2021-05-18 06:55:07

Java AQS源碼

2022-07-04 11:06:02

RocketMQ事務(wù)消息實(shí)現(xiàn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩欧美视频免费在线观看 | 男女在线网站 | 成人久久久久久久久 | 欧美日韩在线一区 | 欧美日韩精品国产 | 人人爱干| 欧美日韩久久 | 国产精品a免费一区久久电影 | 亚洲区一区二 | 日本天天操 | 久久久精品网站 | 日韩电影免费在线观看中文字幕 | 自拍在线| 国产一区二区在线播放 | 2021天天躁夜夜看 | 国产中文字幕在线观看 | 天天躁日日躁狠狠很躁 | 国产精品一区二区久久精品爱微奶 | 精品国产精品国产偷麻豆 | 欧美a区 | 日韩一区二区av | 国产一区免费视频 | 九色91视频 | 久久夜视频 | 亚洲精品影院 | 成人h片在线观看 | 中文字幕在线视频一区二区三区 | 日本黄色免费视频 | 久久精品在线播放 | 狠狠色狠狠色综合日日92 | 日本一区二区影视 | 久久中文字幕一区 | 黄色一级片视频 | 九九综合 | 国产精品久久久久aaaa樱花 | 在线播放国产一区二区三区 | 精品视频亚洲 | 最新免费黄色网址 | 国产成人av一区二区三区 | 古装三级在线播放 | 欧美成人一区二区三区 |