如何将部署在VM中的服务纳入Istio

85次阅读
没有评论

共计 3124 个字符,预计需要花费 8 分钟才能阅读完成。

这期内容当中丸趣 TV 小编将会给大家带来有关如何将部署在 VM 中的服务纳入 Istio,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Istio 在设计之初,主要面向 Kubernetes 当中的服务。但是在实际场景中,依旧有不少服务部署在 VM 上,Istio 想成为 Service Mesh 事实上的标准,毫无疑问需要支持 VM 部署的服务。

Istio1.6 新增了 WorkloadEntry 自定义资源,通过该资源为 VM 提供了一流的支持。

Istio1.7 增加了安全引导 VM 中运行的服务的身份的功能。最后,Istio 1.7 增加了 Sidecar 的安装包,以支持 CentOS/Red Hat 和现有的 Debian/Ubuntu。

Istio1.8 新增了智能 DNS 代理,它是由 Go 编写的 Istio sidecar 代理,sidecar 上的 Istio agent 将附带一个由 Istiod 动态编程的缓存 DNS 代理。来自应用程序的 DNS 查询会被 pod 或 VM 中的 Istio 代理透明地拦截和服务,该代理会智能地响应 DNS 查询请求,可以实现虚拟机到服务网格的无缝多集群访问。

并且 Istio1.8 新增了 WorkloadGroup 自定义资源,该资源是描述部署在 VM 上的服务实例的集合,旨在模仿现有的用于 Kubernetes 工作负载的 Sidecar 注入和 Deployment 规范模型,以引导 Istio 代理。

通过  WorkloadGroup 方式,实现 VM 实例自动注册的功能目前处于 pre-alpha 状态

WorkloadEntry

WorkloadEntry 用来描述非 Pod 的端点,将 VM 纳入 mesh 中。此时 VM 成为像 Pod 一样的一等公民,可以配置 MUTUAL_TLS。

要创建一个 WorkloadEntry 并将其附加到 ServiceEntry,执行以下操作:

apiVersion: networking.istio.io/v1alpha3
kind: WorkloadEntry
metadata:
 name: vm1
 namespace: ns1
spec:
 address: 1.1.1.1
 labels:
   app: foo
   instance-id: vm-78ad2
   class: vm
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
 name: svc1
 namespace: ns1
spec:
 hosts:
 - svc1.internal.com
 ports:
 - number: 80
   name: http
   protocol: HTTP
 resolution: STATIC
 workloadSelector:
   labels:
     app: foo

这将创建一个包含一组标签和地址的新 WorkloadEntry,以及一个使用 WorkloadSelector 选择带有所需标签的所有端点的 ServiceEntry,在这种情况下,包括为 VM 创建的 WorkloadEntry。

请注意,ServiceEntry 可以使用相同的选择器引用 Pod 和 WorkloadEntries。现在,Istio 可以对 VM 和 Pod 进行相同的处理,而不必将它们分开。

VM 自动注册

WorkloadGroup 主要用于 WorkloadEntry 自动注册,该功能在实际场景中比较实用。事实上我们部署在 VM 当中的服务,一般都会配置自动伸缩,这就要求我们的服务必须可以自动注册到 mesh 中。

如何实现自动注册那?

首先我们需要做一些准备工作:

在安装 istiod 的时候,启用自动注册的功能。

$ istioctl install --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true

部署一个 east-west gateway。用于暴露 istiod 服务,从而可以让 VM 上的 Sidecar 可以和 istiod 通信。

然后我们创建如下的 WorkloadGroup:

apiVersion: networking.istio.io/v1alpha3
kind: WorkloadGroup
metadata:
 name: python-http
 namespace: vm
spec:
 metadata:
   annotations: {}
   labels:
     app: python-http
 template:
   ports: {}
   serviceAccount: my-vm

这样我们在每个 vm 上 python-http 实例启动后,都会自动在 mesh 中创建一个 WorkloadEntry。而创建的 WorkloadEntry,包含了 VM 实例的 ip 和元数据。此时我们就可以创建一个 ServiceEntry,通过标签选择器选择我们的 WorkloadEntry。然后 mesh 中的其他服务就可以通过 ServiceEntry 中的 hosts,对我们的 python-http 服务进行访问。

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
 name: vm-workload-svc
 namespace: vm
spec:
 hosts:
 - vmservice.example.com
 location: MESH_INTERNAL
 ports:
 - number: 80
   name: http
   protocol: HTTP
   targetPort: 9090
 resolution: STATIC
 workloadSelector:
   labels:
     app: python-http

关于 VM 详细的安装步骤,参考官方文档。

智能 DNS

其实完成 VM 自动注册,并不能通过主机名实现虚拟机到服务网格的无缝访问。例如,如果我们在 VM 上部署 Istio sidecar 代理,我们将无法通过主机名(例如 httpbin.default.svc.cluster.local)访问网格和 Kubernetes 集群中服务。此时我们需要智能 DNS。

在 Istio 1.8 中,Sidecar 现在具有一个 DNS 代理,该代理缓存网格中的端点和 ServiceEntry 资源创建的端点。通过 Iptables 规则,拦截 dns 请求到 sidecar 本地 dns server,在缓存中可以解析的主机名,则直接返回解析结果,如果找不到,它将作为普通 DNS 代理委派给系统 DNS。这样 vm 上的服务可以通过主机名访问 mesh 中的服务。

智能 DNS 默认没有启用,我们在安装 istio 的时候,可以通过如下参数启用该功能:

--set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE=true

当 VM 连接到 Istio 控制平面时,它通过“东西向网关”进行连接。该网关实际上只是一个专门为网格内部流量指定的 Istio 网关,现在,东西向网关已经是 Istio 1.8 中的推荐部署。一旦从 VM Sidecar 到 Istio 控制平面建立了连接,便会创建适当的 WorkloadEntry 资源,并使 VM Sidecar 可以解析集群中的所有服务。从 VM 上部署服务可以直接访问 httpbin.default.svc.cluster.local。DNS 名称由代理解析,并通过“东西方网关”路由到网格中的适当服务。

上述就是丸趣 TV 小编为大家分享的如何将部署在 VM 中的服务纳入 Istio 了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3124字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)