Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os objetos de envelope são um par de recursos personalizados do Kubernetes definidos pelo Gerenciador de Frota do Kubernetes do Azure que permitem aos usuários empacotar recursos para propagação para clusters membros sem causar efeitos colaterais não intencionais no cluster de hub.
Este guia fornece instruções sobre como propagar um conjunto de recursos do cluster de hub para clusters de membros unidos dentro de um objeto de envelope.
Objetos de envelope com CRDs
O Fleet agora suporta dois tipos de CRDs (Custom Resource Definitions) de envelope para propagação de recursos:
- ClusterResourceEnvelope: utilizado para encapsular recursos com escopo de cluster para posicionamento.
- ResourceEnvelope: usado para encapsular recursos com escopo de namespace para posicionamento.
Esses CRDs fornecem uma maneira mais estruturada e nativa do Kubernetes de empacotar recursos para propagação para clusters membros sem causar efeitos colaterais não intencionais no cluster de hub.
Exemplo de ClusterResourceEnvelope
O ClusterResourceEnvelope é um recurso com escopo de cluster que só pode encapsular outros recursos com escopo de cluster. Por exemplo:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourceEnvelope
metadata:
name: example
data:
"webhook.yaml":
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: guard
webhooks:
- name: guard.example.com
rules:
- operations: ["CREATE"]
apiGroups: ["*"]
apiVersions: ["*"]
resources: ["*"]
clientConfig:
service:
name: guard
namespace: ops
admissionReviewVersions: ["v1"]
sideEffects: None
timeoutSeconds: 10
"clusterrole.yaml":
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
Exemplo de ResourceEnvelope
O ResourceEnvelope é um recurso com escopo de namespace que só pode encapsular recursos com escopo de namespace. Por exemplo:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourceEnvelope
metadata:
name: example
namespace: app
data:
"cm.yaml":
apiVersion: v1
kind: ConfigMap
metadata:
name: config
namespace: app
data:
foo: bar
"deploy.yaml":
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress
namespace: app
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: web
image: nginx
Propagando objetos envelopados do cluster central para o cluster membro
Aplicamos nossos objetos de envelope no cluster de hub e, em seguida, usamos um ClusterResourcePlacement objeto para propagar esses recursos do hub para clusters membros.
Exemplo de especificação ClusterResourcePlacement para propagar um ResourceEnvelope:
Aqui está um exemplo de um ClusterResourcePlacement (CRP) que propaga um ResourceEnvelope para um cluster membro, note que, como o ResourceEnvelope está restrito ao namespace, o CRP só precisa selecionar o namespace que contém o objeto envelope.
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp-with-envelope
spec:
policy:
clusterNames:
- kind-cluster-1
placementType: PickFixed
resourceSelectors:
- group: ""
kind: Namespace
name: app
version: v1
revisionHistoryLimit: 10
strategy:
type: RollingUpdate
Exemplo de especificação CRP para propagar um ClusterResourceEnvelope:
Aqui está um exemplo de um ClusterResourcePlacement (CRP) que propaga um ClusterResourceEnvelope para um cluster membro, observe que, como o ClusterResourceEnvelope é de âmbito de cluster, o objeto ClusterResourcePlacement só precisa selecionar o próprio objeto envelope.
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp-with-cluster-envelope
spec:
policy:
clusterNames:
- kind-cluster-1
placementType: PickFixed
resourceSelectors:
- group: placement.kubernetes-fleet.io
kind: ClusterResourceEnvelope
name: example
version: v1beta1
revisionHistoryLimit: 10
strategy:
type: RollingUpdate
Exemplo de estado do CRP para recursos de envelope:
Para o ClusterResourcePlacement que propaga um ResourceEnvelope, o status inclui o namespace selecionado e o próprio objeto envelope, mas não os recursos individuais dentro do envelope. O status tem esta aparência:
status:
selectedResources:
- group: ""
kind: Namespace
name: app
version: v1
- group: placement.kubernetes-fleet.io
kind: ResourceEnvelope
name: example
namespace: app
version: v1beta1
conditions:
- lastTransitionTime: "2023-11-30T19:54:13Z"
message: found all the clusters needed as specified by the scheduling policy
observedGeneration: 2
reason: SchedulingPolicyFulfilled
status: "True"
type: ClusterResourcePlacementScheduled
- lastTransitionTime: "2023-11-30T19:54:18Z"
message: All 1 cluster(s) are synchronized to the latest resources on the hub cluster
observedGeneration: 2
reason: SynchronizeSucceeded
status: "True"
type: ClusterResourcePlacementSynchronized
- lastTransitionTime: "2023-11-30T19:54:18Z"
message: Successfully applied resources to 1 member clusters
observedGeneration: 2
reason: ApplySucceeded
status: "True"
type: ClusterResourcePlacementApplied
placementStatuses:
- clusterName: kind-cluster-1
conditions:
- lastTransitionTime: "2023-11-30T19:54:13Z"
message: 'Successfully scheduled resources for placement in kind-cluster-1:
picked by scheduling policy'
observedGeneration: 2
reason: ScheduleSucceeded
status: "True"
type: ResourceScheduled
- lastTransitionTime: "2023-11-30T19:54:18Z"
message: Successfully Synchronized work(s) for placement
observedGeneration: 2
reason: WorkSynchronizeSucceeded
status: "True"
type: WorkSynchronized
- lastTransitionTime: "2023-11-30T19:54:18Z"
message: Successfully applied resources
observedGeneration: 2
reason: ApplySucceeded
status: "True"
type: ResourceApplied
Nota
Na secção selectedResources, exibimos especificamente o objeto de envelope propagado. Não listamos individualmente todos os recursos contidos no objeto envelope no status.
Após a inspeção do selectedResources, ele indica que o namespace app e o ResourceEnvelope example são propagados com êxito. Os utilizadores podem verificar ainda mais a propagação bem-sucedida dos recursos contidos no objeto envelope, garantindo que a secção failedPlacements no placementStatus do cluster de destino não apareça no estado.
Exemplo de estado do CRP com falha no recurso ResourceEnvelope.
No exemplo abaixo, dentro da seção placementStatus para kind-cluster-1, a seção failedPlacements fornece detalhes sobre um recurso que não pôde ser aplicado, bem como informações sobre o objeto envelope, que continha o recurso.
status:
conditions:
- lastTransitionTime: "2023-12-06T00:09:53Z"
message: found all the clusters needed as specified by the scheduling policy
observedGeneration: 2
reason: SchedulingPolicyFulfilled
status: "True"
type: ClusterResourcePlacementScheduled
- lastTransitionTime: "2023-12-06T00:09:58Z"
message: All 1 cluster(s) are synchronized to the latest resources on the hub cluster
observedGeneration: 2
reason: SynchronizeSucceeded
status: "True"
type: ClusterResourcePlacementSynchronized
- lastTransitionTime: "2023-12-06T00:09:58Z"
message: Failed to apply manifests to 1 clusters, please check the `failedPlacements` status
observedGeneration: 2
reason: ApplyFailed
status: "False"
type: ClusterResourcePlacementApplied
placementStatuses:
- clusterName: kind-cluster-1
conditions:
- lastTransitionTime: "2023-12-06T00:09:53Z"
message: 'Successfully scheduled resources for placement in kind-cluster-1:
picked by scheduling policy'
observedGeneration: 2
reason: ScheduleSucceeded
status: "True"
type: ResourceScheduled
- lastTransitionTime: "2023-12-06T00:09:58Z"
message: Successfully Synchronized work(s) for placement
observedGeneration: 2
reason: WorkSynchronizeSucceeded
status: "True"
type: WorkSynchronized
- lastTransitionTime: "2023-12-06T00:09:58Z"
message: Failed to apply manifests, please check the `failedPlacements` status
observedGeneration: 2
reason: ApplyFailed
status: "False"
type: ResourceApplied
failedPlacements:
- condition:
lastTransitionTime: "2023-12-06T00:09:53Z"
message: 'Failed to apply manifest: namespaces "app" not found'
reason: AppliedManifestFailedReason
status: "False"
type: Applied
envelope:
name: example
namespace: app
type: ResourceEnvelope
kind: Deployment
name: ingress
namespace: app
version: apps/v1
selectedResources:
- kind: Namespace
name: app
version: v1
- group: placement.kubernetes-fleet.io
kind: ResourceEnvelope
name: example
namespace: app
version: v1beta1
Status do CRP com falha no recurso ClusterResourceEnvelope:
Semelhante aos recursos com escopo de namespace, os recursos com escopo de cluster dentro de um ClusterResourceEnvelope também podem não ser aplicados:
status:
conditions:
- lastTransitionTime: "2023-12-06T00:09:53Z"
message: found all the clusters needed as specified by the scheduling policy
observedGeneration: 2
reason: SchedulingPolicyFulfilled
status: "True"
type: ClusterResourcePlacementScheduled
- lastTransitionTime: "2023-12-06T00:09:58Z"
message: Failed to apply manifests to 1 clusters, please check the `failedPlacements` status
observedGeneration: 2
reason: ApplyFailed
status: "False"
type: ClusterResourcePlacementApplied
placementStatuses:
- clusterName: kind-cluster-1
conditions:
- lastTransitionTime: "2023-12-06T00:09:58Z"
message: Failed to apply manifests, please check the `failedPlacements` status
observedGeneration: 2
reason: ApplyFailed
status: "False"
type: ResourceApplied
failedPlacements:
- condition:
lastTransitionTime: "2023-12-06T00:09:53Z"
message: 'Failed to apply manifest: service "guard" not found in namespace "ops"'
reason: AppliedManifestFailedReason
status: "False"
type: Applied
envelope:
name: example
type: ClusterResourceEnvelope
kind: ValidatingWebhookConfiguration
name: guard
group: admissionregistration.k8s.io
version: v1
selectedResources:
- group: placement.kubernetes-fleet.io
kind: ClusterResourceEnvelope
name: example
version: v1beta1