Istio Ingress Gateway中的Envoy配置解析

ServiceMesher2018-11-12 03:31:48

本文作者:ServiceMesher 社區成員沈旭光

  • gateway用於配置在mesh邊緣,到mesh的tcp和http的負載均衡。

非TLS單環境

相關拓撲

  • 使用azure aks環境。

  • ingress gateway的service類型為loadbalancer。

  • ingress gateway的service enternal ip為104.211.54.62。

  • 通過該external ip對應的域名,訪問ingress gateway svc。

  • 增加gateway定義。

  • gateway定義中的selector會將該設置與相應的gateway pod綁定。

  • gateway定義中的servers會在相應的pod中生成listener實例,該拓撲中的監聽端口為80。

  • 需要將80端口註冊到該gateway pod對應的服務中(默認已註冊)。

  • gateway定義中的hosts表示listener會向哪些特定的虛擬主機轉發流量,在該示例中為httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io。

  • 增加virtualservice定義。

  • virtualservice定義中的hosts與gateway中的hosts相對應,表示該服務可以註冊到gateway的監聽中,這個host寫會更新到gateway pod路由表的虛擬主機條目中。

  • virtualservice定義中的gateways將virtualservice與gateway關聯起來。

  • virtualservice定義中的http定義了路由規則,路由規則會寫入到相應gateway pod的路由表中。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: Gateway

  3. metadata:

  4.  name: httpbin-gateway

  5. spec:

  6.  selector:

  7.    istio: ingressgateway

  8.  servers:

  9.  - port:

  10.      number: 80

  11.      name: http-httpbin

  12.      protocol: HTTP

  13.    hosts:

  14.    - "httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io"

  • gateway相關配置。

  • 該定義與包含istio: ingressgateway label的ingress gateway pod綁定。

  • 新建80端口監聽。

  • 監聽主機為httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io的請求。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: VirtualService

  3. metadata:

  4.  name: httpbin-vs

  5. spec:

  6.  hosts:

  7.  - "httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io"

  8.  gateways:

  9.  - httpbin-gateway

  10.  http:

  11.  - match:

  12.    - uri:

  13.        prefix: /status

  14.    - uri:

  15.        prefix: /delay

  16.    - uri:

  17.        prefix: /headers

  18.    route:

  19.    - destination:

  20.        port:

  21.          number: 8000

  22.        host: httpbin.default.svc.cluster.local

  • virtualservice相關配置。

  • 將該配置應用到名稱為httpbin-gateway的實例中。

  • 定義路由規則和相關轉發目的地。

  1. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin]$ http http://httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io/status/418

  2. HTTP/1.1 418 Unknown

  3. access-control-allow-credentials: true

  4. access-control-allow-origin: *

  5. content-length: 135

  6. date: Sat, 03 Nov 2018 16:20:59 GMT

  7. server: envoy

  8. x-envoy-upstream-service-time: 4

  9. x-more-info: http://tools.ietf.org/html/rfc2324

  10.    -=[ teapot ]=-

  11.       _...._

  12.     .'  _ _ `.

  13.    | ."` ^ `". _,

  14.    \_;`"---"`|//

  15.      |       ;/

  16.      \_     _/

  17.        `"""`

  18. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin]$

  • 測試結果。

  • 通過主機httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io,可以正常訪問httpbin pod。

TLS單主機環境

相關拓撲

  • 使用azure aks環境。

  • ingress gateway的service類型為loadbalancer。

  • ingress gateway的service enternal ip為104.211.54.62。

  • 通過該external ip對應的域名,訪問ingress gateway svc。

  • 客戶端使用tls方式訪問主機。

  • tls請求在ingress gateway處被卸載,並轉化為http請求。

  • 增加gateway定義。

  • gateway定義中的監聽端口包括80和443。

  • 在80中啟用httpsredirect。

  • 在443中啟用simple tls。

  • 指定443的key和cert。

  • 增加virtualservice定義,並定義相應路由規則。

