閘道

Gateway 描述一個在網格邊緣運作的負載平衡器,接收傳入或傳出的 HTTP/TCP 連線。此規格描述了一組應該公開的埠、要使用的協定類型、負載平衡器的 SNI 設定等等。

例如,以下 Gateway 設定建立一個代理伺服器,作為負載平衡器,公開埠 80 和 9080 (http)、443 (https)、9443(https) 以及用於入口的埠 2379 (TCP)。此閘道將應用於標籤為 app: my-gateway-controller 的 Pod 上執行的代理伺服器。雖然 Istio 會設定代理伺服器監聽這些埠,但使用者有責任確保允許外部流量進入網格的這些埠。

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: some-config-namespace
spec:
  selector:
    app: my-gateway-controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - uk.bookinfo.com
    - eu.bookinfo.com
    tls:
      httpsRedirect: true # sends 301 redirect for http requests
  - port:
      number: 443
      name: https-443
      protocol: HTTPS
    hosts:
    - uk.bookinfo.com
    - eu.bookinfo.com
    tls:
      mode: SIMPLE # enables HTTPS on this port
      serverCertificate: /etc/certs/servercert.pem
      privateKey: /etc/certs/privatekey.pem
  - port:
      number: 9443
      name: https-9443
      protocol: HTTPS
    hosts:
    - "bookinfo-namespace/*.bookinfo.com"
    tls:
      mode: SIMPLE # enables HTTPS on this port
      credentialName: bookinfo-secret # fetches certs from Kubernetes secret
  - port:
      number: 9080
      name: http-wildcard
      protocol: HTTP
    hosts:
    - "*"
  - port:
      number: 2379 # to expose internal service via external port 2379
      name: mongo
      protocol: MONGO
    hosts:
    - "*"

上述的 Gateway 規格描述了負載平衡器的 L4-L6 屬性。然後,可以將 VirtualService 綁定到閘道,以控制到達特定主機或閘道埠的流量轉發。

例如,以下 VirtualService 將 https://uk.bookinfo.com/reviewshttps://eu.bookinfo.com/reviewshttp://uk.bookinfo.com:9080/reviewshttp://eu.bookinfo.com:9080/reviews 的流量分割到內部 reviews 服務的兩個版本(prod 和 qa),埠號為 9080。此外,包含 cookie 「user: dev-123」的請求將被發送到 qa 版本的特殊埠 7777。相同的規則也適用於網格內部對 「reviews.prod.svc.cluster.local」 服務的請求。此規則適用於埠 443、9080。請注意,http://uk.bookinfo.com 會重新導向到 https://uk.bookinfo.com(即 80 重新導向到 443)。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-rule
  namespace: bookinfo-namespace
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  - uk.bookinfo.com
  - eu.bookinfo.com
  gateways:
  - some-config-namespace/my-gateway
  - mesh # applies to all the sidecars in the mesh
  http:
  - match:
    - headers:
        cookie:
          exact: "user=dev-123"
    route:
    - destination:
        port:
          number: 7777
        host: reviews.qa.svc.cluster.local
  - match:
    - uri:
        prefix: /reviews/
    route:
    - destination:
        port:
          number: 9080 # can be omitted if it's the only port for reviews
        host: reviews.prod.svc.cluster.local
      weight: 80
    - destination:
        host: reviews.qa.svc.cluster.local
      weight: 20

以下 VirtualService 將到達(外部)埠 27017 的流量轉發到埠 5555 上的內部 Mongo 伺服器。此規則不適用於網格內部,因為閘道清單省略了保留名稱 mesh

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-mongo
  namespace: bookinfo-namespace
spec:
  hosts:
  - mongosvr.prod.svc.cluster.local # name of internal Mongo service
  gateways:
  - some-config-namespace/my-gateway # can omit the namespace if gateway is in same namespace as virtual service.
  tcp:
  - match:
    - port: 27017
    route:
    - destination:
        host: mongo.prod.svc.cluster.local
        port:
          number: 5555

可以使用主機欄位中的命名空間/主機名稱語法,限制可以綁定到閘道伺服器的虛擬服務集合。例如,以下閘道允許 ns1 命名空間中的任何虛擬服務綁定到它,同時限制只有 ns2 命名空間中具有 foo.bar.com 主機的虛擬服務才能綁定到它。

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: some-config-namespace
spec:
  selector:
    app: my-gateway-controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "ns1/*"
    - "ns2/foo.bar.com"

閘道

Gateway 描述一個在網格邊緣運作的負載平衡器,接收傳入或傳出的 HTTP/TCP 連線。

欄位類型描述必要
serversServer[]

伺服器規格的清單。

selectormap<string, string>

一個或多個標籤,指示應該應用此閘道設定的特定 Pod/VM 集合。預設情況下,會根據標籤選擇器在所有命名空間中搜尋工作負載。這表示命名空間「foo」中的閘道資源可以根據標籤選擇命名空間「bar」中的 Pod。此行為可以透過 istiod 中的 PILOT_SCOPE_GATEWAY_TO_NAMESPACE 環境變數來控制。如果此變數設定為 true,則標籤搜尋的範圍會限制為資源所在的設定命名空間。換句話說,Gateway 資源必須與閘道工作負載實例位於相同的命名空間中。如果 selector 為 nil,則 Gateway 將應用於所有工作負載。

