入口
NCP 將針對含 TLS 規格的入口和不含 TLS 規格的入口,分別建立一個第 7 層負載平衡器。您也可以建立 CRD (CustomResourceDefinitions) 來處理入口調整。
請注意下列事項:
- 所有入口將取得單一 IP 位址。
- 會從ncp.ini的[nsx_v3]區段中的external_ip_pools選項所指定的外部 IP 集區,為入口資源配置 IP 位址。負載平衡器將在此 IP 位址及 HTTP 和 HTTPS 連接埠 (80 和 443) 上公開。
- 會從ncp.ini的[nsx_v3]區段中的external_ip_pools_lb選項所指定的外部 IP 集區,為入口資源配置 IP 位址。如果external_ip_pools_lb選項不存在,則會使用external_ip_pools所指定的集區。負載平衡器將在此 IP 位址及 HTTP 和 HTTPS 連接埠 (80 和 443) 上公開。
- 您可以透過變更組態並重新啟動 NCP,變更為不同的 IP 集區。
- 您可以指定 TLS 的預設憑證。如需產生憑證並將憑證掛接到 NCP 網繭中的相關資訊,請參閱以下內容。
- 不含 TLS 規格的入口將主控於 HTTP 虛擬伺服器 (連接埠 80) 之上。
- 含 TLS 規格的入口將主控於 HTTPS 虛擬伺服器 (連接埠 443) 之上。負載平衡器將充當 SSL 伺服器,並且會終止用戶端 SSL 連線。
- 支援透過新增或移除 TLS 區段來修改入口。從入口規格中移除tls金鑰時,入口規則將從 HTTPS 虛擬伺服器 (連接埠 443) 傳輸至 HTTP 虛擬伺服器 (連接埠 80)。同樣地,將tls金鑰新增至入口規格時,入口規則將從 HTTP 虛擬伺服器 (連接埠 80) 傳輸至 HTTPS 虛擬伺服器 (連接埠 443)。
- 如果單一叢集的入口定義中有重複規則,則僅套用第一個規則。具有重複規則的其他入口將註解上相關的錯誤。例如,如果您建立具有相同host和path的兩個入口,其中一個入口為 TLS,而另一個入口為非 TLS,並且kubernetes.io/ingress.allow-http為false,則這兩個規則將在不同的虛擬伺服器上建立,並且彼此不會衝突。但是,如果kubernetes.io/ingress.allow-http為true,則稍後套用的入口將會註解上相關的錯誤。如需詳細資訊,請參閱以下的「錯誤」小節。
- 每個叢集僅支援具有預設後端的單一入口。不符合任何入口規則的流量將會轉送至預設後端。
- 如果有多個入口具有預設後端,則僅設定第一個入口。其他入口將標註為錯誤。如需詳細資訊,請參閱以下的「錯誤」小節。
- (NCP 3.0.0 及 3.0.1) 規則會按下列順序套用:
- 同時指定host和path,且沒有規則運算式比對的規則。
- 同時指定host和path,且具有規則運算式比對的規則 (最長的入口path優先)。
- 指定host或path,且沒有規則運算式比對的規則。
- 指定host或path,且具有規則運算式比對的規則 (最長的入口path優先)。
- (NCP 3.0.2 及更新版本) 規則會按下列順序套用:
- 同時指定host和path的規則。
- 含有ExactpathType的規則。
- 含有PrefixpathType的規則。
- 含有RegexpathType的規則。
- 指定了host或path的規則。
- 含有ExactpathType的規則。
- 含有PrefixpathType的規則。
- 含有RegexpathType的規則。
附註:如果有多個路徑符合要求,系統會將優先順序指定給最長的相符路徑。關於pathType:- ImplementationSpecific會被視為與Exact相同。
- 具有不同pathType的兩個相符路徑可以並存。
- 對於Prefix類型,/foo將比對/foo/、/foo/bar而非/foo或 /foobar。若要比對/foo,請將Exact路徑/foo新增至入口規則。
- (如果使用原則模式,則此為適用)。如果使用預設後端建立 TLS 入口,建議您將預設後端設定為同時回應 HTTP 和 HTTPS 要求,因為:
- 如果有 TLS 入口 (在 Kubernetes/PKS 使用案例的叢集中,或 Project Pacific 使用案例的相同命名空間中) 且主機與要求中的主機相符,則負載平衡器將終止 TLS,並將 HTTP 要求傳送至預設後端伺服器。
- 如果沒有 TLS 入口 (在 Kubernetes/PKS 使用案例的叢集中,或 Project Pacific 使用案例的相同命名空間中) 且主機與要求中的主機相符,則負載平衡器將重新加密,並將 HTTPS 要求傳送至後端伺服器。
- (NCP 3.0.0 及 3.0.1) 不支援IngressClass資源。
- (NCP 3.0.2 及更新版本) 支援IngressClass資源。
- (NCP 3.0.0 及 3.0.1) 不支援pathType屬性。
- (NCP 3.0.2 及更新版本) 支援pathType屬性。
- (NCP 3.0.2 及更新版本) 支援 JWT (JSON Web Token) 用戶端驗證。此功能需要 NSX-T Data Center 3.0.0 或更新版本。
從 Kubernetes 1.18 開始,
kubernetes.io/ingress.class
註解已過時並取代為 IngressClass 資源。若要將 NSX-T 指定為 IngressClass 資源中的入口控制器,請將控制器參數設定為 k8s.io/nsx
。例如:kind: IngressClass metadata: name: nsx-lb annotations: ingressclass.kubernetes.io/is-default-class: true spec: controller: k8s.io/nsx
若要指定第三方入口控制器,請將控制器參數設定為
k8s.io/<controller name>
。例如:kind: IngressClass metadata: name: nginx-lb annotations: ingressclass.kubernetes.io/is-default-class: false spec: controller: k8s.io/ingress-nginx
若要將 IngressClass 設定為叢集的預設值,請將註解
ingressclass.kubernetes.io/is-default-class
設定為 true
。請參閱上述範例。kubernetes.io/ingress.class
註解和 IngressClass 資源不得同時使用。功能註解
下表列出 NCP 支援的註解:
註解 | 說明 | 支援的值 | 預設值 | NCP 版本 |
---|---|---|---|---|
kubernetes.io/ingress.allow-http | 除了 HTTPS,還會啟用 HTTP 要求 | true、false | true | 2.5 及更新版本 |
ncp/use-regex | 啟用路徑模式比對 | true、false | false | 2.5.1 及更新版本 |
ingress.kubernetes.io/rewrite-target | 傳入要求的重寫路徑 |
| 無預設值 | 請參閱「支援的值」一欄 |
ncp/http-redirect | 將 HTTP 要求重新導向至 HTTPS | true、false | false | 2.5.1 及更新版本 |
kubernetes.io/ingress.class | 指出哪個入口控制器負責此入口 | nsx、nginx 等 | nsx | 2.5 及更新版本 |
nsx/loadbalancer | 將入口置於專用的負載平衡器上 | 負載平衡器 CRD 的名稱 | 無預設值 | 2.5.1 及更新版本 |
ncp/whitelist-source-range | 依要求來源 IP 限制入口存取 | 以逗點分隔的 CIDR、IP 位址或 IP 範圍的清單。 | 無預設值 | 3.0.0 及更新版本 |
ncp/ssl-mode | 針對入口中的所有規則選取 SSL 模式 | 卸載、重新加密、傳遞 | 卸載 | 3.0.1 及更新版本 |
ncp/jwt-alg | 決定用於驗證 JWT 簽章的演算法。啟用要與 ncp/jwt-secret 搭配設定的 JWT 用戶端驗證。 | HS256、RS256 | 無預設值 | 3.0.2 及更新版本 |
ncp/jwt-secret | 指定包含用於簽章驗證之 JWT 密碼或公開金鑰的 Kubernetes 密碼名稱。啟用要與 ncp/jwt-alg 搭配設定的 JWT 用戶端驗證。 | Kubernetes 密碼的名稱 | 無預設值 | 3.0.2 及更新版本 |
ncp/jwt-token | 要在 HTTP 要求中搜尋 JWT 的其他位置。 | _arg_<param_name>、_cookie_<cookie_name> | 無預設值 | 3.0.2 及更新版本 |
ncp/jwt-realm | 指定驗證失敗時傳回 401 的領域標頭。 | 指出領域的字串 | 入口規則的主機名稱 | 3.0.2 及更新版本 |
ncp/jwt-preserve | 成功驗證後保留 JWT 並傳遞至後端的選項。 | true、false | true | 3.0.2 及更新版本 |
有關註解的詳細資料:
- 路徑 Regex (規則運算式) 比對
- 針對 NCP 2.5.0 和更早版本在 NCP 2.5.0 和更早版本中,會使用規則運算式字元「.」和「*」自動啟用所有子路徑比對。例如,路徑/coffee/.*會比對後面不跟字元或後跟一或多個字元的/coffee/,例如/coffee/、/coffee/a和/coffee/b,而非/coffee、/coffeecup或/coffeecup/a。入口規格範例:kind: Ingress metadata: name: cafe-ingress spec: rules: - http: paths: - path: /coffee/.* #Matches /coffee/, /coffee/a but NOT /coffee, /coffeecup, etc. backend: serviceName: coffee-svc servicePort: 80
- 針對 NCP 2.5.1 及更新版本您可以將使用註解ncp/use-regex的入口path(但不是host) 參數的規則運算式比對啟用或停用。如果設定為false,則會透過執行equals比對來執行精確路徑比對。如果設定為true,則會透過將字串字元開頭 (^) 和字串字元結尾 ($) 新增至路徑來執行規則運算式比對,使得整個要求 URI 符合模式。請注意,使用OR運算子 (|) 時,一律使用括弧指定範圍,使得 ^ 和 $ 適用於所有運算元。例如,path: /(tea|coffee|milk)。入口規格範例:kind: Ingress metadata: name: cafe-ingress annotations: kubernetes.io/ingress.class: "nsx" ncp/use-regex: "true" spec: rules: - host: cafe.example.com http: paths: - path: /tea/.* backend: serviceName: tea-svc servicePort: 80
- 在將 NCP 升級至 2.5.1 及更新版本之前更新入口僅當您的入口需要使用字元「.」和「*」的進行所有子路徑比對時,才需要此選項。
- 更新入口以包含註解ncp/use-regex: true。
- 對於所有子路徑比對,如果您具有/coffee/*或/*之類的路徑,請將其變更為/coffee/.*和/.*。/coffee/.*將比對/coffee/、/coffee/a、/coffee/b、/coffee/a/b,依此類推。/.*將比對/coffee、/tea、/coffee/a,依此類推。省略路徑會產生與path: /.*相同的行為。
- 註解ingress.kubernetes.io/rewrite-target的範例:kind: Ingress metadata: name: cafe-ingress annotations: ingress.kubernetes.io/rewrite-target: / spec: rules: - host: cafe.example.com http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80 - path: /coffee backend: serviceName: coffee-svc servicePort: 80路徑/tea和/coffee將重寫為/,然後再將 URL 傳送至後端服務。從 NCP 2.5.1 和 NSX-T 2.5.1 開始,如果使用規則運算式指定path,則所擷取的群組會以 $1、$2 (依此類推) 的編號預留位置格式儲存。這些預留位置可用作ingress.kubernetes.io/rewrite-target註解中的參數。不支援已命名的擷取群組和命名的預留位置。例如,kind: Ingress metadata: name: cafe-ingress annotations: kubernetes.io/ingress.class: "nsx" ncp/use-regex: "true" #/tea/cup will be rewritten to /cup before sending request to endpoint ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: cafe.example.com http: paths: - path: /tea/(.*) backend: serviceName: tea-svc servicePort: 80
- 關於註解kubernetes.io/ingress.allow-http:
- 如果註解設定為false,則會為 HTTPS 虛擬伺服器建立規則。
- 如果註解設定為true或遺失,則會同時為 HTTP 和 HTTPS 虛擬伺服器建立規則。請注意,只有在入口規格中存在 TLS 區段時才會建立 HTTPS 規則。
- 關於註解ncp/http-redirect:
- 如果註解設定為false,則不會將對 HTTP 虛擬伺服器的傳入 HTTP 流量 (連接埠 80) 重新導向至 HTTPS 虛擬伺服器。
- 如果註解設定為true,則會將對 HTTP 虛擬伺服器的傳入 HTTP 流量 (連接埠 80) 重新導向至 HTTPS 虛擬伺服器 (連接埠 443)。
此註解僅在 TLS 區段存在時有效。此註解優先於kubernetes.io/ingress.allow-http。設定為true時,無論kubernetes.io/ingress.allow-http的設定方式如何,都會將符合的 HTTP 流量導向 HTTPS。 - 關於註解kubernetes.io/ingress.class:
- 如果值為nsx,則此入口將由 NCP 進行處理。如果指定任何其他值,NCP 將忽略該入口。如需詳細資訊,請參閱第三方入口控制器。
- 如需有關註解nsx/loadbalancer的詳細資訊,請參閱用來處理入口調整的負載平衡器 CRD。
- 關於註解ncp/whitelist-source-range:
- 設定時,僅當傳入要求的來源 IP 包含在此註解中時,才會予以接受。否則,將會捨棄流量。
- 您可以指定 CIDR、IP 位址和 IP 範圍的組合。例如,1.1.1.1/24、2.2.2.2、3.3.3.3-4.4.4.4。
- 範例 YAML:kind: Ingress metadata: name: cafe-ingress annotations: kubernetes.io/ingress.class: "nsx" ncp/whitelist-source-range: "192.168.128.0/17, 192.168.64.0-192.168.64.255, 192.168.16.32" spec: tls: - hosts: - cafe.example.com rules: - host: cafe.example.com http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80
- 關於註解ncp/ssl-mode:
- 此註解適用於入口中的所有規則,且負載平衡器將在選取的 SSL 模式下針對這些規則運作。附註:如果ncp/ssl-mode設定為reencrypt或passthrough,則kubernetes.io/ingress.allow-http必須設定為False。如果已設定ingress.kubernetes.io/rewrite-target、ncp/use-regex或ncp/whitelist-source-range註解,則無法將此註解設定為passthrough。
- 關於 JWT 用戶端驗證:
- 若要為入口下方的所有規則啟用 JWT 用戶端驗證,則需要將ncp/jwt-alg和ncp/jwt-secret設為有效的值。啟用時,只有在承載有效的 JSON Web Token 時,才會將傳入 HTTP 流量傳遞至後端。否則,流量將遭到拒絕,且具有 401 狀態。
- 此功能與下列註解不相容:
- kubernetes.io/ingress.allow-http: true
- ncp/http-redirect: true
- ncp/ssl-mode: passthrough
- ncp/jwt-alg:
- 支援的對稱演算法:HS256
- 支援的非對稱演算法:RS256
- ncp/jwt-secret:
- 對稱金鑰或公用憑證必須在 Kubernetes 密碼中進行設定,且在與入口相同的命名空間下方具有此註解中指定的名稱。
- 對於對稱演算法,密碼必須儲存在jwt.key欄位中。
- 對於非對稱演算法,公用憑證必須儲存在tls.crt欄位中。
- 如果對稱密碼或公開憑證未儲存在上述位置中,或如果儲存在密碼中的資料無效,則會停用 JWT 用戶端驗證。
- ncp/jwt-token:
- 只能在此註解中設定一個項目。
- _arg_<param_name>:針對以 URI 參數形式傳入的 JWT。指定包含 JWT 的參數名稱。
- _cookie_<cookie_name>:針對以 Cookie 形式傳入的 JWT。指定包含 JWT 的 Cookie 名稱。
錯誤
已向入口資源標註錯誤。錯誤索引鍵為
ncp/error.loadbalancer
,警告索引鍵為 ncp/warning.loadbalancer
。可能的錯誤和警告如下: - ncp/error.loadbalancer:DEFAULT_BACKEND_IN_USE這個錯誤指示具有預設後端的入口已存在。入口將處於非作用中狀態。如果發生下列情況,即會發生此錯誤:(1) 此入口適用於 HTTP,而具有預設後端、適用於 HTTP 的另一個入口存在。(2) 此入口適用於 HTTPS,而具有預設後端、適用於 HTTPS 的另一個入口存在;或 (3) 此入口適用於 HTTP 和 HTTPS,而具有預設後端、適用於 HTTP 和 HTTPS 的另一個入口存在。若要修正錯誤,請刪除入口,然後重新建立具有正確規格的入口。
- ncp/warning.loadbalancer:SECRET_NOT_FOUND此錯誤指出入口規格中指定的密碼不存在,或者ncp/jwt-alg和ncp/jwt-secret已加上註解,但在與入口相同的命名空間下方找不到密碼。入口將部分處於作用中狀態。若要修正錯誤,請建立遺失的密碼。請注意,註解中一旦出現警告,在入口資源的生命週期內將不會予以清除。
- ncp/warning.loadbalancer:INVALID_INGRESS此錯誤指出下列條件之一為 true。入口將處於非作用中狀態。若要修正錯誤,請刪除入口,然後重新建立具有正確規格的入口。
- 入口規則與相同 Kubernetes 叢集中的另一個入口規則衝突。僅針對具有相同比對策略 (也就是相同ncp/use-regex註解值) 的入口判斷衝突。
- 將kubernetes.io/ingress.allow-http註解設為false,且入口沒有 TLS 區段。
- 將ncp/http-redirect註解設為true,且入口沒有 TLS 區段。
- 入口規則未指定host和path。此類入口規則具有與入口預設後端相同的功能。請改用入口預設後端。
- 入口具有無法正確處理的 JWL 註解。例如:
- ncp/jwt-alg或ncp/jwt-secret遺失。
- ncp/jwt-alg設定了不受支援的演算法。
- ncp/jwt-alg和ncp/jwt-secret已設定為使用其他 HTTP 啟用註解或使用 SSL 傳遞。