這篇文章主要介紹了使用ingress-nginx進行前后端分離的示例,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司主營泰興網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),泰興h5重慶小程序開發(fā)搭建,泰興網(wǎng)站營銷推廣歡迎泰興等地區(qū)企業(yè)咨詢1、Ingress-nginx 介紹
1.1、Ingress-nginx 組成
nginx-ingress-controller:Kubernetes 入口控制器,通過 ingress-nginx 能夠?qū)崿F(xiàn)基本的負載均衡、證書卸載、會話加密以及 URL 重寫等功能;
ingress 資源對象:能夠?qū)?nginx 配置抽象成 Ingress 對象,每添加一個Service,只需要添加相應(yīng)的 Ingress 規(guī)則,添加完成后,nginx-ingress-controller 通過 lua reload 配置,使其自動生效。
1.2、Ingress-nginx 工作原理
Ingress 通過跟 Kubernetes ApiServer 交互,動態(tài)感知 ingress 集群規(guī)則的變化;讀取規(guī)則,動態(tài)生成相應(yīng)的 nginx 配置文件,并把配置寫到 nginx-ingress-controller 的 Pod 里面,Pod 里面運行著 nginx 服務(wù),最終把配置寫到 nginx.conf 中;最后動態(tài) reload 配置,使其自動生效。簡單理解就是原先需要修改 Nginx 配置,然后配置不同的轉(zhuǎn)發(fā)規(guī)則到 Service 這個過程抽象出來變成一個 Ingress 對象,后續(xù) Nginx 的變更再通過 Ingress Controller 與 Kubernetes API 交互,動態(tài)的去感知集群中 Ingress 規(guī)則變化,再寫到 Nginx Pod 里。
1.3、Ingress-nginx 作用
在此之前,曾經(jīng)總結(jié)過 Kubernetes Service 資源類型 Kubernetes里的Service究竟是如何工作的呢?通常情況下,我們會定義一個 Service 來管理一組 Pod 暴露相關(guān)的服務(wù),如果要對外暴露服務(wù)的話,只需要定義相應(yīng)的端口即可(NodePort模式),但每增加一個服務(wù),就需要定義了一個 Service 對象并暴露服務(wù)的話就需要配置很多端口,不僅后續(xù)維護起來就會變的很復(fù)雜,而且會存在一定的安全性隱患,所以 Kubernetes 中還使用了 Ingress 的機制,比如使用 Nginx 綁定一個固定端口 80,后續(xù)的請求通過轉(zhuǎn)發(fā)到 Service 即可。這樣如果每次新增服務(wù)的話,只需要修改 Ingress 資源對象即可。具體配置見如下示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
tls:
- hosts:
- cafe.example.com
secretName: cafe-secret
rules:
- host: cafe.example.com
http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 802、Ingress-nginx 安裝
其安裝非常簡單,執(zhí)行一條命令即可,具體可以參考:
https://github.com/kubernetes/ingress-nginx/blob/nginx-0.28.0/docs/deploy/index.md
因為鏡像需要外網(wǎng)下載,可能會出現(xiàn)鏡像下載失敗的問題,可以通過在daemon.json 中添加如下代理完成鏡像下載。
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"http://f1361db2.m.daocloud.io"
]
}3、前后端分離項目使用示例
生產(chǎn)環(huán)境高可用 Kubernetes 部署架構(gòu),如下圖所示; LB 可以通過 nginx 實現(xiàn),也可以通過 HA + keepalive 實現(xiàn),具體請根據(jù)使用場景選擇,Ingress 統(tǒng)一集中集群中的 Service 對外提供服務(wù)。當(dāng)然我們也可以直接使用 Ingress 對外提供服務(wù)。

