Ingress Controller 和之前所講的DaemonSet 、Deployment等不同端姚,Ingress Controller不是Controller Manager中的一部分溜族,他只是一個或一組獨立的Pod資源讹俊,他通常就是一個運行著有七層代理能力或調(diào)度能力的應(yīng)用,比如:NGINX煌抒、HAproxy仍劈、Traefik、Envoy
之前所講到的Service他的工作原理是基于iptables或ipvs的寡壮,iptables和ipvs是四層代理的贩疙,四層代理有個缺陷就是他只是工作在tcp/ip協(xié)議棧讹弯。
如果外部請求是HTTPS的請求,Service是無法調(diào)度的这溅。如果構(gòu)建在內(nèi)部的服務(wù)是HTTP闸婴,還希望用Service調(diào)度的話,那么證書和私鑰的配置問題就來了芍躏。
外部解析一般是基于域名解析,解析到的地址也是調(diào)度器的地址降狠,而sso會話是和后端服務(wù)器建立的連接对竣,那么就應(yīng)該在每一臺后端服務(wù)器都配置證書。
SSO既貴又慢榜配,如果我們認(rèn)為內(nèi)部網(wǎng)絡(luò)是安全的否纬,就可以在接入層就卸載SSO會話,外部使用HTTPS通信蛋褥,而內(nèi)部使用HTTP通信临燃。所以要換一種調(diào)度方式
在Kubernetes中采用一種獨特的方式實現(xiàn)。
在提供服務(wù)的pod之前再加一層烙心,后端pod就采用明文的HTTP膜廊,中間加的那層調(diào)度器Pod運行一個七層的應(yīng)用比如NGINX、HAproxy淫茵、Traefik爪瓜、Envoy當(dāng)用戶請求時,先到達(dá)這個獨特的調(diào)度器匙瘪,而不是直接到達(dá)后端的Pod铆铆,Pod和Pod之間由于是在同一網(wǎng)段可以直接通信,無需經(jīng)過Service丹喻。
這個Pod就叫做Ingress Controller薄货。假如我們有三個節(jié)點,那么可以使用DaemonSet在每個節(jié)點之上都部署一個Ingress Controller碍论,但是如果有3000個節(jié)點呢谅猾?
DaemonSet不止可在每個節(jié)點上部署一個Pod副本,還可以在指定的節(jié)點上部署一個Pod副本骑冗,那么我們就可以單獨拿出來幾個幾點作為ingress Controller的專用節(jié)點赊瞬,把專用節(jié)點打上污點,讓其他Pod都調(diào)度不上來贼涩,只有DaemonSet定義的ingress可以在此之上部署巧涧,并且能容忍污點。
試想一種場景:
當(dāng)Ingress Controller調(diào)度不止一個Web服務(wù)的時候遥倦,我可以采用基于主機(jī)名的Virtual Host或URL映射的方式谤绳,但是當(dāng)無狀態(tài)的后端被Kill或增加減少的時候占锯,Pod IP地址必然發(fā)生變化,這時候Ingress Controller是如何跟著做動態(tài)的變更呢缩筛?
答案是 Ingress Controller仍需要借助Service的Selector功能幫助分類消略,關(guān)聯(lián)著后端所有符合條件的Pod,當(dāng)上述情況發(fā)生時瞎抛,他會將變化反映至Ingress資源艺演,(注意Ingress資源和Ingress Controller是兩個概念。)再由Ingress資源把變化信息注入到Ingress Controller的配置文件中(非常方便)桐臊,進(jìn)而觸發(fā)Ingress Controller重載配置文件的動作胎撤。
具體搭建步驟
配置一個Ingress Controller
1 · 創(chuàng)建一個名稱空間
kubectl create namespace ingress-nginx
2 · 創(chuàng)建一個configmap (用于配置文件注入)
3 · 配置rbac用于創(chuàng)建集群角色,權(quán)限控制断凶,為Ingress Controller提供他到達(dá)不了的namespace的權(quán)限
4 · with-rbac
5 · tcp-service
以上配置文件都可以到GitHub中Kubernetes官方站點的Ingress-Nginx的deploy文件夾下獲取
如果GitHub下載太慢可以選擇需要的文件下載
下載好后
kubectl apply -f ./
直接指定目錄即可完成所有創(chuàng)建(前提要先創(chuàng)建namespace)
※※另一種簡便部署Ingress Controller的辦法
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
效果和以上是一樣的伤提,參考官網(wǎng)(需要翻墻)
https://kubernetes.github.io/ingress-nginx/
為確保Ingress Controller能夠接入外部流量第一種做法是為他添加一個類型為NodePort的Service,根據(jù)官網(wǎng)介紹 命令為
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
而另一種做法是將Ingress Controller與宿主機(jī)共享網(wǎng)絡(luò)名稱空間认烁,并且要確保宿主機(jī)的80和443端口沒有被占用肿男,因為Ingress Controller要監(jiān)聽這兩個端口。
由于官方給的配置文件端口是隨機(jī)的却嗡,建議下載下來手動指定端口30080和30443
此時在外部節(jié)點訪問NodeIp:30080應(yīng)該可以顯示404回顯舶沛, 代表Ingress Controller已經(jīng)配通,顯示default backend 404
是因為后端的規(guī)則還沒有寫窗价,接下來開始配置Ingress冠王。
創(chuàng)建 Ingress
創(chuàng)建之前應(yīng)先創(chuàng)建后端被調(diào)度的Pod及Service
把剛剛創(chuàng)建好的myapp通過Ingress發(fā)布出去,注意apiVersion比較獨特舌镶。
創(chuàng)建好之后柱彻,便將生成好的配置文件立即注入到Ingress Controller中了
進(jìn)入到Ingress Controller 中查看
nginx.conf
在從外部訪問之前要做好域名解析映射
vim /etc/hosts
訪問效果: ↓
拓展
在此Ingress Controller上我們嘗試再調(diào)度一個web,此次并且是HTTPS的Tomcat
首先部署三個Tomcat并配置一個Service
因為此次要做個通過HTTPS訪問的TOMCAT餐胀,所以我們要先做一個證書 哟楷,并且轉(zhuǎn)換成K8s能夠識別的格式
再做一個Ingress
應(yīng)用配置文件后返回到Ingress Controller看nginx.conf配置文件卖擅,已經(jīng)可以看到證書已被應(yīng)用惩阶。
訪問效果 : ↓