相關配置

  1. openssl req \

  2. -newkey rsa:4096 -nodes -sha256 -keyout ca.key \

  3. -x509 -days 3655 -out ca.crt

  4. openssl req \

  5. -newkey rsa:4096 -nodes -sha256 -keyout httpbin-tls.key \

  6. -out httpbin-tls.csr

  7. echo subjectAltName = DNS:httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io > extfile-httpbin-tls.cnf

  8. openssl x509 \

  9. -req -days 3655 -in httpbin-tls.csr -CA ca.crt -CAkey ca.key \

  10. -CAcreateserial -extfile extfile-httpbin-tls.cnf -out httpbin-tls.crt

  11. kubectl create -n istio-system secret tls istio-ingressgateway-certs --key ./httpbin-tls.key --cert ./httpbin-tls.crt

  • 自簽名證書相關配置。

  • k8s secret相關配置。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: Gateway

  3. metadata:

  4.  name: httpbin-tls-gateway

  5. spec:

  6.  selector:

  7.    istio: ingressgateway

  8.  servers:

  9.  - port:

  10.      number: 80

  11.      name: http-httpbin

  12.      protocol: HTTP

  13.    hosts:

  14.    - "httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io"

  15.    tls:

  16.      httpsRedirect: true

  17.  - port:

  18.      number: 443

  19.      name: https-httpbin

  20.      protocol: HTTPS

  21.    tls:

  22.      mode: SIMPLE

  23.      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt

  24.      privateKey: /etc/istio/ingressgateway-certs/tls.key

  25.    hosts:

  26.    - "httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io"

  • gateway相關配置。

  • 新建監聽端口包括80和443。

  • 在80中啟用httpsredirect。

  • 在443中啟用simple tls。

  • 指定443的key和cert。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: VirtualService

  3. metadata:

  4.  name: httpbin-tls-vs

  5. spec:

  6.  hosts:

  7.  - "httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io"

  8.  gateways:

  9.  - httpbin-tls-gateway

  10.  http:

  11.  - match:

  12.    - uri:

  13.        prefix: /status

  14.    route:

  15.    - destination:

  16.        port:

  17.          number: 8000

  18.        host: httpbin.default.svc.cluster.local

  • virtualservice相關配置。

  • 配置相關路由。

  1. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin]$ http http://httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io/status/418 --verify no --follow -v

  2. GET /status/418 HTTP/1.1

  3. Accept: */*

  4. Accept-Encoding: gzip, deflate

  5. Connection: keep-alive

  6. Host: httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io

  7. User-Agent: HTTPie/0.9.9

  8. HTTP/1.1 301 Moved Permanently

  9. content-length: 0

  10. date: Sat, 03 Nov 2018 19:25:25 GMT

  11. location: https://httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io/status/418

  12. server: envoy

  13. GET /status/418 HTTP/1.1

  14. Accept: */*

  15. Accept-Encoding: gzip, deflate

  16. Connection: keep-alive

  17. Host: httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io

  18. User-Agent: HTTPie/0.9.9

  19. HTTP/1.1 418 Unknown

  20. access-control-allow-credentials: true

  21. access-control-allow-origin: *

  22. content-length: 135

  23. date: Sat, 03 Nov 2018 19:25:26 GMT

  24. server: envoy

  25. x-envoy-upstream-service-time: 6

  26. x-more-info: http://tools.ietf.org/html/rfc2324

  27.    -=[ teapot ]=-

  28.       _...._

  29.     .'  _ _ `.

  30.    | ."` ^ `". _,

  31.    \_;`"---"`|//

  32.      |       ;/

  33.      \_     _/

  34.        `"""`

  35. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin]$

  • httpsredirect測試結果。

  • 通過http方式訪問httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io,可以正常訪問httpbin pod。

  1. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin]$ http https://httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io/status/418 --verify no -v

  2. GET /status/418 HTTP/1.1

  3. Accept: */*

  4. Accept-Encoding: gzip, deflate

  5. Connection: keep-alive

  6. Host: httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io

  7. User-Agent: HTTPie/0.9.9

  8. HTTP/1.1 418 Unknown

  9. access-control-allow-credentials: true

  10. access-control-allow-origin: *

  11. content-length: 135

  12. date: Sat, 03 Nov 2018 19:26:21 GMT

  13. server: envoy

  14. x-envoy-upstream-service-time: 5

  15. x-more-info: http://tools.ietf.org/html/rfc2324

  16.    -=[ teapot ]=-

  17.       _...._

  18.     .'  _ _ `.

  19.    | ."` ^ `". _,

  20.    \_;`"---"`|//

  21.      |       ;/

  22.      \_     _/

  23.        `"""`

  24. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin]$

  • https測試結果。

  • 通過https方式訪問httpbin.7cb9a9b7b318440399a0.eastus.aksapp.io,可以正常訪問httpbin pod。

mTLS單主機環境

相關拓撲

  • 使用azure aks環境。

  • ingress gateway的service類型為loadbalancer。

  • ingress gateway的service enternal ip為104.211.54.62。

  • 通過該external ip對應的域名,訪問ingress gateway svc。

  • 客戶端使用mtls方式訪問主機。

  • mtls請求在ingress gateway處被卸載,並轉化為http請求。

  • 增加gateway定義。

  • gateway定義中的監聽端口443。

  • 在443中啟用mtls。

  • 指定443的key和cert。

  • 指定443的ca cert。

  • 指定允許連接443的san。

  • 增加virtualservice定義,並定義相應路由規則。

相關配置

  1. openssl req \

  2. -newkey rsa:4096 -nodes -sha256 -keyout ca.key \

  3. -x509 -days 3655 -out ca.crt

  4. openssl req \

  5. -newkey rsa:4096 -nodes -sha256 -keyout httpbin-mtls.key \

  6. -out httpbin-mtls.csr

  7. echo subjectAltName = DNS:httpbin.6491dea3ce6b4d17b109.eastus.aksapp.io > extfile-httpbin-mtls.cnf

  8. openssl x509 \

  9. -req -days 3655 -in httpbin-mtls.csr -CA ca.crt -CAkey ca.key \

  10. -CAcreateserial -extfile extfile-httpbin-mtls.cnf -out httpbin-mtls.crt

  11. openssl req \

  12. -newkey rsa:4096 -nodes -sha256 -keyout client.key \

  13. -out client.csr

  14. echo subjectAltName = DNS:is5.istio.client > client-extfile.cnf

  15. openssl x509 \

  16. -req -days 3655 -in client.csr -CA ca.crt -CAkey ca.key \

  17. -CAcreateserial -extfile client-extfile.cnf -out client.crt

  18. kubectl create -n istio-system secret tls istio-ingressgateway-certs --key ./httpbin-mtls.key --cert ./httpbin-mtls.crt

  19. kubectl create -n istio-system secret generic istio-ingressgateway-ca-certs --from-file ./ca.crt

  • server端自簽名證書相關配置。

  • client端自簽名證書相關配置。

  • k8s secret相關配置。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: Gateway

  3. metadata:

  4.  name: httpbin-mtls-gateway

  5. spec:

  6.  selector:

  7.    istio: ingressgateway

  8.  servers:

  9.  - port:

  10.      number: 443

  11.      name: https-httpbin

  12.      protocol: HTTPS

  13.    tls:

  14.      mode: MUTUAL

  15.      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt

  16.      privateKey: /etc/istio/ingressgateway-certs/tls.key

  17.      caCertificates: /etc/istio/ingressgateway-ca-certs/ca.crt

  18.      subjectAltNames:

  19.      - is5.istio.client

  20.    hosts:

  21.    - "httpbin.6491dea3ce6b4d17b109.eastus.aksapp.io"

  • gateway相關配置。

  • 新建監聽端口443。

  • 在443中啟用mtls。

  • 指定443的key和cert。

  • 指定443的ca cert。

  • 指定允許連接443的san。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: VirtualService

  3. metadata:

  4.  name: httpbin-tls-vs

  5. spec:

  6.  hosts:

  7.  - "httpbin.6491dea3ce6b4d17b109.eastus.aksapp.io"

  8.  gateways:

  9.  - httpbin-mtls-gateway

  10.  http:

  11.  - match:

  12.    - uri:

  13.        prefix: /status

  14.    route:

  15.    - destination:

  16.        port:

  17.          number: 8000

  18.        host: httpbin.default.svc.cluster.local

  • virtualservice相關配置。

  • 配置相關路由。

  1. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin/ssl]$ http https://httpbin.6491dea3ce6b4d17b109.eastus.aksapp.io/status/418 --verify no --cert ./client.crt --cert-key ./client.key

  2. HTTP/1.1 418 Unknown

  3. access-control-allow-credentials: true

  4. access-control-allow-origin: *

  5. content-length: 135

  6. date: Sun, 04 Nov 2018 15:28:47 GMT

  7. server: envoy

  8. x-envoy-upstream-service-time: 6

  9. x-more-info: http://tools.ietf.org/html/rfc2324

  10.    -=[ teapot ]=-

  11.       _...._

  12.     .'  _ _ `.

  13.    | ."` ^ `". _,

  14.    \_;`"---"`|//

  15.      |       ;/

  16.      \_     _/

  17.        `"""`

  18. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin/ssl]

  • 測試結果。

  • 通過https mtls方式訪問httpbin.6491dea3ce6b4d17b109.eastus.aksapp.io,可以正常訪問httpbin pod。

非TLS多主機環境

相關拓撲

  • 使用azure aks環境。

  • ingress gateway的service類型為loadbalancer。

  • ingress gateway的service enternal ip為104.211.54.62。

  • 通過該external ip對應的域名,訪問ingress gateway svc。

  • 2個主機,分別為:httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io和httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io。

  • 客戶端使用http方式訪問主機。

  • 為2個主機配置統一的gateway定義。

  • 為2個主機分別配置virtualservice定義。

  • 主機httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io被路由至pod httpbin-a的/status uri。

  • 主機httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io被路由至pod httpbin-b的/headers uri。

  • 在gateway的listnener中生成統一的監聽0.0.0.0_80。

  • 在gateway的route中分別生成針對httpbin-a和httpbin-b的虛擬主機。

相關配置

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: Gateway

  3. metadata:

  4.  name: httpbin-dual-gateway

  5. spec:

  6.  selector:

  7.    istio: ingressgateway

  8.  servers:

  9.  - port:

  10.      number: 80

  11.      name: http-httpbin

  12.      protocol: HTTP

  13.    hosts:

  14.    - "httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io"

  15.    - "httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io"

  16. apiVersion: networking.istio.io/v1alpha3

  17. kind: Gateway

  18. metadata:

  19.  name: httpbin-dual-gateway

  20. spec:

  21.  selector:

  22.    istio: ingressgateway

  23.  servers:

  24.  - port:

  25.      number: 80

  26.      name: http-httpbina

  27.      protocol: HTTP

  28.    hosts:

  29.    - "httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io"

  30.  - port:

  31.      number: 80

  32.      name: http-httpbinb

  33.      protocol: HTTP

  34.    hosts:

  35.    - "httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io"

  • gateway相關配置。

  • 這2個gateway的配置,生成的envoy配置是一致的。

  • 新建監聽端口80。

  • 分別針對兩個主機httpbin-a和httpbin-b進行監聽。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: VirtualService

  3. metadata:

  4.  name: httpbin-a-vs

  5. spec:

  6.  hosts:

  7.  - "httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io"

  8.  gateways:

  9.  - httpbin-dual-gateway

  10.  http:

  11.  - match:

  12.    - uri:

  13.        prefix: /status

  14.    route:

  15.    - destination:

  16.        port:

  17.          number: 8000

  18.        host: httpbin-a.default.svc.cluster.local

  19. apiVersion: networking.istio.io/v1alpha3

  20. kind: VirtualService

  21. metadata:

  22.  name: httpbin-b-vs

  23. spec:

  24.  hosts:

  25.  - "httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io"

  26.  gateways:

  27.  - httpbin-dual-gateway

  28.  http:

  29.  - match:

  30.    - uri:

  31.        prefix: /headers

  32.    route:

  33.    - destination:

  34.        port:

  35.          number: 8000

  36.        host: httpbin-b.default.svc.cluster.local

  • httpbin-a和httpbin-b的virtualservice相關配置。

  • httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io的/status請求被路由至httpbin-a。

  • httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io的/headers請求被路由至httpbin-b。

  1. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin/ssl]$ http http://httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io/status/418

  2. HTTP/1.1 418 Unknown

  3. access-control-allow-credentials: true

  4. access-control-allow-origin: *

  5. content-length: 135

  6. date: Sun, 04 Nov 2018 16:27:07 GMT

  7. server: envoy

  8. x-envoy-upstream-service-time: 10

  9. x-more-info: http://tools.ietf.org/html/rfc2324

  10.    -=[ teapot ]=-

  11.       _...._

  12.     .'  _ _ `.

  13.    | ."` ^ `". _,

  14.    \_;`"---"`|//

  15.      |       ;/

  16.      \_     _/

  17.        `"""`

  18. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin/ssl]$ http http://httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io/headers

  19. HTTP/1.1 200 OK

  20. access-control-allow-credentials: true

  21. access-control-allow-origin: *

  22. content-length: 412

  23. content-type: application/json

  24. date: Sun, 04 Nov 2018 16:27:25 GMT

  25. server: envoy

  26. x-envoy-upstream-service-time: 7

  27. {

  28.    "headers": {

  29.        "Accept": "*/*",

  30.        "Accept-Encoding": "gzip, deflate",

  31.        "Content-Length": "0",

  32.        "Host": "httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io",

  33.        "User-Agent": "HTTPie/0.9.9",

  34.        "X-B3-Sampled": "1",

  35.        "X-B3-Spanid": "9b6889437bfe02c8",

  36.        "X-B3-Traceid": "9b6889437bfe02c8",

  37.        "X-Envoy-Internal": "true",

  38.        "X-Request-Id": "e43ae114-52dd-9ee4-930b-dbb0405c6fef"

  39.    }

  40. }

  41. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin/ssl]$

  • 測試結果。

  • 請求httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io/status/418和httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io/headers均可以被正確路由。

