Istio Ingress Gateway中的Envoy配置解析

Posted ServiceMesher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Istio Ingress Gateway中的Envoy配置解析相关的知识,希望对你有一定的参考价值。

Istio Ingress Gateway中的Envoy配置解析

  • gateway定义用于配置在mesh边缘,到mesh的tcp和http的负载均衡。

非TLS单主机环境

相关拓扑

Istio Ingress Gateway中的Envoy配置解析

  • 使用azure aks环境。

  • ingress gateway的service类型为loadbalancer。

  • ingress gateway的service enternal ip为104.211.54.62。

  • 通过该external ip对应的域名,访问ingress gateway svc。

Istio Ingress Gateway中的Envoy配置解析

  • 增加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单主机环境

相关拓扑

Istio Ingress Gateway中的Envoy配置解析

  • 使用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请求。

Istio Ingress Gateway中的Envoy配置解析

  • 增加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单主机环境

相关拓扑

Istio Ingress Gateway中的Envoy配置解析

  • 使用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请求。

Istio Ingress Gateway中的Envoy配置解析

  • 增加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多主机环境

相关拓扑

Istio Ingress Gateway中的Envoy配置解析

  • 使用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方式访问主机。

Istio Ingress Gateway中的Envoy配置解析

  • 为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多主机环境

相关拓扑

Istio Ingress Gateway中的Envoy配置解析

  • 使用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方式访问主机。

Istio Ingress Gateway中的Envoy配置解析

  • 为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

1115 Istio

1122 Envoy

1129 使Istio

126 Istio mixer -

1213 Istio

1220 Istio使Serverless knative

Istio Ingress Gateway中的Envoy配置解析

  • 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


以上是关于Istio Ingress Gateway中的Envoy配置解析的主要内容,如果未能解决你的问题,请参考以下文章

K8S Istio 入口网关 (Ingress Gateway)

Service Mesh - Istio流量控制篇(下)

主机匹配不在istio网关中工作

来自Istio的儿童节礼物: 0.8 Release发布

教程 | Kubernetes上运行Istio Ingress Controller

Istio 大入门 — Egress Gateway