您好,登錄后才能下訂單哦!
本篇內容主要講解“k8s Ingress如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“k8s Ingress如何使用”吧!
在上一篇關于k8s之service的使用一篇中提到,Service對集群之外暴露服務的主要方式有兩種,NotePort和LoadBalancer,但這兩種方式,都有一定的缺點,具體來說:
NodePort 會占用很多集群機器的端口,當集群服務變多的時候,過多的端口會給k8s的運維人員帶來諸多的不便;
而LB的缺點是每個service需要一個LB,不僅浪費而且麻煩,并且需要kubernetes之外設備的支持;
基于這種現狀,k8s提供了Ingress這種資源對象,Ingress只需要一個NodePort或者一個LB就可以滿足暴露多個Service的需求。
Ingress 的工作機制可參考下圖進行理解;
實際上,Ingress相當于一個7層的負載均衡器,可以理解為kubernetes對反向代理的一個抽象,它的工作原理類似于Nginx;
或者可以理解為:在Ingress里建立了諸多的映射規則,Ingress Controller通過監聽這些配置規則并轉化成Nginx的反向代理配置 , 然后對外部提供服務;
關于Ingress,有下面兩個概念需要重點理解
ingress:kubernetes中的一個對象,作用是定義請求如何轉發到service的規則;
ingress controller:具體實現反向代理及負載均衡的程序,對ingress定義的規則進行解析,根據配置的規則來實現請求轉發,實現方式有很多,比如Nginx, Contour, Haproxy等;
類比Nginx來說,Ingress工作原理如下
編寫Ingress規則,說明哪個域名對應kubernetes集群中哪個Service;
Ingressnen控制器動態感知Ingress服務規則的變化,然后生成一段對應的Nginx反向代理配置;
Ingress控制器會將生成的Nginx配置寫入到一個運行著的Nginx服務中,并動態更新;
到此為止,不難發現,Ingress 其實真正在工作的時候就像是充當一個Nginx在使用,內部配置了用戶定義的請求轉發規則;
整個工作原理可以參照下圖進行理解
獲取ingress-nginx,本次案例使用的是0.30版本
在當前目錄下創建一個ingress-controller目錄
mkdir ingress-controller
進入目錄,下載兩個yaml文件,可以通過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 #如果仍然下載不下來,也可以考慮下載碼云上的 wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
或者進入github直接手動復制配置內容到本地的yaml文件中
mandatory.yaml service-nodeport.yaml
注意,下載下來之后, 修改mandatory.yaml文件中的倉庫,否則拉取不到
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 ./
執行完成后,可以看到創建了很多東西
執行完成后,查看Pod和Service,可以看到下面這兩個信息,一個Pod(nginx-ingress-controller),一個Service(NodePort);
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
按照下圖所示,我們將部署兩組Pod,一組為nginx,一組為tomcat
配置內容如下
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
使用下面的命令執行Pod的創建
kubectl create -f tomcat-nginx.yaml
創建成功后,可以檢查下Pod的狀況,可以看到3個nginx,3個tomcat對應的Pod成功創建和運行起來了;
此時,再查看service,可以看到nginx和tomcat對應的兩個service;
到這里,我們就按照部署圖中的模型準備完成,接下來就需要通過Ingress相關的配置登場了;
在當前目錄下,創建ingress-http.yaml,配置內容如下:
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
使用下面的命令創建并查看
kubectl create -f ingress-http.yaml
kubectl get ing ingress-http -n default
或
kubectl describe ing ingress-http -n default
也可以通過describe查看Ingress配置規則的詳細信息;
該規則解釋來說就是:
當訪問: nginx.congge.com的時候,將由nginx-service處理,其背后處理的Pod分別為括號內分配的IP:地址對應的服務;
當訪問:tomcat ... ,也是如此理解
首先,我們查看下上面通過Ingres-controller創建時的service信息,下圖可以看到,這里有一個NodePort類型的service,分配的對外端口是30337;
所以,外網訪問的完整地址是,前提是當前的這個域名要能正確使用;
http://nginx.congge.com:32599
http://tomcat.congge.com:30337
https的配置和http配置文件差不多,只是在使用https這種方式下,需要提前創建好響應的證書;
創建證書
# 生成證書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"# 創建密鑰kubectl create secret tls tls-secret --key tls.key --cert tls.crt
在當前目錄下創建ingress-https.yaml配置文件,配置內容如下:
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
使用下面的命令創建
kubectl create -f ingress-https.yaml
或者通過describe命令查看下相關的配置規則,與上面http不同的是,這里會多出一個TLS,可以看到,這個TLS所要保護的域名,正是上面配置的那兩個域名;
在通過外網訪問之前,我們再次查看下對外暴露的端口號,由于是https,所以應該訪問的是32559;
再次訪問時,地址如下
https://nginx.congge.com:32599
https://tomcat.congge.com:30337
到此,相信大家對“k8s Ingress如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。