TLS多主機環境

相關拓撲

  • 使用azure aks環境。

  • ingress gateway的service類型為loadbalancer。

  • ingress gateway的service enternal ip為104.211.54.62。

  • 通過該external ip對應的域名,訪問ingress gateway svc。

  • 2個主機,分別為:httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io和httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io。

  • 客戶端使用tls方式訪問主機。

  • 為2個主機分別配置gateway中的server定義。

  • 為2個主機的server定義中增加證書的定義,每個server使用不同的證書。

  • 為2個主機分別配置virtualservice定義。

  • 在gateway的listnener中生成統一的監聽0.0.0.0_443。

  • 因為gateway中配置的2個server中有不相同的配置,所以在監聽0.0.0.0_443中,會生成2個server,分別為httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io和httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io。

  • 因為監聽中生成2個server,所以在路由中會生成2條不同的路由相對應,在gateway的路由中生成分別的虛擬主機https.443.https-httpbina和https.443.https-httpbinb。

  • 監聽0.0.0.0_443所屬的server httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io被關聯至路由https.443.https-httpbina,server httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io被關聯至路由https.443.https-httpbinb。

  • 主機httpbin-a被路由至pod httpbin-a的/status uri。

  • 主機httpbin-b被路由至pod httpbin-b的/headers uri。

