Posicionamento inteligente de recursos do Kubernetes entre clusters usando o Azure Kubernetes Fleet Manager
Os desenvolvedores de aplicativos geralmente precisam implantar recursos do Kubernetes em vários clusters. Os operadores de frotas geralmente precisam escolher os melhores clusters para cargas de trabalho com base em heurísticas (como custo de computação) ou recursos disponíveis (como memória e CPU). É tedioso criar, atualizar e rastrear esses recursos do Kubernetes em vários clusters manualmente. Este artigo aborda como você pode abordar esses cenários usando o recurso inteligente de posicionamento de recursos do Kubernetes no Azure Kubernetes Fleet Manager (Kubernetes Fleet).
O recurso de posicionamento de recursos do Kubernetes Fleet pode tomar decisões de agendamento com base nas seguintes propriedades de cluster:
- Contagens de nós
- Custo de computação/memória em clusters de membros de destino
- Disponibilidade de recursos (CPU/memória) em clusters de membros de destino
Para obter mais informações sobre os conceitos neste artigo, consulte Posicionamento de recursos do Kubernetes do cluster de hub para clusters membros.
Pré-requisitos
Você precisa de uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
Você deve ter um recurso da Frota do Kubernetes com um ou mais clusters de membros. Se você não tiver um, siga o início rápido para criar um recurso da Frota do Kubernetes com um cluster de hub. Em seguida, junte-se aos clusters do Serviço Kubernetes do Azure (AKS) como membros.
Gorjeta
Certifique-se de que seus clusters de membros do AKS estejam configurados para que você possa testar o posicionamento usando as propriedades do cluster que lhe interessam (local, contagem de nós, recursos ou custo).
Defina as seguintes variáveis de ambiente:
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBERCLUSTER01=<cluster01> export MEMBERCLUSTER02=<cluster02>
Você precisa da CLI do Azure versão 2.58.0 ou posterior instalada para concluir este artigo. Para instalar ou atualizar, consulte Instalar a CLI do Azure.
Se você ainda não tiver a CLI do Kubernetes (kubectl), poderá instalá-la usando este comando:
az aks install-cli
Você precisa da extensão CLI do
fleet
Azure. Você pode instalá-lo executando o seguinte comando:az extension add --name fleet
Execute o
az extension update
comando para atualizar para a versão mais recente da extensão:az extension update --name fleet
Autorize o kubectl a se conectar ao cluster de hub da Frota do Kubernetes:
az fleet get-credentials --resource-group $GROUP --name $FLEET
Inspecionar propriedades do cluster de membros
Recupere os rótulos, as propriedades e os recursos do cluster membro consultando o cluster de hub. Saída como YAML para que você possa ler os resultados.
kubectl get membercluster $MEMBERCLUSTER01 –o yaml
O arquivo YAML resultante contém detalhes (rótulos e propriedades) que você pode usar para criar políticas de posicionamento. Eis um exemplo:
apiVersion: cluster.kubernetes-fleet.io/v1
kind: MemberCluster
metadata:
annotations:
...
labels:
fleet.azure.com/location: eastus2
fleet.azure.com/resource-group: resource-group
fleet.azure.com/subscription-id: 8xxxxxxx-dxxx-4xxx-bxxx-xxxxxxxxxxx8
name: cluster01
resourceVersion: "123456"
uid: 7xxxxxxx-5xxx-4xxx-bxxx-xxxxxxxxxxx4
spec:
...
status:
...
properties:
kubernetes-fleet.io/node-count:
observationTime: "2024-09-19T01:33:54Z"
value: "2"
kubernetes.azure.com/per-cpu-core-cost:
observationTime: "2024-09-19T01:33:54Z"
value: "0.073"
kubernetes.azure.com/per-gb-memory-cost:
observationTime: "2024-09-19T01:33:54Z"
value: "0.022"
resourceUsage:
allocatable:
cpu: 3800m
memory: 10320392Ki
available:
cpu: 2740m
memory: 8821256Ki
capacity:
cpu: "4"
memory: 14195208Ki
Repita esta etapa para cada cluster de membros adicionado, para identificar os rótulos e as propriedades que você pode usar em sua política.
Preparar uma carga de trabalho para colocação
Em seguida, publique uma carga de trabalho no cluster de hub para que ela possa ser colocada em clusters membros:
Crie um namespace para a carga de trabalho no cluster de hub:
kubectl create namespace test-app
A carga de trabalho de exemplo pode ser implantada no novo namespace no cluster de hub. Como esses tipos de recursos do Kubernetes não exigem encapsulamento, você pode implantá-los sem alterações.
Salve o seguinte YAML em um arquivo chamado
sample-workload.yaml
:apiVersion: v1 kind: Service metadata: name: nginx-service namespace: test-app spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test-app spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16.1 ports: - containerPort: 80
Implante a definição de carga de trabalho no cluster de hub:
kubectl apply -f sample-workload.yaml
Com a definição de carga de trabalho implantada, agora é possível testar a capacidade de posicionamento inteligente do Kubernetes Fleet.
Políticas de posicionamento da carga de trabalho de teste
Você pode usar os exemplos a seguir, juntamente com a documentação conceitual, como guias para escrever seu próprio ClusterResourcePlacement
objeto.
Nota
Se você quiser experimentar cada política de exemplo, certifique-se de excluir o objeto anterior ClusterResourcePlacement
.
Posicionamento com base na contagem de nós do cluster
Este exemplo mostra um classificador de propriedades que usa a Descending
ordem. Essa ordem significa que o Kubernetes Fleet prefere clusters com contagens de nós mais altas.
O cluster com a maior contagem de nós recebe um peso de 20, e o cluster com a menor contagem recebe um peso de 0. Outros agrupamentos recebem pesos proporcionais calculados através da fórmula de cálculo de peso.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
metricSorter:
name: kubernetes-fleet.io/node-count
sortOrder: Descending
Posicionamento com seletor de etiquetas e classificador de propriedades
Neste exemplo, um cluster recebe um peso somente se tiver o rótulo env=prod
. Se o cluster satisfizer essa restrição de rótulo, ele receberá um peso proporcional com base na quantidade de CPU total nesse cluster membro.
Este exemplo demonstra como você pode usar o seletor de rótulo e o classificador de propriedades para preferredDuringSchedulingIgnoredDuringExecution
afinidade. Um cluster de membros que falha no seletor de rótulo não recebe nenhum peso. Os clusters de membros que satisfazem o seletor de rótulo recebem pesos proporcionais, conforme especificado no classificador de propriedades.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
labelSelector:
matchLabels:
env: prod
metricSorter:
name: resources.kubernetes-fleet.io/total-cpu
sortOrder: Descending
Posicionamento com base na memória e no custo do núcleo da CPU
Como o classificador neste exemplo tem uma Ascending
ordem, o Kubernetes Fleet prefere clusters com custos mais baixos de memória e núcleo da CPU. O cluster com o menor custo de memória e núcleo da CPU recebe um peso de 20, e o cluster com o maior peso recebe um peso de 0. Outros agrupamentos recebem pesos proporcionais calculados através da fórmula de cálculo de peso.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 2
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-gb-memory-core-cost
sortOrder: Ascending
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-cpu-core-cost
sortOrder: Ascending
Ver o estado de uma colocação
Se quiser exibir o status de um posicionamento, você pode usar o portal do Azure ou o comando kubectl.
Você pode encontrar detalhes sobre como exibir o progresso de um posicionamento em Usar a API ClusterResourcePlacement para propagar recursos para clusters membros.
Clean up resources (Limpar recursos)
Para obter detalhes sobre como remover um posicionamento de recurso de cluster por meio do portal do Azure ou do comando kubectl, consulte Limpar recursos no artigo sobre propagação de recursos.
Conteúdos relacionados
- Para saber mais sobre a propagação de recursos, consulte a documentação de código aberto do Kubernetes Fleet.
Azure Kubernetes Service