我安装了Istio,
gateways.istio-egressgateway.enabled = true
当我尝试连接到外部数据库时,出现错误。 我没有域(只有ip和port),所以我定义了以下规则:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-db
spec:
hosts:
- external-db.tcp.svc
addresses:
- 190.64.31.232/32
ports:
- number: 3306
name: tcp
protocol: TCP
location: MESH_EXTERNAL
resolution: STATIC
endpoints:
- address: 190.64.31.232
然后我在系统中打开一个Shell(在服务网格中部署) 而且它无法解析名称
$ ping external-db.tcp.svc
ping: ceip-db.tcp.svc: Name or service not known
但是我可以使用IP地址连接
$ ping 190.64.31.232
PING 190.64.31.232 (190.64.31.232) 56(84) bytes of data.
64 bytes from 190.64.31.232: icmp_seq=1 ttl=249 time=1.35 ms
64 bytes from 190.64.31.232: icmp_seq=2 ttl=249 time=1.42 ms
发生了什么事?我必须使用域或IP连接吗? 我可以为我的外部IP定义内部域吗?
答案 0 :(得分:2)
问题在于解决了与您resolution
中ServiceEntry
的配置基本上有关的DNS。
基于istio的documentation:
解决方案确定代理如何解析与服务关联的网络终结点的IP地址,以便它可以路由到其中之一。
由于您已将其配置为STATIC
,所以您要告诉istio-proxy / envoy寻找Endpoint
来解析该DNS名称;因此您需要将Endpoint
定义为Vasily suggested。
如果该DNS名称是在网格外部定义的,另一种简便方法是将resolution
更改为DNS
,这将迫使istio-proxy在请求处理期间查询DNS服务器。
答案 1 :(得分:1)
您可以使用硬编码的IP端点创建无头服务:
---
apiVersion: v1
kind: Service
metadata:
name: external-db
spec:
clusterIP: None
ports:
- protocol: TCP
port: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-db
subsets:
- addresses:
- ip: 190.64.31.232
ports:
- port: 3306
然后您可以将主机external-db.default.svc.cluster.local