全部產品
Search
文件中心

:建立Nginx Ingress

更新時間:Nov 16, 2024

Ingress是Kubernetes中的一個資來源物件,用來管理叢集外部存取叢集內部服務的方式。您可以通過Ingress資源來配置不同的轉寄規則,從而根據轉寄規則訪問叢集內Pod。本文介紹如何通過控制台和kubectl方式建立、查看、更新和刪除Nginx Ingress。

前提條件

已建立Kubernetes叢集。具體操作,請參見建立ACK託管叢集

注意事項

在您使用Nginx Ingress Controller時,請遵循以下注意事項。

  • 使用組件時,請通過組件管理的方式或者OpenAPI的方式配置組件的自訂參數。通過其他渠道修改組件配置可能會導致組件功能異常,且會影響組件後續的升級過程。

  • 請勿刪除Nginx Ingress Controller預設使用的Service(kube-system/nginx-ingress-lb)。將其刪除將會導致組件運行不穩定,嚴重時出現崩潰。

  • 請優先考慮使用相關註解或者設定項來實現所需功能,不建議您使用Snippet或Lua代碼等方式對組件進行額外配置。對於您使用Snippet等方式配置所出現的與預期功能不符等問題,將無法給予有效支援。

  • 受上遊社區版組件影響,Nginx Ingress Controller可能存在Bug或漏洞,請注意及時升級組件,以避免開源組件Bug或漏洞導致您的業務受損。

  • 在高負載情景下,推薦您使用獨立部署的方式將Nginx Ingress Controller部署在單獨的Node上。詳情請參見部署高可靠的Nginx Ingress Controller

  • 關於更多使用Nginx Ingress Controller的建議,請參見Nginx

操作步驟

方式一:控制台操作步驟

建立Nginx Ingress

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇網路 > 路由

  3. 路由頁面,單擊建立 Ingress,在建立 Ingress對話方塊配置路由。

    配置項

    說明

    樣本值

    網關類型

    可按需選擇ALB IngressMSE IngressNginx Ingress三種網關類型。

    關於三種網關的差異,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比

    Nginx Ingress

    名稱

    自訂路由名稱。

    nginx-ingress

    Ingress Class

    自訂Ingress的類。

    nginx

    規則

    單擊+ 添加規則可新增多個路由規則。

    • 網域名稱:自訂網域名。

    • 路徑映射:配置如下配置項。

      • 路徑:指定服務訪問的URL路徑。本例中不做配置,保留根路徑/

      • 匹配規則:支援首碼匹配(Prefix)完整匹配(Exact)預設(ImplementationSpecific)

      • 服務名稱:選擇目標服務,即K8s內的Service。

      • 連接埠:選擇服務需要暴露的連接埠。

    • Ingress支援同一個網域名稱下配置多條路徑。單擊+ 添加路徑新增路徑。

    • 網域名稱:test.example.com

    • 路徑映射

      • 路徑:/

      • 匹配規則:預設(ImplementationSpecific)

      • 服務名稱:nginx-ingress-lb

      • 連接埠:80

    TLS配置

    開啟TLS配置開關,配置安全的路由服務。

    • 網域名稱:自訂網域名。

    • 保密字典:根據需要選擇對應的保密字典。

      如果您需要建立Secret,請執行如下操作。

      1. 保密字典右側,單擊建立

      2. 建立 Secret對話方塊,自訂保密字典的名稱CertKey,然後單擊確定

      3. 保密字典的下拉框,選擇已建立的Secret。

    單擊+ 新增TLS配置,可配置多條TLS。

    Ingress的更多用法,請參見Ingress支援

    開啟TLS配置。

    • 網域名稱:test.example.com

    • 保密字典:cert

    更多配置

    • 灰階發布:開啟灰階發布開關。灰階規則可按照要求標頭、Cookie 、權重三個維度進行設定。

      說明

      要求標頭、Cookie 、權重可以只設定一種,若同時設定生效規則按要求標頭、Cookie、權重順序匹配。

      • 按要求標頭:基於Request Header的流量切分,設定後會添加註解nginx.ingress.kubernetes.io/canary-by-headernginx.ingress.kubernetes.io/canary-by-header-valuenginx.ingress.kubernetes.io/canary-by-header-pattern

      • 按Cookie:基於Cookie的流量切分,設定後會添加註解nginx.ingress.kubernetes.io/canary-by-cookie

      • 按權重:佈建要求到指定服務的百分比(值為0~100的整數),設定後會添加註解nginx.ingress.kubernetes.io/canary-weight

    • 協議:指定後端服務的協議,設定後會添加註解nginx.ingress.kubernetes.io/backend-protocol

      支援HTTP、HTTPS、gRPC、gRPCS四種服務合約。

    • 重寫路徑:將用戶端請求中的路徑重寫後發送到後端服務,設定後會添加註解 nginx.ingress.kubernetes.io/rewrite-target

    開啟灰階發布。

    • 生效規則選擇按要求標頭

      • 要求標頭名稱:foo

      • 匹配規則按值匹配

      • 匹配值:bar

    • 協議:GRPC

    • 重寫路徑:設定為空白

    註解

    您可自訂註解名稱和值,也可根據名稱選擇或搜尋要配置的註解。Ingress的註解請參見Annotations

    單擊+添加註解,可對Ingress無上限地添加註解。

    • 名稱:nginx.ingress.kubernetes.io/proxy-body-size

    • :10m

    標籤

    標籤的作用是為Ingress添加對應的標籤,標示該Ingress的特點。

    單擊+添加標籤,可對Ingress無上限地添加標籤。

    • 名稱:foo

    • :bar

  4. 配置成功後,單擊確定

    路由頁面,可以查看路由已成功建立。