相關配置

  1. openssl req \

  2. -newkey rsa:4096 -nodes -sha256 -keyout ca.key \

  3. -x509 -days 3655 -out ca.crt

  4. openssl req \

  5. -newkey rsa:4096 -nodes -sha256 -keyout httpbin-a-tls.key \

  6. -out httpbin-a-tls.csr

  7. echo subjectAltName = DNS:httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io > extfile-httpbin-a-tls.cnf

  8. openssl x509 \

  9. -req -days 3655 -in httpbin-a-tls.csr -CA ca.crt -CAkey ca.key \

  10. -CAcreateserial -extfile extfile-httpbin-a-tls.cnf -out httpbin-a-tls.crt

  11. openssl req \

  12. -newkey rsa:4096 -nodes -sha256 -keyout httpbin-b-tls.key \

  13. -out httpbin-b-tls.csr

  14. echo subjectAltName = DNS:httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io > extfile-httpbin-b-tls.cnf

  15. openssl x509 \

  16. -req -days 3655 -in httpbin-b-tls.csr -CA ca.crt -CAkey ca.key \

  17. -CAcreateserial -extfile extfile-httpbin-b-tls.cnf -out httpbin-b-tls.crt

  18. kubectl create -n istio-system secret tls istio-ingressgateway-httpbin-a-certs --key ./httpbin-a-tls.key --cert ./httpbin-a-tls.crt

  19. kubectl create -n istio-system secret tls istio-ingressgateway-httpbin-b-certs --key ./httpbin-b-tls.key --cert ./httpbin-b-tls.crt

  • 自簽名證書相關配置。

  • k8s secret相關配置。

  1. helm template install/kubernetes/helm/istio/ --name istio-ingressgateway --namespace istio-system -x charts/gateways/templates/deployment.yaml --set gateways.istio-egressgateway.enabled=false \

  2. --set gateways.istio-ingressgateway.secretVolumes[0].name=ingressgateway-ca-certs \

  3. --set gateways.istio-ingressgateway.secretVolumes[0].secretName=istio-ingressgateway-ca-certs \

  4. --set gateways.istio-ingressgateway.secretVolumes[0].mountPath=/etc/istio/ingressgateway-ca-certs \

  5. --set gateways.istio-ingressgateway.secretVolumes[1].name=ingressgateway-httpbin-a-certs \

  6. --set gateways.istio-ingressgateway.secretVolumes[1].secretName=istio-ingressgateway-httpbin-a-certs \

  7. --set gateways.istio-ingressgateway.secretVolumes[1].mountPath=/etc/istio/ingressgateway-httpbin-a-certs \

  8. --set gateways.istio-ingressgateway.secretVolumes[2].name=ingressgateway-httpbin-b-certs \

  9. --set gateways.istio-ingressgateway.secretVolumes[2].secretName=istio-ingressgateway-httpbin-b-certs \

  10. --set gateways.istio-ingressgateway.secretVolumes[2].mountPath=/etc/istio/ingressgateway-httpbin-b-certs > \

  11. ./helm-ingressgateway-httpbin-dual-tls.yaml

  12. ...

  13.          volumeMounts:

  14.          - name: istio-certs

  15.            mountPath: /etc/certs

  16.            readOnly: true

  17.          - name: ingressgateway-ca-certs

  18.            mountPath: "/etc/istio/ingressgateway-ca-certs"

  19.            readOnly: true

  20.          - name: ingressgateway-httpbin-a-certs

  21.            mountPath: "/etc/istio/ingressgateway-httpbin-a-certs"

  22.            readOnly: true

  23.          - name: ingressgateway-httpbin-b-certs

  24.            mountPath: "/etc/istio/ingressgateway-httpbin-b-certs"

  25.            readOnly: true

  26.      volumes:

  27.      - name: istio-certs

  28.        secret:

  29.          secretName: istio.istio-ingressgateway-service-account

  30.          optional: true

  31.      - name: ingressgateway-ca-certs

  32.        secret:

  33.          secretName: "istio-ingressgateway-ca-certs"

  34.          optional: true

  35.      - name: ingressgateway-httpbin-a-certs

  36.        secret:

  37.          secretName: "istio-ingressgateway-httpbin-a-certs"

  38.          optional: true

  39.      - name: ingressgateway-httpbin-b-certs

  40.        secret:

  41.          secretName: "istio-ingressgateway-httpbin-b-certs"

  42.          optional: true

  43. ...

  • 修改了ingress gateway deployment的配置,可以支持多個證書。

  • 分別包含域名為httpbin-a和httpbin-b的證書。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: Gateway

  3. metadata:

  4.  name: httpbin-dual-tls-gateway

  5. spec:

  6.  selector:

  7.    istio: ingressgateway

  8.  servers:

  9.  - port:

  10.      number: 443

  11.      name: https-httpbina

  12.      protocol: HTTPS

  13.    tls:

  14.      mode: SIMPLE

  15.      serverCertificate: /etc/istio/ingressgateway-httpbin-a-certs/tls.crt

  16.      privateKey: /etc/istio/ingressgateway-httpbin-a-certs/tls.key

  17.    hosts:

  18.    - "httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io"

  19.  - port:

  20.      number: 443

  21.      name: https-httpbinb

  22.      protocol: HTTPS

  23.    tls:

  24.      mode: SIMPLE

  25.      serverCertificate: /etc/istio/ingressgateway-httpbin-b-certs/tls.crt

  26.      privateKey: /etc/istio/ingressgateway-httpbin-b-certs/tls.key

  27.    hosts:

  28.    - "httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io"

  • gateway相關配置。

  • 分別定義2個server,每個server配置不同的證書。

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: VirtualService

  3. metadata:

  4.  name: httpbin-a-vs

  5. spec:

  6.  hosts:

  7.  - "httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io"

  8.  gateways:

  9.  - httpbin-dual-tls-gateway

  10.  http:

  11.  - match:

  12.    - uri:

  13.        prefix: /status

  14.    route:

  15.    - destination:

  16.        port:

  17.          number: 8000

  18.        host: httpbin-a.default.svc.cluster.local

  19. apiVersion: networking.istio.io/v1alpha3

  20. kind: VirtualService

  21. metadata:

  22.  name: httpbin-b-vs

  23. spec:

  24.  hosts:

  25.  - "httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io"

  26.  gateways:

  27.  - httpbin-dual-tls-gateway

  28.  http:

  29.  - match:

  30.    - uri:

  31.        prefix: /headers

  32.    route:

  33.    - destination:

  34.        port:

  35.          number: 8000

  36.        host: httpbin-b.default.svc.cluster.local

  • httpbin-a和httpbin-b的virtualservice相關配置。

  • httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io的/status請求被路由至httpbin-a。

  • httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io的/headers請求被路由至httpbin-b。

  1. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin/ssl]$ http https://httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io/status/418 --verify no

  2. HTTP/1.1 418 Unknown

  3. access-control-allow-credentials: true

  4. access-control-allow-origin: *

  5. content-length: 135

  6. date: Sun, 04 Nov 2018 17:36:30 GMT

  7. server: envoy

  8. x-envoy-upstream-service-time: 6

  9. x-more-info: http://tools.ietf.org/html/rfc2324

  10.    -=[ teapot ]=-

  11.       _...._

  12.     .'  _ _ `.

  13.    | ."` ^ `". _,

  14.    \_;`"---"`|//

  15.      |       ;/

  16.      \_     _/

  17.        `"""`

  18. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin/ssl]$ http https://httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io/headers --verify no

  19. HTTP/1.1 200 OK

  20. access-control-allow-credentials: true

  21. access-control-allow-origin: *

  22. content-length: 412

  23. content-type: application/json

  24. date: Sun, 04 Nov 2018 17:36:33 GMT

  25. server: envoy

  26. x-envoy-upstream-service-time: 8

  27. {

  28.    "headers": {

  29.        "Accept": "*/*",

  30.        "Accept-Encoding": "gzip, deflate",

  31.        "Content-Length": "0",

  32.        "Host": "httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io",

  33.        "User-Agent": "HTTPie/0.9.9",

  34.        "X-B3-Sampled": "1",

  35.        "X-B3-Spanid": "27a46e99214fe1e1",

  36.        "X-B3-Traceid": "27a46e99214fe1e1",

  37.        "X-Envoy-Internal": "true",

  38.        "X-Request-Id": "6c1ace56-7f57-9b0d-bb3d-2eb57519c4a2"

  39.    }

  40. }

  41. [~/K8s/istio/istio-azure-1.0.2/samples/httpbin/ssl]$

  • 測試結果。

  • 請求httpbin-a.6491dea3ce6b4d17b109.eastus.aksapp.io/status/418和httpbin-b.6491dea3ce6b4d17b109.eastus.aksapp.io/headers均可以被正確路由。

