Como conectar clústeres de Kubernetes en diferentes centros de datos
Benvido á nosa serie de inicio rápido de Kubernetes. Esta é unha columna habitual coas preguntas máis interesantes que recibimos en liña e nos nosos adestramentos. Respostas dos expertos de Kubernetes.
O experto de hoxe é Daniel Polenchik (Daniele Polencic). Daniel traballa como instrutor e desenvolvedor de software en Learnk8s.
Moitas veces, a infraestrutura replícase e distribúese en diferentes rexións, especialmente en ambientes controlados.
Se unha rexión non está dispoñible, o tráfico redirixe a outra para evitar interrupcións.
Con Kubernetes, podes usar unha estratexia similar e distribuír cargas de traballo en diferentes rexións.
Podes ter un ou máis clústeres por equipo, rexión, ambiente ou unha combinación destes elementos.
Os teus clústeres pódense aloxar en diferentes nubes e locais.
Pero, como se planifican as infraestruturas para tal difusión xeográfica?
Necesitas crear un clúster grande para varios ambientes de nube nunha única rede?
Ou tes moitos clústeres pequenos e atopas unha forma de controlalos e sincronizalos?
Un cluster de liderado
Crear un clúster nunha única rede non é tan sinxelo.
Imaxina que tes un accidente, a conectividade entre os segmentos do clúster está perdida.
Se tes un servidor mestre, a metade dos recursos non poderán recibir novos comandos porque non poderán contactar co mestre.
E ao mesmo tempo tes táboas de enrutamento antigas (kube-proxy non pode descargar novos) e non hai pods adicionais (kubelet non pode solicitar actualizacións).
Para empeorar as cousas, se Kubernetes non ve un nodo, márcao como orfo e distribúe os pods que faltan aos nodos existentes.
Como resultado, tes o dobre de vainas.
Se fai un servidor mestre para cada rexión, haberá problemas co algoritmo de consenso na base de datos etcd. (aprox. ed. — De feito, a base de datos etcd non ten que estar necesariamente situada nos servidores mestres. Pódese executar nun grupo separado de servidores da mesma rexión. É certo, ao mesmo tempo conseguir un punto de falla do clúster. Pero rapidamente.)
usos etcd algoritmo de balsapara negociar o valor antes de escribilo no disco.
É dicir, a maioría das instancias deben chegar a un consenso antes de que o estado poida escribirse a etcd.
Se a latencia entre instancias etcd aumenta drasticamente, como é o caso de tres instancias etcd en diferentes rexións, leva moito tempo negociar un valor e escribir no disco.
Isto reflíctese nos controladores Kubernetes.
O xestor do controlador necesita máis tempo para coñecer o cambio e escribir a resposta na base de datos.
E como non hai un controlador, senón varios, resulta unha reacción en cadea e todo o clúster comeza a funcionar moi lentamente.
Actualmente non hai bos exemplos de rede grande para un único clúster.
Basicamente, a comunidade de desenvolvedores e o grupo de clústeres SIG están tentando descubrir como orquestrar os clústeres do mesmo xeito que Kubernetes organiza os contedores.
Por primeira vez, tentamos xestionar unha colección de clústeres como un único obxecto mediante a ferramenta de federación de kube.
O comezo foi bo, pero ao final a federación kube nunca se popularizou porque non soportaba todos os recursos.
Soportaba entregas e servizos federados, pero non StatefulSets, por exemplo.
Ademais, a configuración da federación transmitíase en forma de anotacións e non era flexible.
Imaxina como poderías describir a partición de réplica para cada clúster nunha federación usando só anotacións.
Foi unha desorde completa.
SIG-cluster traballou moito despois de kubefed v1 e decidiu abordar o problema desde un ángulo diferente.
En lugar de anotacións, decidiron lanzar un controlador que está instalado en clústeres. Pódese personalizar mediante Definicións de recursos personalizadas (CRD).
Para cada recurso que formará parte da federación, tes unha definición de CRD personalizada con tres seccións:
definición estándar dun recurso, por exemplo despregamento;
sección placement, onde se define como se distribuirá o recurso na federación;
sección override, onde para un recurso específico pode anular o peso e os parámetros da colocación.
Aquí tes un exemplo de entrega combinada con seccións de colocación e anulación.
Como podes ver, a oferta distribúese en dous clústeres: cluster1 и cluster2.
O primeiro clúster ofrece tres réplicas e o segundo está configurado en 5.
Se precisa máis control sobre o número de réplicas, kubefed2 proporciona un novo obxecto ReplicaSchedulingPreference onde se poden ponderar as réplicas:
Opción 2: combinar clusters ao estilo de Booking.com
Os desenvolvedores de Booking.com non traballaron en kubefed v2, pero pensaron en Shipper, un operador para a entrega en varios clústeres, en varias rexións e en varias nubes.
Ambas ferramentas permítenche personalizar a túa estratexia de implantación de varios clústeres (que clústeres se utilizan e cantas réplicas teñen).
Pero O obxectivo do remitente é reducir o risco de erros durante a entrega.
En Shipper, pode definir unha serie de pasos que describen a división de réplicas entre a implantación anterior e actual e o volume de tráfico entrante.
Cando empurras un recurso a un clúster, o controlador Shipper implementa gradualmente ese cambio en todos os clústeres unidos.
Ademais, o cargador é moi limitado.
Por exemplo, a acepta gráficos de timón como entrada e non admite recursos de vainilla.
En termos xerais, Shipper funciona así.
En lugar da entrega estándar, cómpre crear un recurso de aplicación que inclúa un gráfico Helm:
Kubefed v2 e Shipper traballan coa federación de clústeres, proporcionando novos recursos aos clústeres mediante unha definición de recursos personalizada.
Pero e se non queres reescribir todas as entregas, StatefulSets, DaemonSets, etc. para fusionar?
Como incluír un clúster existente nunha federación sen cambiar YAML?
Pero en lugar de crear unha nova forma de interactuar co clúster e envolver recursos en definicións personalizadas, o programador de clústeres múltiples está integrado no ciclo de vida estándar de Kubernetes e intercepta todas as chamadas que crean pods.
Cada pod creada substitúese inmediatamente por un maniquí.
usos do programador de múltiples clústeres webhooks para modificar o accesopara interceptar a chamada e crear un pod ficticio inactivo.
O pod orixinal pasa por outro ciclo de planificación onde, despois de consultar a toda a federación, tómase unha decisión de colocación.
Finalmente, o pod entrégase ao clúster de destino.
Como resultado, tes unha vaina extra que non fai nada, só ocupa espazo.
A vantaxe é que non tiñas que escribir novos recursos para combinar materiais.
Cada recurso que crea un pod está automaticamente listo para ser combinado.
Isto é interesante, porque de súpeto tes subministracións distribuídas por varias rexións e nin sequera te decataches. Non obstante, isto é bastante arriscado, porque aquí todo depende da maxia.
Pero aínda que Shipper intenta mitigar principalmente o impacto das entregas, o programador de clusters múltiples xestiona tarefas máis xerais e quizais sexa máis adecuado para traballos por lotes.
Non ten un mecanismo avanzado de entrega gradual.
Podes atopar máis información sobre o programador multi-clúster en páxina oficial do repositorio.
Se queres ler sobre o programador multi-cluster en acción, o Almirantazgo ten interesante caso de uso con Argo — fluxos de traballo, eventos, CI e CD Kubernetes.
Outras ferramentas e solucións
Conectar e xestionar varios clústeres é unha tarefa complexa e non existe unha solución universal.
Se queres profundizar neste tema, aquí tes algúns recursos:
Submariner de Rancher é unha ferramenta que conecta redes superpostas de diferentes clústeres de Kubernetes.
Cilium, un complemento de interface de rede de contedores, ofrece función de malla de cluster, que permite combinar varios clusters
Iso é todo por hoxe
Grazas por ler ata o final!
Se sabes como conectar varios clústeres de forma máis eficiente, cóntanos.
Engadiremos o teu método ás ligazóns.
Agradecemento especial a Chris Nesbitt-Smith (Chris Nesbitt-Smith) e Vincent de Sme (Vicente De Smet) (enxeñeiro de fiabilidade en swatmobile.io) por ler o artigo e compartir información útil sobre o funcionamento da federación.