相關操作

您可以在路由頁面,單擊目標路由操作列的更新YAML編輯監控,以及更多中的刪除,完成刪、改、查相關操作。

方式二:kubectl操作步驟

建立Nginx Ingress

  1. 建立Deployment和Service。

    在建立Ingress資源之前,必須建立外部存取Kubernetes叢集中的服務。

    1. 使用以下內容,建立test-deployment-service.yaml

      以下YAML檔案中包含了一個名為test-web1的Deployment和一個名為web1-service的Service。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: test-web1
        labels:
          app: test-web1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: test-web1
        template:
          metadata:
            labels:
              app: test-web1
          spec:
            containers:
            - name: test-web1
              imagePullPolicy: IfNotPresent
              image: registry.cn-hangzhou.aliyuncs.com/yilong/ingress-test:web1
              ports:
              - containerPort: 8080
      --- 
      apiVersion: v1
      kind: Service
      metadata:
        name: web1-service
      spec:
        type: ClusterIP
        selector:
          app: test-web1
        ports:
          - port: 8080
            targetPort: 8080
    2. 執行以下命令,建立Deployment和Service。

      kubectl apply -f test-deployment-service.yaml
  2. 建立Ingress。

    1. 使用以下內容,建立test-ingress.yaml

      1.19版本之前叢集

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: test-ingress
        namespace: default
      spec:
        rules:
        - host: test-ingress.com
          http:
            paths:
            - path: /foo
              backend:
                serviceName: web1-service
                servicePort: 8080
            - path: /bar
              backend:
                serviceName: web1-service
                servicePort: 8080

      1.19及之後版本叢集

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: test-ingress
        namespace: default
      spec:
        rules:
        - host: test-ingress.com
          http:
            paths:
            - path: /foo
              backend:
                service: 
                  name: web1-service
                  port:
                    number: 8080
              pathType: ImplementationSpecific
            - path: /bar
              backend:
                service: 
                  name: web1-service
                  port:
                    number: 8080
              pathType: ImplementationSpecific
      • name:Ingress的名稱,本例為test-ingress。

      • host:指定服務訪問網域名稱。

      • path:指定訪問的URL路徑。SLB將流量轉寄到backend之前,所有的入站請求都要先匹配hostpath

      • backend:由服務名稱和服務連接埠組成。

        • 服務名稱:Ingress轉寄的backend服務名稱。

        • 服務連接埠:服務暴露的連接埠。

    2. 執行以下命令,建立Ingress。

      kubectl apply -f test-ingress.yaml

查看Nginx Ingress

執行以下命令,查看Ingress。

kubectl get ingress

更新Nginx Ingress

執行以下命令,更新Ingress。

kubectl edit ingress <ingress名稱>

刪除Nginx Ingress

執行以下命令,刪除Ingress。

kubectl delete ingress <ingress名稱>