Linux istio:使用服务注册表发出内部HTTPS请求

Linux istio:使用服务注册表发出内部HTTPS请求,linux,kubernetes,networking,google-kubernetes-engine,istio,Linux,Kubernetes,Networking,Google Kubernetes Engine,Istio,我们使用的是kubernetes(1.17.14-gke.1600)和istio(1.7.4) 我们有几个部署需要使用公共DNS记录相互发出HTTPS请求(mydomain.com)。这里的目标是发出内部HTTPS请求,而不是公开然后返回 我们无法使用“内部”dns(例如my-svc.my-namespace.svc.cluster-domain.example)更改主机,因为有时会将同一主机返回到客户端,以从客户端浏览器发出HTTP请求 我们的服务是在HTTP中公开的,所以我知道如果我们想使用

我们使用的是kubernetes(1.17.14-gke.1600)和istio(1.7.4)
我们有几个部署需要使用公共DNS记录相互发出HTTPS请求(
mydomain.com
)。这里的目标是发出内部HTTPS请求,而不是公开然后返回

我们无法使用“内部”dns(例如
my-svc.my-namespace.svc.cluster-domain.example
)更改主机,因为有时会将同一主机返回到客户端,以从客户端浏览器发出HTTP请求

我们的服务是在HTTP中公开的,所以我知道如果我们想使用HTTPS方案,我们需要通过istio网关

这是我的VirtualService,添加了
mesh
网关,我可以使用公共DNS发出内部HTTP请求,但这不适用于HTTPS

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: myservice
spec:
  gateways:
  - istio-system/gateway
  - mesh
  hosts:
  - myservice.mydomain.com
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: myservice
        port:
          number: 3000
        subset: v1
这是网关:

apiVersion: v1
items:
- apiVersion: networking.istio.io/v1beta1
  kind: Gateway
  metadata:
    name: gateway
    namespace: istio-system
  spec:
    selector:
      istio: ingressgateway
    servers:
    - hosts:
      - '*'
      port:
        name: http
        number: 80
        protocol: HTTP
      tls:
        httpsRedirect: true
    - hosts:
      - '*'
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        credentialName: ingress-cert
        mode: SIMPLE
我已经找到了一个解决问题的方法,就是使用如下服务条目:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: internal-https-redirect
spec:
  endpoints:
  - address: 10.43.2.170 # istio-ingressgateway ClusterIP
  hosts:
  - '*.mydomain.com'
  location: MESH_INTERNAL
  ports:
  - name: internal-redirect
    number: 443
    protocol: HTTPS
  resolution: STATIC

但我不确定这是正确的做法,还是被认为是一种不好的做法


谢谢你

只是出于兴趣,你为什么在内部通话中使用HTTPS?使用mTLS,也可以对请求进行加密。或者您需要在应用程序容器和sidecar之间进行加密吗?@user140547我不需要加密,但正如我上面所说的,相同的主机(带有https)会返回到客户端,以便从客户端浏览器发出https请求。Nuxt SSR就是一个例子。。我不知道是否有办法将不同的主机用于内部请求/公共请求你好,您的解决方案看起来是正确的。一个问题:是否希望在此设置中具有内部
HTTP
->
HTTPS
重定向?然后您可能需要添加虚拟服务和目标规则来实现这一点,中有一个示例。