一.kubernetes集群外部訪問的方式
在kubernetes集群中,如果外部的應用需要訪問集群內部的服務,可以通過NodePort Service、LoadBalancer Service、Ingress來實現。
- NodePort Service
這里實際在集群的每個節點上都暴露一個端口,然后將這個端口映射到某個具體的Service來實現。端口范圍限制(0~65535),但是由於安全(kubernetes集群默認關閉防火牆)和易用性方面來看,存在一定的風險。只能適用小規模服務的集群。 - LoadBalancer Service
適用於雲平台,有局限性。 - Ingress
在kubernetes集群中,Service和Pod的IP僅在集群內部訪問,如果外部應用需要訪問集群內的服務,集群外部請求轉發到service在節點上暴露的NodePort上,然后由kube-proxy組件將其轉發給相關的Pod。而Ingress就是為集群集群的請求提供路由規則的集合,簡單來講就是提供外部訪問集群的入口,將外部的HTTP或HTTPS請求轉發到集群內部的Service上。
二.Ingress具體介紹
- Service是后端真實服務的抽象,一個Service可以負載多個相同的后端服務。
- Ingress是反向代理規則,用於規定HTTP或HTTPS請求應該被轉發到哪個Service上,例如可以根據請求中配置的不同Host和Url路徑讓請求負載到不同的Service上。
- Ingress Controller就是一個反向代理程序,它負責解析Ingress的反向代理規則,如果Ingress有增刪改的變動,所有的Ingress Controller都會及時更新自己相應的轉發規則,當Ingress Controller收到請求后就會根據這些規則將請求轉發到對應的Service。
Ingress Controller收到請求,匹配Ingress轉發規則,匹配到了就轉發到后端Service,而Service可能代表的后端Pod有多個,選出一個轉發到那個Pod,最終由那個Pod處理請求。
三.Ingress-nginx組成
1)反向代理負載均衡器:通過接受並按照Ingress定義的規則進行轉發,常用的有nginx,haproxy,traefik等。
2)ingress-nginx-controller:監聽kube-apiserver,同居用戶編寫的ingress規則(用戶編寫的ingress的yaml文件),動態的去更改nginx服務的配置文件,並且reload重載使其生效,此過程是自動的。
3)ingress:將nginx的配置抽象成一個Ingress對象,當用戶每添加一個新的服務,只需要編寫一個新的yaml文件即可。
四.Ingress-nginx工具原理
1)ingress controller通過和kubernetes的api進行交互,動態的去感知集群中ingress的規則變化。
2)讀取ingress的規則,按照自定義的規則(規則就是寫的哪個域名對應的哪個service),生成一段nginx的配置。
3)配置寫入到nginx-ingress-controller的Pod里面。這個Ingress Controller的Pod里面運行着一個nginx服務,控制器會把生成的nginx配置寫入到/etc/nginx/nginx.conf文件中。
4)寫入配置后,會reload一下使配置生效,以此達到分配和動態更新的問題。
五.Ingress-nginx解決了哪些問題
1)動態配置服務
如果按照傳統方式,當新增加一個服務時,我們可能需要在流量入口加一個反向代理指向我們新的服務,而使用ingress,只需要配置好ingress,當服務啟動時,會自動注冊到ingress當中,不需要額外的操作。
2)減少不必要的端口暴露
kubernetes部署時,默認是關閉防火牆的,服務會以nodeport方式映射出去,這樣對於宿主機來說是非常的不安全的,而ingress可以避免這個問題,只需要將ingress自身服務映射出去,就可代理后端所有的服務,則后端服務不需要映射出去。