我正在使用 EKS 和通过 Helm 安装的最新 Istio。我正在尝试基于我们在 AWS 证书管理器中为域拥有的通配符证书来实施 TLS。我遇到了一个问题,客户端和 NLB 之间的连接正常,TLS 在那里终止,但 NLB 无法通过安全端口与 istio LB 通信。在AWS控制台中,我可以重写转发规则,将流量从端口443转发到标准istio http目标,但我找不到通过代码来执行此操作的方法。我试图避免所有点击操作。这是我对网关的 Helm 覆盖:
gateways:
istio-ingressgateway:
serviceAnnotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:XXXXXXXXXXXXXXXXXX:certificate/XXXXXXXXXXXXXXXXXXXX"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
所以我期望这里发生的是:
Client:443 --> NLB:443 --> Istio Gateway:80
but what I end up with is
Client:443 --> NLB:443 --> Istio Gateway:443
有人对如何通过代码使其工作有任何想法吗?或者,如果有人可以向我指出一个资源,以便在 NLB 和 Istio 之间进行 tls 通信,我也很乐意这样做。
可能发生的情况是,如果您终止负载均衡器上的 TLS,它不会将 SNI 传送到目标组。我遇到了完全相同的问题,最终通过在入口
'*'
上将主机设置为 Gateway
来解决它,然后在不同的 VirtualService
上指定主机(按照 here 以及 istio 官方的建议)文档)。
您的服务注释已经正确,缺少的是将 istio 网关端口 443 更改为 HTTP
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: http-gateway-external
namespace: istio-ingress
spec:
selector:
istio: gateway-external
servers:
- hosts:
- '*'
port:
name: http
number: 80
protocol: HTTP
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTP # Change from HTTPS to HTTP
解决这个问题的答案是将目标群体的TCP协议切换为TLS。
按照以下步骤操作。 NLB注释:
annotations:
...
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: 'https'
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: xxx
...
生成自签名证书:
openssl req -x509 -sha256 -nodes -newkey rsa:2048 -subj "/O=devopsvn.tech/CN=devopsvn.tech" -keyout devopsvn.tech.key -out devopsvn.tech.crt
生成证书签名请求(CSR):
openssl req -out sub.devopsvn.tech.csr -newkey rsa:2048 -nodes -keyout sub.devopsvn.tech.key -subj "/CN=sub.devopsvn.tech/O=sub.devopsvn.tech"
使用自签名证书签署 CSR:
openssl x509 -req -CA devopsvn.tech.crt -CAkey devopsvn.tech.key -set_serial 0 -in sub.devopsvn.tech.csr -out sub.devopsvn.tech.crt
Istio 网关配置:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: istio-gateway
spec:
selector:
istio: istio-gateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: tls-cert
hosts:
- "*"
使用 TLS 协议创建新的 TargetGroup
使用 TargetGroupBinding 将 TargetGroup 绑定到 NLB。