Istio:HTTPS 流量转换为 HTTP,端口设置为 443

Istio:HTTPS 流量转换为 HTTP,端口设置为 443

错误描述

我们在 eks 集群上设置了一个 istio,并在其中托管了一个 Java 应用程序。已创建了 pod 以及 ClusterIP 类型的服务

我们已经创建了虚拟服务、网关并将 istio 入口网关设置为 NodePort。在 istio 入口网关前面,我们放置了 AWS 应用程序负载均衡器。我们创建了一个指向上述 ALB 的 route53(DNS) 条目

现在,所有服务和 Pod 都已启动

现在,在使用 https 访问 DNS 时,我们在上述 Spring Boot Java 应用程序中获得的请求信息已从 https 更改为端口为 443 的 http

例如:如果我curl https://sarath.somedomain.com/helloworld在我们的 Java 应用程序中发出 curl 请求,当我们获取请求信息时,我们会将其作为http://sarath.somedomain.com:443/helloworld

我们还在 Java 应用程序中打印了 x-forwarded-proto、x-forwarded-port 等标题。

x-forwarded-proto我们在 java 应用程序中获得的值是http x-forwarded-port我们在 java 应用程序中获得的值是443 x-forwarded-for我们在 java 应用程序中获得的值是null

我们主要怀疑的是 Envoy,它负责将 https 协议转换为 http 协议

预期行为

如果我点击说curl https://sarath.somedomain.com/helloworld,在我们的Java应用程序中,我们应该获得请求信息https://sarath.somedomain.com/helloworld

重现错误的步骤

网关:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: sarath-gateway
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "sarath.somedomain.com"
    - "prasath.somedomain.com"

虚拟服务:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sp-vs
spec:
  hosts:
  - "sarath.somedomain.com"
  gateways:
  - sarath-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        port:
          number: 80
        host: javaapp-svc

ALB 入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sarathingress
  namespace: istio-system
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    alb.ingress.kubernetes.io/subnets: subnet-XXXXXXXX,subnet-XXXXXXXX
    alb.ingress.kubernetes.io/security-groups: sg-XXXXXXXX
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:XXXXXXXX:certificate/XXXXXXXX
spec:
  rules:
    - host: sarath.somedomain.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: istio-ingressgateway
              servicePort: 80

应用服务:

apiVersion: v1
kind: Service
metadata:
  name: javaapp-svc
  labels:
    app: javaapp-svc
    name: javaapp-svc
spec:
  selector:
    app: javaapp-svc
  ports:
  - name: http
    port: 80
    targetPort: 9090
    protocol: TCP

istioctl version --remote版本(包括和的输出kubectl version

输出istioctl version --remote

客户端版本:1.2.5 citadel 版本:1.2.5 galley 版本:1.2.5 ingressgateway 版本:1.2.5 pilot 版本:1.2.5 policy 版本:1.2.5 sidecar-injector 版本:1.2.5 telemetry 版本:1.2.5

输出kubectl version

客户端版本:version.Info{Major:“1”,Minor:“12”,GitVersion:“v1.12.7”,GitCommit:“6f482974b76db3f1e0f5d24605a9d1d38fad9a2b”,GitTreeState:“clean”,BuildDate:“2019-03-29T16:15:10Z”,GoVersion:“go1.10.8”,编译器:“gc”,平台:“linux / amd64”}服务器版本:version.Info{Major:“1”,Minor:“13+”,GitVersion:“v1.13.10-eks-5ac0f1”,GitCommit:“5ac0f1d9ab2c254ea2b0ce3534fd72932094c6e1”,GitTreeState:“clean”, BuildDate:“2019-08-20T22:39:46Z”,GoVersion:“go1.11.13”,编译器:“gc”,平台:“linux / amd64”}

Istio 是如何安装的?

Istio 通过 helm 安装,使用的命令如下:

helm install install/kubernetes/helm/istio-init --name istio-init --namespace istio-system
helm template \
  --set gateways.istio-ingressgateway.type=NodePort \
  --set prometheus.enabled=true \
  --set grafana.enabled=true \
  --set tracing.enabled=true \
  --set kiali.enabled=true \
  --set "kiali.dashboard.jaegerURL=http://jaeger-query:16686" \
  --set "kiali.dashboard.grafanaURL=http://grafana:3000" \
   install/kubernetes/helm/istio \
  --name istio --namespace istio-system > $HOME/istio.yaml

发现错误的环境(云供应商、操作系统等)

AWS、EC2 计算机、Amazon Linux v2

答案1

您是否尝试过更新VirtualService设置X-Forwarded-Proto?如下所示:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sp-vs
spec:
  hosts:
  - "sarath.somedomain.com"
  gateways:
  - sarath-gateway
  http:
    - headers:
        request:
          set:
            X-Forwarded-Proto: https
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        port:
          number: 80
        host: javaapp-svc

我相信这应该会给你带来你期望的行为

相关内容