毋庸置疑,動態(tài)服務(wù)部署在 Kubernetes 集群中,但靜態(tài)頁面卻有多種選擇,可以放在 Ingress 中實現(xiàn)動態(tài)調(diào)度和灰度發(fā)布,也可以放在 LB、甚至 CDN 上提高靜態(tài)文件加載速度,提升用戶體驗。放在 LB 上,用法和原生使用一樣,這里不在過多介紹。下面主要介紹如何放在 Ingress 上實現(xiàn)動靜分離和反向代理。
3.1、鏡像制作
靜態(tài)頁面放到 nginx 某個目錄下面,通過 nginx 實現(xiàn)靜態(tài)頁面的訪問功能。具體 dockerfile 如下所示:
From docker.harbou.com/base/nginx:1.6.2
MAINTAINER <slj@qq.com>
ADD web.tar.gz /home/web/
ADD nginx.conf /usr/nginx/conf/http_vhost/
3.2、前端k8s yaml 文件編寫
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: docker.habour.com/base/web:2020
ports:
- containerPort: 80
volumeMounts:
- mountPath: /etc/localtime
name: date-conf
- mountPath: /usr/nginx/logs/
name: nginx-vol-logs
volumes:
- name: date-conf
hostPath:
path: /etc/localtime
- name: nginx-vol-logs
hostPath:
path: /home/logs/nginx/
---
apiVersion: v1
kind: Service
metadata:
name: web
labels:
app: web
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: web3.3、后端k8s yaml 文件編寫
后端 yaml 文件這里不是重點,為了不影響閱讀,省略不必要的部分。
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
selector:
matchLabels:
app: cluster
replicas: 2
template:
metadata:
labels:
app: cluster
spec:
initContainers:
..........
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat-service
spec:
ports:
- name: http
port: 80
targetPort: 8080
selector:
app: cluster3.4、Ingress-nginx yaml 文件編寫
因為 Ingress 核心是基于 nginx 實現(xiàn),所以你可以直接在 Ingress 資源對象中寫 nginx 配置,如果需要增加或者實現(xiàn) nginx 中的功能可以通過添加 annotations 實現(xiàn),具體可以參考:
https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: http-test
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
tls:
- hosts:
- docker.test.com
secretName: tls-secret
rules:
- host: docker.test.com
http:
paths:
- path: /soaw/(.*\.(html|htm|js|css|ico|png|jpg|gif|ipa|apk|eot|svg|ttf|woff|woff2))$
backend:
serviceName: web
servicePort: 80
- path: /soaw
backend:
serviceName: tomcat-service
servicePort: 80通過如上的配置可以實現(xiàn),前端頁面路由到 nginx 中,而動態(tài)服務(wù)路由到后端動態(tài) svc 中,從而實現(xiàn)動靜分離,注意如下配置是重點。
nginx.ingress.kubernetes.io/use-regex: "true"
4、總結(jié)
本文主要講解了兩個知識點:
第一 、Ingress 這個概念在 Kubernetes 中到底是怎樣一種存在,正如本文所介紹的,Ingress 實際上就是對 Kubernetes 反向代理的一種抽象,Ingress 工作在七層,Service 工作在四層,所以如果你想在 Kubernetes 集群中完成 Http 相關(guān)的操作時,都必須借助類似 ingress 資源對象來完成。
第二、如何通過 Ingress 完成動靜分離,這一部分可能不同的人看到都會有不同的疑問,eg 我的靜態(tài)頁面一直都沒有分離,跟我的動態(tài)服務(wù)放在一起(tomcat webapps 文件夾)。這種情況下,沒有特殊需求的話,暫時可以不用考慮 ingress 動靜分離,只需要提供一個后端 svc 即可。本文說的主要是針對前后端分離的項目;如果你的前端靜態(tài)頁面不涉及到灰度發(fā)布的功能,可以放在最前端 CDN 上,提升用戶體驗;如果需要考慮灰度發(fā)布的功能,建議把靜態(tài)頁面打成鏡像,通過 nginx pod 實現(xiàn)靜態(tài)頁面訪問功能;因為 Kubernetes 調(diào)度不是人為能夠預(yù)想到的,所以不建議使用靜態(tài)頁面掛載。可能你會說,我可以通過文件共享,比如 ceph、nfs等,把靜態(tài)頁面放在共享存儲中訪問,如果動態(tài)共享存儲出現(xiàn)問題,那么將帶來一系列的問題,而通過使用 deployment 管理靜態(tài)頁面,出現(xiàn)問題后,Kubernetes 能夠進行有效監(jiān)控和故障轉(zhuǎn)移,在一定程度上降低出錯幾率。當(dāng)然仁者見仁智者見智,具體還要根據(jù)使用場景進行評估和選擇。
感謝你能夠認真閱讀完這篇文章,希望小編分享使用ingress-nginx進行前后端分離的示例內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,詳細的解決方法等著你來學(xué)習(xí)!
當(dāng)前題目:使用ingress-nginx進行前后端分離的示例-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://chinadenli.net/article10/cdosdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、建站公司、做網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容