Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: ✔️ Gerenciador de Frota com cluster do hub
O posicionamento inteligente de recursos do Azure Kubernetes Fleet Manager pode implantar o mesmo recurso em vários clusters em toda a frota. Muitas vezes, você precisa modificar a configuração de recursos para impor regras em torno do comportamento em ambientes diferentes (desenvolvimento, teste, prod). Para essa finalidade, o Gerenciador de Frota fornece substituições de recursos, que oferecem uma funcionalidade conceitualmente semelhante à maneira como os modelos do Helm e os patches do Kustomize são usados.
Modificar uma configuração de recurso é útil em situações como:
- Você deseja usar uma
ClusterRolechamadasecret-readerem todos os clusters, mas tem um conjunto menor de ações permitidas para a função nos clusters de produção. - Você deseja usar o mesmo
Deploymentem todos os clusters, mas usar uma imagem ou porta de contêiner diferente em seus clusters de produção.
Este artigo mostra como criar substituições para os recursos implantados pelo posicionamento de recursos do Gerenciador de Frota.
O Gerenciador de Frota do Kubernetes do Azure dá suporte a dois escopos para substituições:
-
Escopo do cluster: usar
ClusterResourceOverridejuntamente comClusterResourcePlacementpara os administradores de frota gerenciando as alterações no nível da infraestrutura. -
Escopo do namespace: usar
ResourceOverridejunto comResourcePlacementpara as equipes de aplicativos que estejam gerenciando as distribuições em seus respectivos namespaces específicos.
Selecione o escopo mais aplicável a você nas opções de tipo de escopo na parte superior do artigo.
Substituições de recursos no escopo do cluster
Um ClusterResourceOverride tem as propriedades a seguir:
-
clusterResourceSelectors: especifica o conjunto de recursos de cluster selecionados para substituição. -
policy: especifica o conjunto de regras a serem aplicadas aos recursos de cluster selecionados.
Observação
Policy as definições são as mesmas para recursos com escopo de cluster e namespace.
O exemplo ClusterRole a seguir nomeado secret-reader demonstra como ClusterResourceOverride funciona.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
Selecionando recursos de cluster
Um ClusterResourceOverride pode incluir um ou mais clusterResourceSelector para escolher quais recursos substituir. Cada um clusterResourceSelector dá suporte aos campos a seguir.
-
group: o grupo de API do recurso. -
version: a versão da API do recurso. -
kind: o tipo do recurso. -
name: o nome do recurso.
Observação
Se você selecionar um namespace em ClusterResourceSelector, a substituição se aplicará a todos os recursos no namespace.
Usando nosso exemplo ClusterRole, vamos ver como o selecionamos em um ClusterResourceOverride.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
name: example-cro
spec:
clusterResourceSelectors:
- group: rbac.authorization.k8s.io
kind: ClusterRole
version: v1
name: secret-reader
Substituições de recursos no escopo do namespace
Um ResourceOverride tem as propriedades a seguir:
-
resourceSelectors: especifica o conjunto de recursos selecionados para substituição. -
policy: especifica o conjunto de regras a serem aplicadas aos recursos selecionados.
Observação
Policy as definições são as mesmas para recursos com escopo de cluster e namespace.
Para demonstrar como ResourceOverride funciona, use o exemplo Deployment a seguir chamado nginx-sample.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-sample
namespace: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
Selecionando recursos de namespace
Um ResourceOverride pode incluir um ou mais resourceSelector para escolher quais recursos substituir. Cada um resourceSelector dá suporte aos seguintes campos:
-
group: o grupo de API do recurso. -
version: a versão da API do recurso. -
kind: o tipo do recurso. -
name: o nome do recurso.
Você determina o namespace do recurso a ser substituído especificando o conjunto de namespace nos metadata da ResourceOverride.
Usando o exemplo Deployment, você pode ver como selecioná-lo em um ResourceOverride.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: example-resource-override
namespace: nginx-demo
spec:
resourceSelectors:
- group: apps
kind: Deployment
version: v1
name: nginx-sample
Importante
- Se você selecionar um namespace em
resourceSelector(kind: Namespace), a substituição se aplicará a todos os recursos no namespace. - O
ResourceOverrideprecisa estar no mesmo namespace que o recurso a ser sobrescrito.
Agora que você selecionou o recurso, vamos examinar como configurar a substituição usando uma policy.
Policy
Um policy consiste em um conjunto de overrideRules que especificam as alterações a serem aplicadas aos recursos selecionados. Cada um overrideRules dá suporte aos seguintes campos:
-
clusterSelector: especifica o conjunto de clusters ao qual a regra de substituição se aplica. -
jsonPatchOverrides: especifica as alterações a serem aplicadas aos recursos selecionados.
Seletor de cluster
Use o clusterSelector campo overrideRules para especificar os clusters aos quais a regra se aplica.
clusterSelector suporta o seguinte campo:
-
clusterSelectorTerms: uma lista de termos que especificam os critérios para selecionar clusters. Cada termo inclui um campolabelSelectorque define um conjunto de rótulos para correspondência.
Importante
Somente labelSelector é suportado no campo clusterSelectorTerms.
Substituições de patch JSON
Use jsonPatchOverrides em overrideRules para especificar as alterações a serem aplicadas aos recursos selecionados. A JsonPatch propriedade dá suporte aos seguintes campos:
op: a operação a ser executada. As operações com suporte incluem:-
add: adiciona um novo valor ao caminho especificado. -
remove: remove o valor no caminho especificado. -
replace: substitui o valor no caminho especificado.
-
path: o caminho para o campo a ser modificado. As diretrizes sobre como especificar caminhos incluem:- Deve começar com um caractere de barra (
/). - Não pode estar vazio ou conter uma cadeia de caracteres vazia.
- Não pode ser um
TypeMetacampo (/kindou/apiVersion). - Não pode ser um
Metadatacampo (/metadata/nameou/metadata/namespace), exceto os campos/metadata/labelse/metadata/annotations. - Não pode ser nenhum campo no status do recurso.
Exemplos de caminhos válidos incluem:
/metadata/labels/new-label/metadata/annotations/new-annotation/spec/template/spec/containers/0/resources/limits/cpu/spec/template/spec/containers/0/resources/requests/memory
- Deve começar com um caractere de barra (
value: o valor a ser adicionado, removido ou substituído. Seopestiverremove, não é possível especificarvalue.
Os jsonPatchOverrides campos aplicam um patch JSON nos recursos selecionados seguindo RFC 6902.
Estendendo nosso exemplo, você configura um policy para remover o verbo list do ClusterRole chamado secret-reader nos clusters rotulados com env:prod.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
name: example-cro
spec:
clusterResourceSelectors:
- group: rbac.authorization.k8s.io
kind: ClusterRole
version: v1
name: secret-reader
policy:
overrideRules:
- clusterSelector:
clusterSelectorTerms:
- labelSelector:
matchLabels:
env: prod
jsonPatchOverrides:
- op: remove
path: /rules/0/verbs/2
Estendendo nosso exemplo, você configura um policy para substituir a imagem do contêiner em Deployment pela imagem nginx:1.30.0 para clusters com o rótulo env: prod.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: example-resource-override
namespace: nginx-demo
spec:
resourceSelectors:
- group: apps
kind: Deployment
version: v1
name: test-nginx
policy:
overrideRules:
- clusterSelector:
clusterSelectorTerms:
- labelSelector:
matchLabels:
env: prod
jsonPatchOverrides:
- op: replace
path: /spec/template/spec/containers/0/image
value: "nginx:1.30.0"
Definir várias substituições
Adicione vários campos jsonPatchOverrides a overrideRules para aplicar várias alterações aos recursos do cluster selecionados. Veja um exemplo:
Este exemplo remove os verbos list e watch no exemplo ClusterRole nomeado secret-reader em clusters com o rótulo env: prod.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
name: cro-1
spec:
clusterResourceSelectors:
- group: rbac.authorization.k8s.io
kind: ClusterRole
version: v1
name: secret-reader
policy:
overrideRules:
- clusterSelector:
clusterSelectorTerms:
- labelSelector:
matchLabels:
env: prod
jsonPatchOverrides:
- op: remove
path: /rules/0/verbs/2
- op: remove
path: /rules/0/verbs/1
Este exemplo substitui tanto a imagem do contêiner quanto a porta no Deployment com 443 para clusters com o rótulo env: prod.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: example-resource-override
namespace: nginx-demo
spec:
resourceSelectors:
- group: apps
kind: Deployment
version: v1
name: test-nginx
policy:
overrideRules:
- clusterSelector:
clusterSelectorTerms:
- labelSelector:
matchLabels:
env: prod
jsonPatchOverrides:
- op: replace
path: /spec/template/spec/containers/0/image
value: "nginx:1.30.0"
- op: replace
path: /spec/template/spec/containers/0/ports/0/containerPort
value: "443"
Variáveis reservadas no valor de substituição do patch JSON
O value da regra de substituição de patch JSON substitui variáveis reservadas no posicionamento. Variáveis reservadas com suporte no momento:
-
${MEMBER-CLUSTER-NAME}: substituído pelo nome domemberCluster.
Por exemplo, para criar um nome de host do DNS do Azure que contenha o nome do cluster, o exemplo ResourceOverride adiciona um valor de fleet-clustername-eastus aos clusters na região do Azure eastus.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: ro-kuard-demo-eastus
namespace: kuard-demo
spec:
placement:
name: crp-kuard-demo
resourceSelectors:
- group: ""
kind: Service
version: v1
name: kuard-svc
policy:
overrideRules:
- clusterSelector:
clusterSelectorTerms:
- labelSelector:
matchLabels:
fleet.azure.com/location: eastus
jsonPatchOverrides:
- op: add
path: /metadata/annotations
value:
{"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-eastus"}
Várias regras de substituição
Adicione vários overrideRules a um policy campo para aplicar várias alterações aos recursos selecionados. Aqui está um exemplo para ResourceOverride.
Este exemplo substitui a imagem de contêiner no Deployment por:
- A imagem
nginx:1.20.0para os clusters com o rótuloenv: prod. - A imagem
nginx:latestpara os clusters com o rótuloenv: test.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: ro-1
namespace: test
spec:
resourceSelectors:
- group: apps
kind: Deployment
version: v1
name: test-nginx
policy:
overrideRules:
- clusterSelector:
clusterSelectorTerms:
- labelSelector:
matchLabels:
env: prod
jsonPatchOverrides:
- op: replace
path: /spec/template/spec/containers/0/image
value: "nginx:1.20.0"
- clusterSelector:
clusterSelectorTerms:
- labelSelector:
matchLabels:
env: test
jsonPatchOverrides:
- op: replace
path: /spec/template/spec/containers/0/image
value: "nginx:latest"
Usar com o posicionamento de recursos do cluster
Crie um
ClusterResourcePlacementpara especificar as regras de posicionamento de modo a distribuir as substituições de recursos do cluster na infraestrutura do cluster. O código a seguir é um exemplo. Certifique-se de selecionar o recurso apropriado.apiVersion: placement.kubernetes-fleet.io/v1 kind: ClusterResourcePlacement metadata: name: crp spec: resourceSelectors: - group: rbac.authorization.k8s.io kind: ClusterRole version: v1 name: secret-reader policy: placementType: PickAll affinity: clusterAffinity: requiredDuringSchedulingIgnoredDuringExecution: clusterSelectorTerms: - labelSelector: matchLabels: env: prodEste exemplo distribui recursos em todos os clusters rotulados com
env: prod. À medida que as alterações são implementadas, as configurações correspondentesClusterResourceOverridesão aplicadas aos clusters designados. A seleção de um recurso de função de cluster correspondente,secret-reader, dispara a aplicação das configurações nos clusters.Aplique o
ClusterResourcePlacementusando o comandokubectl apply.kubectl apply -f cluster-resource-placement.yamlVerifique se o
ClusterResourceOverriderecurso foi aplicado aos recursos selecionados verificando o status doClusterResourcePlacementrecurso por meio dokubectl describecomando:kubectl describe clusterresourceplacement crpSua saída deve ser semelhante ao exemplo a seguir:
Status: Conditions: ... Last Transition Time: 2024-04-27T04:18:00Z Message: The selected resources are successfully overridden in the 10 clusters Observed Generation: 1 Reason: OverriddenSucceeded Status: True Type: ClusterResourcePlacementOverridden ... Observed Resource Index: 0 Placement Statuses: Applicable Cluster Resource Overrides: example-cro-0 Cluster Name: member-50 Conditions: ... Message: Successfully applied the override rules on the resources Observed Generation: 1 Reason: OverriddenSucceeded Status: True Type: Overridden ...A condição
ClusterResourcePlacementOverriddenindica se a substituição de recursos foi aplicada com êxito aos recursos selecionados nos clusters. Cada cluster mantém sua própriaApplicable Cluster Resource Overrideslista. Essa lista contém o instantâneo da substituição do recurso de cluster, se relevante. Mensagens de status individuais para cada cluster indicam se as regras de substituição foram aplicadas com êxito.
Usar com posicionamento de recursos
Crie um recurso
ClusterResourcePlacementpara especificar as regras de posicionamento de modo a distribuir as substituições de recursos na infraestrutura do cluster. O código a seguir é um exemplo. Selecione os namespaces apropriados.apiVersion: placement.kubernetes-fleet.io/v1 kind: ClusterResourcePlacement metadata: name: crp-example spec: resourceSelectors: - group: "" kind: Namespace name: test-namespace version: v1 policy: placementType: PickAll affinity: clusterAffinity: requiredDuringSchedulingIgnoredDuringExecution: clusterSelectorTerms: - labelSelector: matchLabels: env: prod - labelSelector: matchLabels: env: testDistribui recursos dentro de
test-namespaceem todos os clusters rotulados comenv:prodeenv:test. À medida que as alterações são implementadas, as configurações correspondentesResourceOverridesão aplicadas aos recursos designados. A seleção de um recursomy-deploymentde implantação correspondente dispara a aplicação das configurações para os recursos designados.Aplique o
ClusterResourcePlacementrecurso usando okubectl applycomando:kubectl apply -f cluster-resource-placement.yamlVerifique se o
ResourceOverriderecurso foi aplicado aos recursos selecionados verificando o status doClusterResourcePlacementrecurso por meio dokubectl describecomando:kubectl describe clusterresourceplacement crp-exampleSua saída deve ser semelhante ao exemplo a seguir:
Status: Conditions: ... Message: The selected resources are successfully overridden in the 10 clusters Observed Generation: 1 Reason: OverriddenSucceeded Status: True Type: ClusterResourcePlacementOverridden ... Observed Resource Index: 0 Placement Statuses: Applicable Resource Overrides: Name: ro-1-0 Namespace: test-namespace Cluster Name: member-50 Conditions: ... Last Transition Time: 2024-04-26T22:57:14Z Message: Successfully applied the override rules on the resources Observed Generation: 1 Reason: OverriddenSucceeded Status: True Type: Overridden ...A condição
ClusterResourcePlacementOverriddenindica se a substituição de recursos foi bem-sucedida nos recursos selecionados. Cada cluster mantém sua própriaApplicable Resource Overrideslista. Esta lista contém o instantâneo de substituição de recursos, se relevante. Mensagens de status individuais para cada cluster indicam se as regras de substituição foram aplicadas com êxito.