nginx ingress的具體使用
一、ingress概述
1、概述
Kubernetes是一個擁有強大故障恢復功能的集群,當pod掛掉時,集群會重新創(chuàng)建一個pod出來,但是pod的IP也會隨之發(fā)生變化,為了應對這種情況,引入了service,通過service的標簽匹配,來進行后端的pod服務發(fā)現(xiàn),并提供傳輸層的負載均衡。然后我們再通過service的nodeport模式將端口映射到宿主機,這樣我們就完成了集群內(nèi)的服務對外暴漏。
但是如果我們想配置基于http的負載均衡,怎么辦呢?可能會想到,再部署一個nginx的pod,以daemonset的形式運行在集群內(nèi),綁定宿主機的80端口,后端直接配置對應的serivce就可以了,
但是當后端有新的服務的時候,就需要更新nginx pod的配置文件,會比較麻煩。這個時候,ingress就出現(xiàn)了。ingress就是原來你需要修改nginx配置文件,現(xiàn)在把它做成了一個ingress對象,可以通過yaml的形式進行創(chuàng)建,ingress controller的功能就是與apiesrver交互,發(fā)現(xiàn)ingress配置文件的變化,生成nginx可以理解的配置,在寫到nginx 的配置文件中

2、功能
- 將Kubernetes內(nèi)部的服務暴漏出去
- 提供基于http層的流量負載均衡(基于主機頭或者URL)
- 提供TLS/SSL加密
ingress是通過service的服務發(fā)現(xiàn)功能來發(fā)現(xiàn)后端的pod,然后流量直接發(fā)給pod,而不經(jīng)由service,所以要比nodeport的方式網(wǎng)絡損耗更小。
3、核心概念
- host:未指定
host,因此該規(guī)則適用于通過指定 IP 地址的所有入站 HTTP 通信。 如果提供了host(例如 foo.bar.com),則rules適用于該host - rules:用于定義當前Ingress資源的轉(zhuǎn)發(fā)規(guī)則列表;由rules定義規(guī)則,或沒有匹配到規(guī)則時,所有的流量會轉(zhuǎn)發(fā)到由backend定義的默認后端。
- backend:默認的后端用于服務那些沒有匹配到任何規(guī)則的請求;定義Ingress資源時,必須要定義backend或rules兩者之一,該字段用于讓負載均衡器指定一個全局默認的后端。
- tls:TLS配置,目前僅支持通過默認端口443提供服務,如果要配置指定的列表成員指向不同的主機,則需要通過SNI TLS擴展機制來支持該功能。
4、nginx-ingress工作原理
- ingress-controller通過和API server交互,動態(tài)的獲取ingress的規(guī)則變化
- 當ingress發(fā)生變化時,按照固定格式生成nginxi可以識別的前后端配置文件
- 再將這段配置文件,寫入到 ingress-controller中的nginx服務中,在reload一下,使配置文件生效
二、nginx-ingress使用
1、安裝
官網(wǎng)地址:https://kubernetes.github.io/ingress-nginx/deploy/
#以yaml形式進行部署 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml #helm進行部署 helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx --create-namespace
2、ingress暴露服務的方式
方式一:Deployment+LoadBalancer模式的Service
如果要把ingress部署在公有云,那用這種方式比較合適。用Deployment部署ingress-controller,創(chuàng)建一個 type為 LoadBalancer 的 service 關聯(lián)這組 pod。大部分公有云,都會為 LoadBalancer 的 service 自動創(chuàng)建一個負載均衡器,通常還綁定了公網(wǎng)地址。 只要把域名解析指向該地址,就實現(xiàn)了集群服務的對外暴露
方式二:DaemonSet+HostNetwork+nodeSelect
用DaemonSet結(jié)合nodeSelect把pod部署到固定節(jié)點上,再通過HostNetWork直接講pod與宿主機的的網(wǎng)絡打通,直接使用宿主機的80/443端口進行訪問,這種方式整個請求鏈路更簡單,性能相比較NodePort的方式更好,缺點是一個主機只能部署一個pod。
方式三:Deployment+NodePort模式的Service
用Deployment部署ingress-controller,創(chuàng)建一個 type為NodePort的service,這樣就會暴露在集群節(jié)點的特定端口上面,由于NodePort暴露的端口不是80/443端口,一般前端還會加一個負載均衡,或者把域名解析到node節(jié)點的公網(wǎng)ip上。由于多了一層nat轉(zhuǎn)發(fā)性能會不如方式二
3、基于主機名作負載均衡
注意:通配符匹配要求http host頭部字段與通配符規(guī)則中的后綴部分相同。(例如:*.foo.com 匹配 bar.foo.com, 但不匹配 bar.bar.foo.com)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-wildcard-host
annotations:
kubernetes.io/ingress.class: "nginx" ##指定Ingress Controller的類型
nginx.ingress.kubernetes.io/use-regex: "true" ##指定后面rules定義的path可以使用正則表達式
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" ##連接超時時間,默認為5s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600" ##后端服務器回轉(zhuǎn)數(shù)據(jù)超時時間,默認為60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600" ##后端服務器響應超時時間,默認為60s
nginx.ingress.kubernetes.io/proxy-body-size: "10m" ##客戶端上傳文件,最大大小,默認為20m
#nginx.ingress.kubernetes.io/rewrite-target: / ##URL重寫
nginx.ingress.kubernetes.io/app-root: /index.html
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: "/bar"
backend:
service:
name: service1
port:
number: 80
- host: "*.foo.com"
http:
paths:
- pathType: Prefix
path: "/foo"
backend:
service:
name: service2
port:
number: 80
4、基于URL做負載均衡
注意:如果路徑的最后一個元素是請求路徑中的最后一個元素的子字符串,則不會匹配,(例如:/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz)
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-web
annotations:
kubernetes.io/ingress.class: "nginx" ##指定Ingress Controller的類型
nginx.ingress.kubernetes.io/use-regex: "true" ##指定后面rules定義的path可以使用正則表達式
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" ##連接超時時間,默認為5s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600" ##后端服務器回轉(zhuǎn)數(shù)據(jù)超時時間,默認為60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600" ##后端服務器響應超時時間,默認為60s
nginx.ingress.kubernetes.io/proxy-body-size: "10m" ##客戶端上傳文件,最大大小,默認為20m
#nginx.ingress.kubernetes.io/rewrite-target: / ##URL重寫
nginx.ingress.kubernetes.io/app-root: /index.html
spec:
rules:
- host: www.jiege.com
http:
paths:
- path: /app1
backend:
serviceName: magedu-tomcat-app1-service
servicePort: 80
- path: /app2
backend:
serviceName: magedu-tomcat-app2-service
servicePort: 80
5、配置TLS加密
可以將證書先配置為secrt類型來做保護,ingress只支持單個TLS端口443
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-web
spec:
rules:
- host: www.jiege.com
http:
paths:
- path: /app1
backend:
serviceName: magedu-tomcat-app1-service
servicePort: 80
- path: /app2
backend:
serviceName: magedu-tomcat-app2-service
servicePort: 80
注意:默認規(guī)則上無法使用TLS,因為需要向所有可能的子域名發(fā)放證書,因此,TLS字段中,hosts的值需要與rules字段中hosts完全匹配。
示例:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-web
namespace: magedu
annotations:
kubernetes.io/ingress.class: "nginx" ##指定Ingress Controller的類型
nginx.ingress.kubernetes.io/ssl-redirect: 'true' ##開啟重定向
spec:
tls:
- hosts:
- www.jiege.com
secretName: tls-secret
- hosts:
- mobile.jiege.com
secretName: mobile-tls-secret
rules:
- host: www.jiege.com
http:
paths:
- path: /
backend:
serviceName: magedu-tomcat-app1-service
servicePort: 80
- host: mobile.jiege.com
http:
paths:
- path: /
backend:
serviceName: magedu-tomcat-app2-service
servicePort: 80
6、Annotations注解
注解用來配置當前ingress資源實例中的Nginx虛擬主機相關的配置,也就是通過Annotations來開啟一些nginx功能
示例
| 注解 | 類型 | 功能描述 |
|---|---|---|
| nginx.ingress.kubernetes.io/enable-access-log | true 或 false | 對當前虛擬主機設置是否啟用訪問日志,默認為真 |
| nginx.ingress.kubernetes.io/client-body-buffer-size | string | 同 Nginx 配置指令 client_body_buffer_size |
| nginx.ingress.kubernetes.io/use-regex | true 或 false | 是否對當前虛擬主機的 Nginx 指令 location 使用正則方式進行路徑匹配,默認值為 false |
| nginx.ingress.kubernetes.io/custom-http-errors | []int | 根據(jù)響應碼狀態(tài)定義為錯誤狀態(tài)并跳轉(zhuǎn)到設置的默認后端 |
| nginx.ingress.kubernetes.io/default-backend | string | 自定義默認后端的資源對象 Service 名稱,當客戶端的請求沒有匹配的 Nginx 規(guī)則或響應錯誤時,將被轉(zhuǎn)發(fā)到默認后端 |
| nginx.ingress.kubernetes.io/permanent-redirect | string | 設置永久重定向的目標地址 |
| nginx.ingress.kubernetes.io/permanent-redirect-code | number | 自定義永久重定向的響應碼,默認為 301 |
| nginx.ingress.kubernetes.io/rewrite-target | URI | 同 Nginx 配置指令 rewrite |
| nginx.ingress.kubernetes.io/limit-rate | number | 訪問流量速度限制,同 Nginx 配置指令 limit_rate |
| nginx.ingress.kubernetes.io/limit-connections | number | 節(jié)并發(fā)連接數(shù)限制,同 Nginx 配置指令 limit_conn |
| nginx.ingress.kubernetes.io/enable-global-auth | true 或 false | 如果 ConfigMap 的 global-auth-url 被設置,Nginx 會將所有的請求重定向到提供身份驗證的 URL,默認為 true |
| nginx.ingress.kubernetes.io/service-upstream | true 或 false | 默認 Nginx 以 Service 中 Pod 的 IP 和端口為 Upstream 中的成員列表,該參數(shù)為 true 時,將以 Service 的 ClusterIP 和端口為被代理入口,該功能避免了因 Pod 漂移帶來的 Upstream 的配置變化 |
| nginx.ingress.kubernetes.io/backend-protocol | НТТР 或 HTTPS 或 GRPC 或 GRPCS 或 AJP 或 FCGI | 設置代理后端服務器的代理協(xié)議類型,默認為 HTTP |
| nginx.ingress.kubernetes.io/load-balance | round_robin 或 ewma | 設置負載均衡算法,基于 balancer_by_lua 模塊實現(xiàn),支持輪詢和 Peak EWMA 兩種負載算法 |
到此這篇關于nginx ingress的具體使用的文章就介紹到這了,更多相關nginx ingress內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- nginx-ingress-controller日志持久化方案的解決
- k8s部署ingress-nginx的方法步驟
- nginx?ingress代理websocket流量的配置方法
- 解決國內(nèi)k8s的ingress-nginx鏡像無法正常pull拉取問題
- k8s之ingress-nginx詳解和部署方案
- 安裝ingress-nginx遇到的一些坑實戰(zhàn)記錄
- nginx?ingress限速那些事淺析
- 使用Nginx Ingress 優(yōu)雅顯示錯誤頁面
- nginx-ingress-controller部署配置詳解
- k8s部署ingress-nginx的詳細步驟大全
- Nginx?ingress?controller高可用的實現(xiàn)
相關文章
Nginx之location匹配和Rewrite重寫跳轉(zhuǎn)方式
這篇文章主要介紹了Nginx之location匹配和Rewrite重寫跳轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Nginx下Wordpress的永久鏈接實現(xiàn)(301,404等)
經(jīng)過多番測試,終于在nginx下實現(xiàn)了rewrite的功能,WrodPress的永久鏈接終于生效了2012-09-09

