1. 程式人生 > >kubernetes nginx ingress 使用記錄

kubernetes nginx ingress 使用記錄

uber doc 修改 tro aml 需要 端口 end 直接

前言

ingress是一種可以暴露k8s集群內部service的方式,用戶編輯配置文件定義一個ingress資源即可實現外部網絡訪問內網service。
ingress controller是來管理所有的Ingress的對象,ingress controller內部其實是一個nginx的容器,當ingress controll 通過與 Kubernetes API 交互,感知集群中Ingress規則變化時會按照模板文件生成nginx.conf文件,然後reload該配置文件。
相對於kubernetes通過nodePort方式暴露服務來說,可以提供更加高級的特性,尤其對於HTTP服務來說,他可以實現負載均衡,SSL,虛擬主機等,並且ingress是直接將數據包轉發至pod,不會在經過kube-proxy,相對來說更加高效。

搭建環境

用戶可以參照官方文檔Deployment 進行環境搭建。

  • 首先得設置一個default-backend service。 如果未匹配到所有的Ingress對象,則會將所有的請求都轉發至這個默認的ingress對象,在這裏可以返回一些錯誤信息等;
  • 然後是設置集群的RBAC,由於ingress controller要訪問api server,所以需要給他配置資源訪問權限;
  • 安裝ingress controller, 一般是以DaemonSet形式在每個node上創建一個資源,然後以hostNetwork的方式開放一個端口
  • 最後就是創建想要暴露的服務的ingress對象

經過上面的幾步就可以在集群外訪問該service了, 但是訪問的時候註意ingress controller內部其實是一個nginx服務器,它也是通過配置文件中的虛擬主機server_name來分辨該轉發到後端哪個service上的,對於http請求必須在請求的header中加上Host字段,所以如果沒有配置DNS域名解析,在瀏覽器裏訪問時可以修改/etc/hosts文件,也可以用curl -H "Host: xxxxx.com" nodeIp來實現。
對於需要自定義default-backend的同學可以根據Custom errors 自定義後端的實現,

ingress controller reload

上面講到當我們創建ingress的時候,Ingress controller會進行relaod,這期間nginx需要替換nginx worker進程, 這將導致服務出現短暫的異常。使用Jmeter進行分布式壓測一個服務中,觀察到的情況是qps無影響,但是會出現0.01%的錯誤返回結果,在一些小並發的情況下這可以接收,但是如果是高並發的場景,並且後端服務的service ingress對象較多,此時reload的也會比較頻繁,對於一些服務是無法接受的。
有一個解決方式就是在集群裏裏定義多個Ingress controller對象,然後根據ingress的情況分別註冊到不同的ingress controller之上,這樣就可以實現分組的概念,一個組裏添加ingress不會導致另一個組進行reload, 使用時需要在ingress controller 的yaml定義文件中指定--ingress-class選項,然後在Ingress 的yaml 定義文件中添加 annotation : kubernetes.io/ingress.class 關聯對應的controll class。
註意如果是在同一臺主機之上啟動多個ingress controller則需要改變默認配置的端口號,否則會發生端口沖突,需要在鏡像的啟動參數中添加 --http-port,--https-port, --status-port, --healthz-port這幾個選項來改變端口。

nginx ingress的配置

nginx是個功能強大的負載均衡,反向代理服務器,如果僅僅通過默認的模板生成的nginx.conf文件可能不能滿足我們的需求,並且可能存在坑,所以需要自定義配置的話可以通過三種方式實現:

  • 通過configMap,具體參見NGINX Ingress controller configuration ConfigMap,他是全局的設置,直接配置nginx.conf的生成,影響管理的全部Ingress,但是需要指定-configmap=$(POD_NAMESPACE)/nginx-configuration選項;
  • 通過Annotations是對單獨的某個service的ingress進行配置;
  • 高級玩家是直接自定義template來控制nginx controll 生成nginx.conf文件

nginx ingress的四層代理

nginx支持四層代理,引用到ingress中也同樣支持,表現形式與nodePort差不多,都需要在主機上開放一個端口,但是支持一些Nginx的功能,感覺比較雞肋,參見Exposing TCP and UDP services, 實現方式是通過一個configMap 來指定主機端口和內網service的對應關系。

kubernetes nginx ingress 使用記錄