istio 的基本概念:ServiceEntry

ServiceEntry 用来将外部的服务封装成 istio 网格中的服务,为网格内和网格外的服务的统一管理提供基础,详情见 Service Entry Detail

外部服务被封装为 ServiceEntry,可以像 kubernetes 内部的服务一样使用。

封装外部的域名

外部服务是域名或 IP,下面是域名的例子:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc-https
spec:
  hosts:
  - api.dropboxapi.com
  - www.googleapis.com
  - api.facebook.com
  location: MESH_EXTERNAL
  ports:
  - number: 443
    name: https
    protocol: TLS
  resolution: DNS

hosts 是外部服务在网格内的名称,它可以与外部服务的域名相同,可以不同,取决网格内要使用的域名。上面的例子,没有配置外部服务的原始域名,默认原始域名与 hosts 中的域名相同。

如果外部服务在网格内的域名和网格外的域名不同,在 endpoints 中配置原始域名:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc-dns
spec:
  hosts:
  - foo.bar.com
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS
  endpoints:
  - address: us.foo.bar.com
    ports:
      https: 8080
  - address: uk.foo.bar.com
    ports:
      https: 9080
  - address: in.foo.bar.com
    ports:
      https: 7080

resolution 指定解析方式为 DNS。

封装 unix domain socket

unix domain socket 地址也可以封装到网格内:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: unix-domain-socket-example
spec:
  hosts:
  - "example.unix.local"
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: STATIC
  endpoints:
  - address: unix:///var/run/example/socket

为外部服务配置 vip

将外部服务的多个 ip 封装成名为 mymongodb.somedomain 的网格内服务,并设置网格内 vip:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc-mongocluster
spec:
  hosts:
  - mymongodb.somedomain # not used
  addresses:
  - 192.192.192.192/24 # VIPs
  ports:
  - number: 27018
    name: mongodb
    protocol: MONGO
  location: MESH_INTERNAL
  resolution: STATIC
  endpoints:
  - address: 2.2.2.2
  - address: 3.3.3.3

设置外部服务的转发策略

外部服务转发策略的设置方法和内部服务相同,用 DestinationRule 设置,下例子中的 mymongodb.somedomain 是外部服务在网格内的名称:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: mtls-mongocluster
spec:
  host: mymongodb.somedomain
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/myclientcert.pem
      privateKey: /etc/certs/client_private_key.pem
      caCertificates: /etc/certs/rootcacerts.pem

参考