我们正在使用 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
但我不确定这样做是否正确,或者这是否被认为是不好的做法。
谢谢你
使用您正在运行的 VirtualService 设置,您可以尝试向集群上的 DNS 设置本身添加重写规则,以指向入口网关的负载均衡器/集群 IP,而不是添加 ServiceEntry。这将导致从您的服务网格发起的流量到达入口网关,而您无需随时知道实际 IP。
这是 coredns 的示例,您可能正在使用它。
这种方法的缺点是,您需要找到一种适合您的设置的方法,将其注入到 coredns 配置映射中,而不是像 ServiceEntry 那样部署额外的配置。
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
...
rewrite name exact myservice.mydomain.com istio-gateway.istio-system.svc.cluster.local
...
loop
reload
loadbalance
}