ingress對外暴露應用
阿新 • • 發佈:2020-12-02
一.ingress是什麼
背景: NodePort存在的不足,測試環境用用還行,當有成百上千上萬個服務在叢集總執行時,埠管理將是災難: 埠有限,一個埠只能一個服務使用,需要提前規劃 只支援4層負載均衡(ipvs和iptables) ClusterIp只能叢集內部訪問 LoadBalance方式受限於雲平臺支,且通常在雲平臺部署ELB還需要額外的費用 Ingress可以簡單理解為service的service。它通過獨立的Ingress物件來制定轉發規則,把客戶端請求轉發到一個或多個service中,這樣就把請求與服務解耦了,可以從業務維度統一考慮業務的暴露,而不用為每個service單獨考慮
Ingress物件:
指的是k8s中的一個api物件,一般用yaml配置。作用是定義請求如何轉發service的規則。可以理解為配置模板
Ingress Controller:
具體實現反向代理的及負載均衡的程式,對ingress定義的規則進行解析,根據配置的規則把請求轉發到對應的service上
市面上大多數廠商都提供了ingress controller,具體參考官方說明https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
二.部署IngressController
Ingress Controller有很多實現,我們這裡採用官方維護的Nginx控制器 專案地址:https://github.com/kubernetes/ingress-nginx 部署:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
注意:
ingress controller的映象倉庫在國外:quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0,國內訪問不穩定
ingress預設沒配置暴露:一般使用宿主機網路(hostNetwork: true)或者使用NodePort
hostNetwork: true
containers:
- name: nginx-ingress-controller
三、使用ingress-nginx暴露一個service
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web1 namespace: web # 注意此處配置:service和ingress必須在同一個namespace spec: rules: - host: web1.k8s.com # 前端請求域名 http: paths:- path: / # 訪問的路徑 pathType: Prefix # 路徑型別 匹配/所有的路徑 backend: # 後端service service: name: web1 # service-name port: number: 8080 # service-port 即service裡配置的port的引數
以上配置類似nginx裡配置如下
server { listen 80; server_name web1.k8s.com; location / { root ; proxy_pass http://ClusterIP(此處是service的name):8080; } }