您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“k8s Ingress如何使用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“k8s Ingress如何使用”吧!
在上一篇關(guān)于k8s之service的使用一篇中提到,Service對(duì)集群之外暴露服務(wù)的主要方式有兩種,NotePort和LoadBalancer,但這兩種方式,都有一定的缺點(diǎn),具體來(lái)說(shuō):
NodePort 會(huì)占用很多集群機(jī)器的端口,當(dāng)集群服務(wù)變多的時(shí)候,過(guò)多的端口會(huì)給k8s的運(yùn)維人員帶來(lái)諸多的不便;
而LB的缺點(diǎn)是每個(gè)service需要一個(gè)LB,不僅浪費(fèi)而且麻煩,并且需要kubernetes之外設(shè)備的支持;
基于這種現(xiàn)狀,k8s提供了Ingress這種資源對(duì)象,Ingress只需要一個(gè)NodePort或者一個(gè)LB就可以滿足暴露多個(gè)Service的需求。
Ingress 的工作機(jī)制可參考下圖進(jìn)行理解;
實(shí)際上,Ingress相當(dāng)于一個(gè)7層的負(fù)載均衡器,可以理解為kubernetes對(duì)反向代理的一個(gè)抽象,它的工作原理類似于Nginx;
或者可以理解為:在Ingress里建立了諸多的映射規(guī)則,Ingress Controller通過(guò)監(jiān)聽(tīng)這些配置規(guī)則并轉(zhuǎn)化成Nginx的反向代理配置 , 然后對(duì)外部提供服務(wù);
關(guān)于Ingress,有下面兩個(gè)概念需要重點(diǎn)理解
ingress:kubernetes中的一個(gè)對(duì)象,作用是定義請(qǐng)求如何轉(zhuǎn)發(fā)到service的規(guī)則;
ingress controller:具體實(shí)現(xiàn)反向代理及負(fù)載均衡的程序,對(duì)ingress定義的規(guī)則進(jìn)行解析,根據(jù)配置的規(guī)則來(lái)實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā),實(shí)現(xiàn)方式有很多,比如Nginx, Contour, Haproxy等;
類比Nginx來(lái)說(shuō),Ingress工作原理如下
編寫(xiě)Ingress規(guī)則,說(shuō)明哪個(gè)域名對(duì)應(yīng)kubernetes集群中哪個(gè)Service;
Ingressnen控制器動(dòng)態(tài)感知Ingress服務(wù)規(guī)則的變化,然后生成一段對(duì)應(yīng)的Nginx反向代理配置;
Ingress控制器會(huì)將生成的Nginx配置寫(xiě)入到一個(gè)運(yùn)行著的Nginx服務(wù)中,并動(dòng)態(tài)更新;
到此為止,不難發(fā)現(xiàn),Ingress 其實(shí)真正在工作的時(shí)候就像是充當(dāng)一個(gè)Nginx在使用,內(nèi)部配置了用戶定義的請(qǐng)求轉(zhuǎn)發(fā)規(guī)則;
整個(gè)工作原理可以參照下圖進(jìn)行理解
獲取ingress-nginx,本次案例使用的是0.30版本
在當(dāng)前目錄下創(chuàng)建一個(gè)ingress-controller目錄
mkdir ingress-controller
進(jìn)入目錄,下載兩個(gè)yaml文件,可以通過(guò)wget的方式
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml #如果仍然下載不下來(lái),也可以考慮下載碼云上的 wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
或者進(jìn)入github直接手動(dòng)復(fù)制配置內(nèi)容到本地的yaml文件中
mandatory.yaml service-nodeport.yaml
注意,下載下來(lái)之后, 修改mandatory.yaml文件中的倉(cāng)庫(kù),否則拉取不到
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
替換為
quay-mirror.qiniu.com/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
kubectl apply -f ./
執(zhí)行完成后,可以看到創(chuàng)建了很多東西
執(zhí)行完成后,查看Pod和Service,可以看到下面這兩個(gè)信息,一個(gè)Pod(nginx-ingress-controller),一個(gè)Service(NodePort);
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
按照下圖所示,我們將部署兩組Pod,一組為nginx,一組為tomcat
配置內(nèi)容如下
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: default spec: replicas: 3 selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deployment namespace: default spec: replicas: 3 selector: matchLabels: app: tomcat-pod template: metadata: labels: app: tomcat-pod spec: containers: - name: tomcat image: tomcat:8.5-jre10-slim ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: nginx-service namespace: default spec: selector: app: nginx-pod clusterIP: None type: ClusterIP ports: - port: 80 targetPort: 80 --- apiVersion: v1 kind: Service metadata: name: tomcat-service namespace: default spec: selector: app: tomcat-pod clusterIP: None type: ClusterIP ports: - port: 8080 targetPort: 8080
使用下面的命令執(zhí)行Pod的創(chuàng)建
kubectl create -f tomcat-nginx.yaml
創(chuàng)建成功后,可以檢查下Pod的狀況,可以看到3個(gè)nginx,3個(gè)tomcat對(duì)應(yīng)的Pod成功創(chuàng)建和運(yùn)行起來(lái)了;
此時(shí),再查看service,可以看到nginx和tomcat對(duì)應(yīng)的兩個(gè)service;
到這里,我們就按照部署圖中的模型準(zhǔn)備完成,接下來(lái)就需要通過(guò)Ingress相關(guān)的配置登場(chǎng)了;
在當(dāng)前目錄下,創(chuàng)建ingress-http.yaml,配置內(nèi)容如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-http namespace: default spec: rules: - host: nginx.congge.com http: paths: - path: / backend: serviceName: nginx-service servicePort: 80 - host: tomcat.congge.com http: paths: - path: / backend: serviceName: tomcat-service servicePort: 8080
使用下面的命令創(chuàng)建并查看
kubectl create -f ingress-http.yaml
kubectl get ing ingress-http -n default
或
kubectl describe ing ingress-http -n default
也可以通過(guò)describe查看Ingress配置規(guī)則的詳細(xì)信息;
該規(guī)則解釋來(lái)說(shuō)就是:
當(dāng)訪問(wèn): nginx.congge.com的時(shí)候,將由nginx-service處理,其背后處理的Pod分別為括號(hào)內(nèi)分配的IP:地址對(duì)應(yīng)的服務(wù);
當(dāng)訪問(wèn):tomcat ... ,也是如此理解
首先,我們查看下上面通過(guò)Ingres-controller創(chuàng)建時(shí)的service信息,下圖可以看到,這里有一個(gè)NodePort類型的service,分配的對(duì)外端口是30337;
所以,外網(wǎng)訪問(wèn)的完整地址是,前提是當(dāng)前的這個(gè)域名要能正確使用;
http://nginx.congge.com:32599
http://tomcat.congge.com:30337
https的配置和http配置文件差不多,只是在使用https這種方式下,需要提前創(chuàng)建好響應(yīng)的證書(shū);
創(chuàng)建證書(shū)
# 生成證書(shū)openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=congge.com"# 創(chuàng)建密鑰kubectl create secret tls tls-secret --key tls.key --cert tls.crt
在當(dāng)前目錄下創(chuàng)建ingress-https.yaml配置文件,配置內(nèi)容如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-https namespace: default spec: tls: - hosts: - nginx.congge.com - tomcat.congge.com secretName: tls-secret # 指定秘鑰 rules: - host: nginx.congge.com http: paths: - path: / backend: serviceName: nginx-service servicePort: 80 - host: tomcat.congge.com http: paths: - path: / backend: serviceName: tomcat-service servicePort: 8080
使用下面的命令創(chuàng)建
kubectl create -f ingress-https.yaml
或者通過(guò)describe命令查看下相關(guān)的配置規(guī)則,與上面http不同的是,這里會(huì)多出一個(gè)TLS,可以看到,這個(gè)TLS所要保護(hù)的域名,正是上面配置的那兩個(gè)域名;
在通過(guò)外網(wǎng)訪問(wèn)之前,我們?cè)俅尾榭聪聦?duì)外暴露的端口號(hào),由于是https,所以應(yīng)該訪問(wèn)的是32559;
再次訪問(wèn)時(shí),地址如下
https://nginx.congge.com:32599
https://tomcat.congge.com:30337
到此,相信大家對(duì)“k8s Ingress如何使用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。