Definir um serviço canónico

Nota: os serviços canónicos são suportados automaticamente na versão 1.6.8 e superiores do Cloud Service Mesh.

Os serviços canónicos são um grupo de cargas de trabalho que implementam os mesmos serviços e APIs. Para os tipos de carga de trabalho suportados, o Cloud Service Mesh cria automaticamente recursos de serviço canónico com base nas informações existentes do servidor da API Kubernetes. Esta página explica o que são as etiquetas que definem automaticamente os serviços canónicos e como pode ajustar manualmente os limites dos seus serviços.

Os tipos de instâncias de cargas de trabalho atualmente suportados são:

  • Pods do Kubernetes (inclusive através de implementações do Kubernetes, serviços do Kube Run, etc.)
  • Instâncias de máquinas virtuais
  • Serviços externos de malha (especificamente, recursos ServiceEntry com uma localização de MESH_EXTERNAL)

O que define os serviços canónicos

O Cloud Service Mesh determina a associação ao serviço canónico lendo a etiqueta no recurso de configuração do Kubernetes associado a cada instância de carga de trabalho:service.istio.io/canonical-name

  • Para os pods, a etiqueta está no recurso de pod do Kubernetes
  • Para VMs, a etiqueta no recurso WorkloadEntry do Istio
  • Para serviços externos, a etiqueta encontra-se no recurso ServiceEntry do Istio

Os serviços canónicos têm o mesmo namespace do Kubernetes que as respetivas instâncias de carga de trabalho associadas e não podem abranger namespaces.

Regras de etiquetagem automática

A malha de serviços na nuvem agrupa automaticamente as suas cargas de trabalho baseadas em VMs e pods em serviços canónicos sem que tenha de fazer nada.

Só tem de tomar medidas para:

  • Ajuste as etiquetas para maior clareza para o utilizador e o leitor
  • Substitua o comportamento predefinido.

Etiquetagem automática em pods do Kubernetes

Os serviços canónicos focam-se nas etiquetas app.kubernetes.io/name e app do Kubernetes. Tenha em atenção que a etiqueta anterior tem precedência.

Se usar qualquer uma destas duas etiquetas nas suas cargas de trabalho, não é necessário fazer mais nada.

Etiquetagem automática em máquinas virtuais

Para criar serviços canónicos nas suas VMs, tem de adicionar as VMs a uma malha de serviços configurando um recurso WorkloadEntry no servidor da API Kubernetes.

Etiquetagem manual

Para aplicar ou substituir manualmente uma etiqueta de serviço canónico, aplique a etiqueta service.istio.io/canonical-name às configurações de recursos de carga de trabalho suportadas.

Para que um serviço externo seja reconhecido como um serviço canónico, tem de etiquetar manualmente a ServiceEntry aplicável.

Etiquetagem manual em pods do Kubernetes

Para implementar muitos pods em simultâneo através de uma implementação, defina a etiqueta service.istio.io/canonical-name no PodTemplateSpec:

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:
        ...

Para etiquetar o serviço canónico de um único pod, adicione a etiqueta service.istio.io/canonical-name à secção labels da configuração do pod:

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

Etiquete máquinas virtuais manualmente

Para etiquetar o serviço canónico de uma única VM/WorkloadEntry, adicione a etiqueta service.istio.io/canonical-name à secção "labels" da configuração do 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:
  ...

Etiquete serviços externos manualmente

Para etiquetar o serviço canónico de um único serviço externo/ServiceEntry, adicione a etiqueta service.istio.io/canonical-name à secção "labels" da configuração 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
  ...

O que se segue?