伺服器

Server 描述指定負載平衡器埠上代理伺服器的屬性。例如,

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-ingress
spec:
  selector:
    app: my-ingressgateway
  servers:
  - port:
      number: 80
      name: http2
      protocol: HTTP2
    hosts:
    - "*"

另一個範例

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-tcp-ingress
spec:
  selector:
    app: my-tcp-ingressgateway
  servers:
  - port:
      number: 27018
      name: mongo
      protocol: MONGO
    hosts:
    - "*"

以下是埠 443 的 TLS 設定範例

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-tls-ingress
spec:
  selector:
    app: my-tls-ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - "*"
    tls:
      mode: SIMPLE
      credentialName: tls-cert
欄位類型描述必要
port

代理伺服器應該監聽傳入連線的埠。

bindstring

接聽器應該繫結到的 IP 或 Unix 網域套接字。格式:x.x.x.xunix:///path/to/udsunix://@foobar (Linux 抽象命名空間)。使用 Unix 網域套接字時,埠號應為 0。這可以用於限制此伺服器僅在閘道內部可存取。當閘道需要與另一個網格服務通訊時,通常會使用此功能,例如發佈指標。在這種情況下,使用指定的繫結建立的伺服器將無法供外部閘道客戶端使用。

hostsstring[]

此閘道公開的一個或多個主機。雖然通常適用於 HTTP 服務,但也可以用於使用 TLS 和 SNI 的 TCP 服務。主機指定為 dnsName,並具有可選的 namespace/ 字首。應使用 FQDN 格式指定 dnsName,並在最左側的元件中選擇性地包含萬用字元(例如,prod/*.example.com)。將 dnsName 設定為 * 以從指定的命名空間中選擇所有 VirtualService 主機(例如,prod/*)。

namespace 可以設定為 *.,分別表示任何命名空間或目前命名空間。例如,*/foo.example.com 從任何可用的命名空間中選擇服務,而 ./foo.example.com 僅從邊車的命名空間中選擇服務。如果未指定 namespace/,則預設值為 */,也就是說,從任何命名空間中選擇服務。也將使用選定命名空間中的任何相關的 DestinationRule

VirtualService 必須繫結到閘道,並且必須具有一個或多個與伺服器中指定的主機相符的主機。比對可以是完全比對,也可以是與伺服器主機的尾碼比對。例如,如果伺服器的主機指定 *.example.com,則主機為 dev.example.comprod.example.comVirtualService 將會比對。但是,主機為 example.comnewexample.comVirtualService 將不會比對。

注意:僅可以參考匯出到閘道命名空間的虛擬服務(例如,exportTo 值為 *)。私有設定(例如,exportTo 設定為 .)將不可用。有關詳細資訊,請參閱 VirtualServiceDestinationRuleServiceEntry 設定中的 exportTo 設定。

tlsServerTLSSettings

控制伺服器行為的一組 TLS 相關選項。使用這些選項來控制是否應將所有 http 請求重新導向到 https,以及要使用的 TLS 模式。

namestring

伺服器的選用名稱,設定時在所有伺服器中必須是唯一的。這將用於各種目的,例如以此名稱為前綴產生統計資料等。

Port 描述服務特定埠的屬性。

欄位類型描述必要
numberuint32

有效的非負整數埠號。

protocolstring

埠上公開的協定。必須是 HTTP|HTTPS|GRPC|GRPC-WEB|HTTP2|MONGO|TCP|TLS 其中之一。TLS 可以用於終止特定埠上基於非 HTTP 的連線,或根據 SNI 標頭將流量路由到目的地,而無需終止 TLS 連線。

namestring

指派給埠的標籤。

ServerTLSSettings

欄位類型描述必要
httpsRedirectbool

如果設定為 true,則負載平衡器將為所有 http 連線傳送 301 重新導向,要求用戶端使用 HTTPS。

modeTLSmode

選用:指出是否應使用 TLS 保護到此埠的連線。此欄位的值決定 TLS 的強制執行方式。

serverCertificatestring

如果 mode 為 SIMPLEMUTUAL,則為必要。用於存放伺服器端 TLS 憑證的路徑。

privateKeystring

如果 mode 為 SIMPLEMUTUAL,則為必要。用於存放伺服器私密金鑰的路徑。

caCertificatesstring

如果 mode 為 MUTUALOPTIONAL_MUTUAL,則為必要。用於存放憑證授權單位憑證的路徑,以驗證提供的用戶端憑證。

caCrlstring

選用:用於存放憑證撤銷清單 (CRL) 的路徑,以驗證提供的用戶端憑證。CRL 是 CA(憑證授權單位)在其排定的到期日之前撤銷的憑證清單。如果指定,則代理伺服器將驗證提供的憑證是否是已撤銷的憑證清單的一部分。如果省略,則代理伺服器不會根據 crl 驗證憑證。

credentialNamestring

對於在 Kubernetes 上執行的閘道,這是保留 TLS 憑證 (包括 CA 憑證) 的 Secret 名稱。僅適用於 Kubernetes。Opaque Secret 應包含下列金鑰和值:tls.key: <privateKey>tls.crt: <serverCert>key: <privateKey>cert: <serverCert>。對於相互 TLS,可以在相同的 Secret 或名為 <secret>-cacert 的單獨 Secret 中提供 cacert: <CACertificate>crl: <CertificateRevocationList>。還支援具有額外 tls.ocsp-staple 金鑰的伺服器憑證 TLS Secret,用於指定 OCSP Staple 資訊、CA 憑證的 ca.crt 金鑰和憑證撤銷清單的 ca.crl 金鑰。只能指定伺服器憑證和 CA 憑證或 credentialName 其中之一。

subjectAltNamesstring[]

用於驗證用戶端提供的憑證中主體身分的一組替代名稱。

verifyCertificateSpkistring[]

授權用戶端憑證的 SPKI 的選用 Base64 編碼 SHA-256 雜湊清單。注意:當同時指定 verify_certificate_hash 和 verify_certificate_spki 時,比對任一值的雜湊都將導致憑證被接受。

verifyCertificateHashstring[]

授權用戶端憑證的選用十六進位編碼 SHA-256 雜湊清單。可接受簡單格式和以冒號分隔的格式。注意:當同時指定 verify_certificate_hash 和 verify_certificate_spki 時,比對任一值的雜湊都將導致憑證被接受。

minProtocolVersionTLSProtocol

選用:最小 TLS 協定版本。預設情況下為 TLSV1_2。低於 TLSV1_2 的 TLS 協定版本需要使用 cipherSuites 設定來設定相容的密碼,因為它們不再包含相容的密碼。

注意:使用低於 TLSV1_2 的 TLS 協定版本具有嚴重的安全性風險。

maxProtocolVersionTLSProtocol

選用:最大 TLS 協定版本。

cipherSuitesstring[]

選用:如果指定,則僅支援指定的密碼清單。否則,預設為 Envoy 支援的預設密碼清單,如此處所指定。支援的密碼清單為

  • ECDHE-ECDSA-AES128-GCM-SHA256
  • ECDHE-RSA-AES128-GCM-SHA256
  • ECDHE-ECDSA-AES256-GCM-SHA384
  • ECDHE-RSA-AES256-GCM-SHA384
  • ECDHE-ECDSA-CHACHA20-POLY1305
  • ECDHE-RSA-CHACHA20-POLY1305
  • ECDHE-ECDSA-AES128-SHA
  • ECDHE-RSA-AES128-SHA
  • ECDHE-ECDSA-AES256-SHA
  • ECDHE-RSA-AES256-SHA
  • AES128-GCM-SHA256
  • AES256-GCM-SHA384
  • AES128-SHA
  • AES256-SHA
  • DES-CBC3-SHA

ServerTLSSettings.TLSmode

代理伺服器強制執行的 TLS 模式

名稱描述
PASSTHROUGH

用戶端提供的 SNI 字串將在 VirtualService TLS 路由中用作比對條件,以確定服務註冊表中的目標服務。

SIMPLE

使用標準 TLS 語意保護連線。在此模式下,在交握期間不會要求提供用戶端憑證。

MUTUAL

使用相互 TLS 保護到下游的連線,方法是提供伺服器憑證進行驗證。在交握期間,也會要求提供用戶端憑證,並且用戶端必須至少傳送一個有效的憑證。

AUTO_PASSTHROUGH

與 passthrough 模式類似,但具有此 TLS 模式的伺服器不需要關聯的 VirtualService 來將 SNI 值對應到註冊表中的服務。目標詳細資訊(例如,服務/子集/埠)編碼在 SNI 值中。代理伺服器將轉發到由 SNI 值指定的上游 (Envoy) 叢集(一組端點)。此伺服器通常用於在不相鄰 L3 網路中的服務之間提供連線,這些服務的各自端點之間沒有直接連線。使用此模式表示來源和目的地都使用 Istio mTLS 來保護流量。

ISTIO_MUTUAL

使用相互 TLS 保護來自下游的連線,方法是提供伺服器憑證進行驗證。與 Mutual 模式相比,此模式使用由 Istio 自動產生的憑證(代表閘道工作負載身分)進行 mTLS 驗證。使用此模式時,TLSOptions 中的所有其他欄位都應為空。

OPTIONAL_MUTUAL

與 MUTUAL 模式類似,但用戶端憑證為選用。與 SIMPLE 模式不同,在交握期間仍會明確要求提供用戶端憑證,但不要求用戶端傳送憑證。如果提供用戶端憑證,則會進行驗證。應指定 ca_certificates 以驗證用戶端憑證。

ServerTLSSettings.TLSProtocol

TLS 協定版本。

名稱描述
TLS_AUTO

自動選擇最佳 TLS 版本。

TLSV1_0

TLS 版本 1.0

TLSV1_1

TLS 版本 1.1

TLSV1_2

TLS 版本 1.2

TLSV1_3

TLS 版本 1.3

這項資訊對您有幫助嗎?
您有任何改進建議嗎?

感謝您的回饋!