Para mais informações sobre a programação, consulte o artigo Programação, antecipação e remoção na documentação do Kubernetes.
Esta página mostra como especificar tolerâncias, afinidade de nós e configurações de agendamento de restrições de dispersão de topologia para instâncias do pool principal e de leitura no seu manifesto do Kubernetes.
Para informações sobre como definir taints nos nós, consulte o artigo Taints e tolerâncias na documentação do Kubernetes.
Especifique tolerâncias
Para agendar os seus AlloyDB Omni Pods para nós sem outros Pods de aplicações ou para corresponder a uma mancha específica definida nesses nós, aplique uma ou mais tolerâncias aos nós da seguinte forma:
- Modifique o manifesto do cluster do operador do Kubernetes do AlloyDB Omni para incluir uma secção
tolerationsna secçãoschedulingConfigde qualquer uma das seguintes secções:primarySpecpara instâncias principaisspecpara instâncias do conjunto de leitura
tolerations: - key: "TAINT_KEY" operator: "OPERATOR_VALUE" value: "VALUE" effect: "TAINT_EFFECT"Substitua o seguinte:
TAINT_KEY: o nome único existente da chave de contaminação, como o nome do anfitrião de um nó ou outro valor inferido localmente ao qual a tolerância se aplica. A chave de restrição já está definida num nó. Um campo vazio e oOPERATOR_VALUEdefinido comoexistssignificam que a tolerância tem de corresponder a todos os valores e a todas as chaves.OPERATOR_VALUE: representa a relação de uma chave com um conjunto de valores. Defina o parâmetro para uma das seguintes opções:exists: o Kubernetes corresponde a qualquer valor se a restrição for definida, independentemente do valor da restrição.equal: o Kubernetes não agenda um pod para um nó se os valores forem diferentes. O operador requer o valortrueda mancha.
VALUE: o valor de contaminação com o qual a tolerância corresponde. Se o operador for Exists, o valor está vazio. Caso contrário, é uma string normal. Por exemplo,true.TAINT_EFFECT: indica o efeito de contaminação a corresponder. Um campo vazio significa que todos os efeitos de contaminação têm de ser correspondentes. Defina o parâmetro para uma das seguintes opções:NoSchedule: o Kubernetes não agenda novos pods no nó contaminado.PreferNoSchedule: o Kubernetes evita colocar novos pods no nó contaminado, a menos que seja necessário.NoExecute: o Kubernetes despeja os pods existentes que não toleram a mancha.
- Volte a aplicar o manifesto.
Defina a afinidade de nós
O programador do Kubernetes usa a afinidade de nós como um conjunto de regras para determinar onde colocar um Pod. A afinidade de nós é uma versão mais flexível e expressiva dos seletores de nós.
Para especificar que nós têm de ser agendados para executar a sua base de dados, siga estes passos:
- Modifique o manifesto do cluster da base de dados para incluir a secção
nodeaffinityapós a secçãotolerationsna secçãoschedulingConfigdeprimarySpecpara instâncias principais ouspecpara instâncias do conjunto de leitura:nodeaffinity: NODE_AFFINITY_TYPE: - weight: WAIT_VALUE preference: matchExpressions: - key: LABEL_KEY operator: OPERATOR_VALUE values: - LABEL_KEY_VALUESubstitua o seguinte:
-
NODE_AFFINITY_TYPE: defina o parâmetro para uma das seguintes opções:requiredDuringSchedulingIgnoredDuringExecution: o Kubernetes agenda o pod exatamente com base nas regras definidas.preferredDuringSchedulingIgnoredDuringExecution: o programador do Kubernetes tenta encontrar um nó que cumpra a regra definida para o agendamento. No entanto, se não existir esse nó, o Kubernetes agenda para um nó diferente no cluster.
WAIT_VALUE: indica a ponderação da preferência para os nós especificados. Os valores mais elevados indicam uma preferência mais forte. Os valores válidos variam entre1e100.LABEL_KEY: a etiqueta do nó para a chave que serve como indicador de localização e facilita a distribuição uniforme de pods no cluster. Por exemplo,disktype=ssd.OPERATOR_VALUE: representa a relação de uma chave com um conjunto de valores. Defina o parâmetro para uma das seguintes opções:-
In: a matriz de valores não pode estar vazia. -
NotIn: a matriz de valores não pode estar vazia. -
Exists: a matriz de valores tem de estar vazia. -
DoesNotExist: a matriz de valores tem de estar vazia. -
Gt: a matriz de valores tem de ter um único elemento, que é interpretado como um número inteiro. -
Lt: a matriz de valores tem de ter um único elemento, que é interpretado como um número inteiro.
-
LABEL_KEY_VALUE: o valor da chave do marcador. Defina o parâmetro como uma matriz de valores de string da seguinte forma:- Se o operador for
InouNotIn, a matriz de valores não pode estar vazia. - Se o operador for
ExistsouDoesNotExist, a matriz de valores tem de estar vazia. - Se o operador for
GtouLt, a matriz de valores tem de ter um único elemento, que é interpretado como um número inteiro.
- Se o operador for
-
- Volte a aplicar o manifesto.
Defina a antiafinidade de pods
A antiafinidade de pods impede que o programador do Kubernetes programe pods no mesmo nó ou no mesmo domínio de topologia, como zonas ou regiões. Isto garante que as réplicas de um serviço são distribuídas para evitar ter um único ponto de falha.
Para ambientes de produção, recomendamos que use esta regra de antiafinidade para agendar pods de base de dados em nós diferentes dos pods do operador através das seguintes etiquetas:
schedulingconfig:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: alloydb-omni-operator
namespaces:
- alloydb-omni-system
topologyKey: kubernetes.io/hostname
Para adicionar regras de antiafinidade de pods à sua base de dados, siga estes passos:
Modifique o ficheiro do manifesto do cluster da base de dados para incluir o campo
podAntiAffinity. Tem de adicionarpodAntiAffinityao camposchedulingConfigno campoprimarySpecpara instâncias principais ou no campospecpara instâncias do conjunto de leitura.podAntiAffinity: POD_ANTI_AFFINITY_TYPE: - weight: WEIGHT_VALUE podAffinityTerm: labelSelector: matchExpressions: - key: LABEL_KEY operator: OPERATOR_VALUE values: - LABEL_VALUE topologyKey: "TOPOLOGY_KEY"Substitua as seguintes variáveis:
POD_ANTI_AFFINITY_TYPE: use um dos seguintes valores:requiredDuringSchedulingIgnoredDuringExecution: o Kubernetes agenda o pod apenas nas regras definidas.preferredDuringSchedulingIgnoredDuringExecution: o programador do Kubernetes tenta encontrar um nó que satisfaça a regra definida. Se não forem encontrados esses nós, o Kubernetes agenda o pod para outro nó no cluster.
WEIGHT_VALUE: usado quandoPOD_ANTI_AFFINITY_TYPEestá definido comopreferredDuringSchedulingIgnoredDuringExecution. Indica a preferência dos nós especificados. Os valores variam entre1e100.LABEL_KEY: serve como indicador de localização e facilita a distribuição uniforme de pods no cluster.OPERATOR_VALUE: operador usado para fazer a correspondência com os agrupamentos especificados. Use um dos seguintes valores:In: a matrizvaluesnão pode estar vazia.NotIn: a matrizvaluesnão pode estar vazia.Exists: a matrizvaluestem de estar vazia.DoesNotExist: a matrizvaluestem de estar vazia.
LABEL_VALUE: zero, um ou mais valores de contentor a comparar com oLABEL_KEY.TOPOLOGY_KEY: define o domínio de topologia. Por exemplo,kubernetes.io/hostnamepara impedir pods no mesmo nó outopology.kubernetes.io/zonepara distribuir pods por zonas.
Volte a aplicar o ficheiro de manifesto.
Defina restrições de propagação da topologia
O campo topologySpreadConstraints, localizado na API Kubernetes Pod spec e, consequentemente, no schedulingConfig dos manifestos do cluster da base de dados do AlloyDB Omni, controla a forma como os pods são distribuídos por diferentes domínios de topologia, como zonas, nós ou regiões no seu cluster. Isto ajuda a promover a alta disponibilidade e a utilização equilibrada de recursos, impedindo que demasiados pods do cluster de base de dados do AlloyDB Omni aterrem num único ponto de falha.
Para especificar como o cluster da base de dados do AlloyDB Omni se distribui pela topologia do cluster, inclua a secção topologySpreadConstraints no schedulingConfig de primarySpec para instâncias principais ou spec para instâncias do conjunto de leitura:
schedulingconfig:
# Other scheduling configs like tolerations, nodeaffinity
topologySpreadConstraints:
- maxSkew: MAXSKEW_VALUE
topologyKey: "TOPOLOGY_KEY"
whenUnsatisfiable: WHEN_UNSATISFIABLE_VALUE
# labelSelector: <object> # optional
# minDomains: <integer> # optional
# matchLabelKeys: <list> # optional
# nodeAffinityPolicy: [Honor|Ignore] # optional
# nodeTaintsPolicy: [Honor|Ignore] # optional
Substitua o seguinte:
-
MAXSKEW_VALUE: define a diferença máxima permitida no número de agrupamentos correspondentes entre quaisquer dois domínios de topologia. Este parâmetro tem de ser superior a0. TOPOLOGY_KEY: a chave das etiquetas de nós que define um domínio de topologia, por exemplo,topology.kubernetes.io/zonepara zonas. O programador tenta equilibrar os pods nestes domínios.WHEN_UNSATISFIABLE_VALUE: indica como o programador processa um pod se o pod não satisfizer a restrição de distribuição. Defina o parâmetro para uma das seguintes opções:DoNotSchedule: o agendador não agenda o pod para um nó se a restrição de distribuição não for satisfeita. Este é o valor predefinido.ScheduleAnyway: o programador continua a programar o agrupamento, mas dá prioridade aos nós que minimizam a distorção.
Para mais informações sobre as restrições de dispersão da topologia de pods, consulte a documentação oficial do Kubernetes.
Exemplo
O exemplo seguinte ilustra o agendamento de pods nas instâncias primárias e de leitura do operador do Kubernetes do AlloyDB Omni. Esta configuração de agendamento ajuda a garantir que a instância principal do cluster de base de dados é agendada em nós adequados, ao mesmo tempo que permite alguma flexibilidade na seleção de nós. Esta flexibilidade pode ser útil para equilibrar a carga, otimizar a utilização de recursos ou aderir a funções e características específicas dos nós.
schedulingconfig:
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
nodeaffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: "kubernetes.io/hostname"
topologySpreadConstraints:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: DoNotSchedule
A tolerância de exemplo permite que o pod seja agendado em nós marcados como nós do plano de controlo devido aos seguintes detalhes:
- A
node-role.kubernetes.io/control-planechave de contaminação indica que o nó tem um nó do painel de controlo. - O operador
Existssignifica que a tolerância corresponde a qualquer mancha com a chave de mancha especificada, independentemente do valor. - O efeito
NoSchedulesignifica que os pods não vão ser agendados no nó do plano de controlo, a menos que tenham uma tolerância correspondente.
O tipo de afinidade de nós preferredDuringSchedulingIgnoredDuringExecution especifica que as regras definidas para a afinidade de nós são preferenciais, mas não são obrigatórias durante o agendamento. Se os nós preferidos não estiverem disponíveis, o pod ainda pode ser agendado noutros nós. O valor de ponderação 1 indica uma preferência fraca. Os critérios de seleção de nós estão definidos na secção preference. A secção matchExpressions contém uma matriz de expressões usadas para fazer corresponder nós. A chave another-node-label-key representa a chave da etiqueta do nó a corresponder. O operador In significa que o nó tem de ter a chave com um dos valores especificados. A chave another-node-label-key tem de ter o valor another-node-label-value.
A regra de afinidade de nós de exemplo indica uma preferência pela programação do pod em nós que tenham a etiqueta another-node-label-key com o valor another-node-label-value. A preferência é fraca, pelo que não é um requisito forte.
A regra podAntiAffinity neste exemplo impede que os pods com a etiqueta app: my-app sejam agendados no mesmo nome de anfitrião. Isto garante que as réplicas de my-app estão distribuídas por diferentes nós, o que melhora a tolerância a falhas.
Os topologySpreadConstraints neste exemplo distribuem pods por diferentes zonas do Kubernetes. O valor maxSkew de 1 indica que pode haver, no máximo, mais um agrupamento em qualquer zona específica em comparação com o número mínimo de agrupamentos em qualquer outra zona. A definição whenUnsatisfiable, com um valor de DoNotSchedule, significa que, se esta restrição não puder ser cumprida, o pod permanece não agendado.
O exemplo combina o seguinte:
- Tolerâncias que permitem que o Pod seja agendado em nós do plano de controlo tolerando a contaminação
NoSchedule. - Uma afinidade de nós que prefere nós com uma etiqueta específica, mas não a exige estritamente. Por isso, oferece flexibilidade no agendamento.
- Uma regra de antiafinidade de agrupamento que impede o agendamento de agrupamentos com a etiqueta
app: my-appno mesmo nome de anfitrião. - Restrições de propagação da topologia que aplicam uma distribuição equilibrada de pods nas zonas de disponibilidade, melhorando a resiliência e a utilização de recursos.