1. 程式人生 > 實用技巧 >ingress對外暴露應用

ingress對外暴露應用

一.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; 
    }

}