定义规范化服务

注意:Cloud Service Mesh 1.6.8 及更高版本会自动支持规范化服务。

规范服务是一组实现相同服务和 API 的工作负载。对于受支持的工作负载类型,Cloud Service Mesh 会根据 Kubernetes API 服务器中的现有信息自动创建规范服务资源。本页介绍哪些标签自动定义规范化服务,以及如何手动调整服务的边界。目前支持的工作负载实例类型包括:

  • Kubernetes Pod(包括通过 Kubernetes Deployment、Kube Run Service 等)
  • 虚拟机实例
  • 网格外部服务(具体而言,位置为 MESH_EXTERNAL 的 ServiceEntry 资源)

规范化服务的定义

Cloud Service Mesh 通过读取与每个工作负载实例关联的 Kubernetes 配置资源的 service.istio.io/canonical-name 标签来确定规范化服务成员资格:

  • 对于 Pod,标签位于 Kubernetes Pod 资源中
  • 对于虚拟机,标签位于 Istio WorkloadEntry 资源中
  • 对于外部服务,标签位于 Istio ServiceEntry 资源中

Canonical Services 与 Kubernetes 命名空间 并且不能跨越多个命名空间

自动添加标签规则

Cloud Service Mesh 会自动将基于 Pod 和虚拟机的工作负载 您无需执行任何操作。 您只需执行以下操作即可:

  • 调整用户/读取者清晰度的标签
  • 替换默认行为。

在 Kubernetes Pod 中自动添加标签

规范化服务侧重于 Kubernetes app.kubernetes.io/nameapp 标签。请注意,前一个标签优先。 如果您在工作负载上使用这两个标签中的任意一个,则无需执行进一步操作。

在虚拟机中自动添加标签

如需在虚拟机上构建规范化服务,您必须在 Kubernetes API 服务器中配置 WorkloadEntry 资源,从而将虚拟机添加到服务网格。

手动添加标签

如需手动应用或替换规范化服务标签,请将 service.istio.io/canonical-name 标签应用到受支持的工作负载资源配置。为了使外部服务被识别为规范化服务,您必须手动为适用的 ServiceEntry 添加标签。

在 Kubernetes Pod 中手动添加标签

如需使用 Deployment 一次部署多个 Pod,请在 PodTemplateSpec 上设置 service.istio.io/canonical-name 标签:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  namespace: my-namespace
spec:
  replicas: 3
  template:
    metadata:
      labels:
        service.istio.io/canonical-name: my-service
    spec:
      containers:
        ...

如需为单个 Pod 的规范化服务添加标签,请将 service.istio.io/canonical-name 标签添加到 Pod 配置的 labels 部分:

apiVersion: v1
kind: Pod
metadata:
  name: my-test-pod
  namespace: my-namespace
  labels:
    service.istio.io/canonical-name: my-service
spec:
  ...

手动为虚拟机添加标签

如需为单个虚拟机/WorkloadEntry 的规范化服务添加标签,请将 service.istio.io/canonical-name 标签添加到 WorkloadEntry 配置的“标签”部分:

apiVersion: networking.istio.io/v1alpha3
kind: WorkloadEntry
metadata:
  name: my-vm-123
  namespace: my-namespace
  labels:
    service.istio.io/canonical-name: my-service
spec:
  ...

手动为外部服务添加标签

如需为单个外部服务/ServiceEntry 的规范化服务添加标签,请将 service.istio.io/canonical-name 标签添加到 ServiceEntry 配置的“标签”部分:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: example-com
  namespace: my-namespace
  labels:
    service.istio.io/canonical-name: an-external-service
spec:
   location: MESH_EXTERNAL
  ...

后续步骤