虚拟机架构

在阅读本文档之前,请务必查看 Istio 的架构部署模型。此页面基于这些文档,解释了如何扩展 Istio 以支持将虚拟机加入网格。

Istio 的虚拟机支持允许将 Kubernetes 集群外部的工作负载连接到网格。这使传统应用程序或不适合在容器化环境中运行的应用程序能够获得 Istio 为 Kubernetes 内部运行的应用程序提供的所有优势。

对于在 Kubernetes 上运行的工作负载,Kubernetes 平台本身提供了各种功能,例如服务发现、DNS 解析和健康检查,而这些功能在虚拟机环境中通常不存在。Istio 为在虚拟机上运行的工作负载启用了这些功能,此外还允许这些工作负载利用 Istio 功能,例如双向 TLS (mTLS)、丰富的遥测和高级流量管理功能。

下图显示了包含虚拟机的网格架构

在此网格中,存在一个 网络,其中 Pod 和虚拟机可以彼此直接通信。

控制平面流量(包括 XDS 配置和证书签名)通过集群中的网关发送。这确保了虚拟机在引导时具有稳定的地址可连接。Pod 和虚拟机可以彼此直接通信,而无需任何中间网关。

A service mesh with a single network and virtual machines
具有单个网络和虚拟机的服务网格

服务关联

Istio 提供两种机制来表示虚拟机工作负载

  • WorkloadGroup 表示共享共同属性的虚拟机工作负载的逻辑组。这类似于 Kubernetes 中的 Deployment
  • WorkloadEntry 表示虚拟机工作负载的单个实例。这类似于 Kubernetes 中的 Pod

创建这些资源(WorkloadGroupWorkloadEntry)不会导致任何资源的供应或任何虚拟机工作负载的运行。相反,这些资源只是引用这些工作负载并告知 Istio 如何适当地配置网格。

将虚拟机工作负载添加到网格时,需要创建一个 WorkloadGroup,作为每个 WorkloadEntry 实例的模板。

apiVersion: networking.istio.io/v1
kind: WorkloadGroup
metadata:
  name: product-vm
spec:
  metadata:
    labels:
      app: product
  template:
    serviceAccount: default
  probe:
    httpGet:
      port: 8080

一旦虚拟机已配置并添加到网格,Istio 控制平面将自动创建一个相应的 WorkloadEntry。例如

apiVersion: networking.istio.io/v1
kind: WorkloadEntry
metadata:
  annotations:
    istio.io/autoRegistrationGroup: product-vm
  labels:
    app: product
  name: product-vm-1.2.3.4
spec:
  address: 1.2.3.4
  labels:
    app: product
  serviceAccount: default

WorkloadEntry 资源描述了工作负载的单个实例,类似于 Kubernetes 中的 Pod。当工作负载从网格中移除时,WorkloadEntry 资源将被自动移除。此外,如果在 WorkloadGroup 资源中配置了任何探测器,Istio 控制平面会自动更新关联的 WorkloadEntry 实例的健康状态。

为了让消费者可靠地调用您的工作负载,建议声明 Service 关联。这允许客户端访问稳定的主机名,例如 product.default.svc.cluster.local,而不是短暂的 IP 地址。这还使您能够通过 DestinationRuleVirtualService API 使用 Istio 中的高级路由功能。

任何 Kubernetes 服务都可以通过选择器字段透明地选择 Pod 和虚拟机中的工作负载,这些字段分别与 Pod 和 WorkloadEntry 标签匹配。

例如,名为 productServicePodWorkloadEntry 组成。

Service Selection

通过此配置,对 product 的请求将在 Pod 和虚拟机工作负载实例之间进行负载均衡。

DNS

Kubernetes 在 Pod 中为 Service 名称提供 DNS 解析,允许 Pod 通过稳定的主机名轻松地相互通信。

对于虚拟机扩展,Istio 通过DNS 代理 提供类似的功能。此功能将虚拟机工作负载的所有 DNS 查询重定向到 Istio 代理,该代理维护主机名到 IP 地址的映射。

因此,在虚拟机上运行的工作负载可以透明地调用 Service(类似于 Pod),而无需任何额外的配置。

此信息是否有用?
您是否有任何改进建议?

感谢您的反馈!