kubernetes nginx ingress 使用記錄

前言

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

搭建環境

用戶能夠參照官方文檔Deployment 進行環境搭建。nginx

  • 首先得設置一個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 自定義後端的實現,git

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這幾個選項來改變端口。github

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的對應關係。api

2019/6/26 update: ingress controller支持四層,可是不太友好,經過一個configmap進行配置。一樣存在reload ingress的時候會斷開全部的鏈接,對於長鏈接來講彷佛難以接受。瀏覽器

相關文章
相關標籤/搜索