點擊【閱讀原文】跳轉到網站上瀏覽可以查看文中的鏈接。

Istio

IBM Istio

111 Istio

118 週四晚8點Istio系列第二講:上手Istio: 基本概念,安裝並使用istio進行微服務流量管控

1115 Istio

1122 Envoy

1129 使Istio

126 Istio mixer -

1213 Istio

1220 Istio使Serverless knative

IBMIstio

  • SOFAMesh(https://github.com/alipay/sofa-mesh)基於Istio的大規模服務網格解決方案

  • SOFAMosn(https://github.com/alipay/sofa-mosn)使用Go語言開發的高性能Sidecar代理

合作社區

參與社區

以下是參與ServiceMesher社區的方式,最簡單的方式是聯繫我!

  • 加入微信交流群:關注本微信公眾號後訪問主頁右下角有獲取聯繫方式按鈕,添加好友時請註明姓名-公司

  • 社區網址:http://www.servicemesher.com

  • Slack:https://servicemesher.slack.com (需要邀請才能加入)

  • GitHub:https://github.com/servicemesher

  • Istio中文文檔進度追蹤:https://github.com/servicemesher/istio-official-translation

  • Twitter: https://twitter.com/servicemesher

  • 提供文章線索與投稿:https://github.com/servicemesher/trans


閱讀原文

TAGS: