Apresentando o Kubernetes CCM (Cloud Controller Manager) para Yandex.Cloud



Em continuação ao recente lançamento do driver CSI para Yandex.Cloud, estamos publicando outro projeto Open Source para essa nuvem - Cloud Controller Manager . O CCM é necessário não apenas para o cluster como um todo, mas também para o próprio driver CSI. Detalhes sobre sua finalidade e alguns recursos de implementação estão sob o corte.

Introdução


Por que é isso?


Os motivos que nos levaram a desenvolver o CCM para o Yandex.Cloud coincidem completamente com os já descritos no anúncio do driver CSI. Servimos muitos clusters Kubernetes de diferentes provedores de nuvem, para os quais usamos uma única ferramenta. Ele implementa inúmeras comodidades "ignorando" as soluções gerenciadas desses provedores. Sim, temos um caso e necessidades bastante específicos, mas os desenvolvimentos criados por causa deles também podem ser úteis para outros usuários.

O que é o CCM em geral?


Como regra, preparamos nosso ambiente para o cluster de fora - por exemplo, usando Terraform. Mas, às vezes, é necessário gerenciar o ambiente de nuvem ao redor de um cluster . Essa oportunidade é fornecida e o CCM a implementa .

Em particular, o Cloud Controller Manager fornece cinco tipos básicos de interação:

  1. Instâncias - implementa uma conexão 1: 1 entre um objeto de nó no Kubernetes ( Node) e uma máquina virtual em um provedor de nuvem. Para fazer isso, nós:
    • preencha o campo spec.providerIDno objeto Node. Por exemplo, para OpenStack CCM, este campo tem o seguinte formato: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Você pode ver o nome do provedor de nuvem e o UUID (máquina virtual no OpenStack) exclusivo do servidor;
    • nodeInfo Node . , instance type AWS;
    • . , Node NotReady, , providerID. — Node, ;
  2. Zones – failure domain Node, Pod’ ;
  3. LoadBalancerService LoadBalancer , . , Yandex.Cloud NetworkLoadBalancer TargetGroup ;
  4. Route – , .. Kubernetes pod IP- pod’. (VXLAN, GENEVE) :

  5. Volume – PV, PVC SC. CCM, Container Storage Interface (CSI). CSI , , CSI-.

Anteriormente, todo o código que interagia com a nuvem residia principalmente nos repositórios Git do projeto Kubernetes no endereço k8s.io/kubernetes/pkg/cloudprovider/providers, mas eles decidiram recusar isso devido à inconveniência de trabalhar com uma grande base de códigos. Todas as implementações antigas foram movidas para um repositório separado . Para maior conveniência e suporte, todos os componentes comuns também foram movidos para um repositório separado .

Como no CSI, muitos grandes provedores de serviços em nuvem já desenvolveram seu CCM para uso em nuvem no Kubernetes. Se o fornecedor não tiver o CCM, mas todas as funções necessárias estiverem disponíveis através da API, você poderá implementar o CCM.

Para escrever sua implementação do CCM, basta implementar as interfaces Go necessárias .

Eé isso que conseguimos .

Implementação


Como você chegou a isso


Iniciamos o desenvolvimento (ou melhor, até usamos) com o (!) CCM finalizado para Yandex.Cloud há um ano.

No entanto, nesta implementação, nos faltam:

  • autenticação através do token JWT IAM;
  • Suporte ao controlador de serviço.

De acordo com o autor (dlisin) no Telegram, bifurcamos o yandex-cloud-controller-manager e adicionamos as funções ausentes.

Características principais


Atualmente, o CCM suporta as seguintes interfaces:

  • as instâncias ;
  • Zonas ;
  • LoadBalancer .

No futuro, quando o Yandex.Cloud começar a trabalhar com os recursos avançados do VPC, adicionaremos a interface Routes .

Loadbalanacer como o principal desafio


Inicialmente, tentamos, como em outras implementações do CCM, criar um par de LoadBalancere TargetGrouppara cada Serviceum com um tipo LoadBalancer. No entanto, o Yandex.Cloud mostrou uma limitação interessante: não pode ser usado TargetGroupscom interseção Targets(par SubnetID- IpAddress).



Portanto, dentro do CCM estabelecida lançou um controlador que ao alterar o objeto Nodeinformações coleta sobre todas as interfaces em cada máquina virtual, agrupa-as como pertencentes a certos NetworkIDcria em TargetGroupon NetworkIDe certificando-se que é atual. Posteriormente, ao criar um objeto Servicecom um tipo, LoadBalanacersimplesmente anexamos o criado anteriormente TargetGroupaos novos NetworkLoadBalanacer.

Como começar a usar?


O CCM suporta o Kubernetes versão 1.15 e superior. No cluster, para sua operação, é necessário que o sinalizador --cloud-provider=externalseja configurado com o valor truepara kube-apiserver, kube-controller-manager, kube-scheduler e todos os kubelet'ov.

Todas as etapas necessárias para a instalação em si são descritas em README . A instalação se resume a criar objetos no Kubernetes a partir de manifestos.

Para usar o CCM, você também precisará de:

  • especifique no manifesto o identificador do diretório Yandex.Cloud ( folder-id);
  • conta de serviço para interagir com a API Yandex.Cloud. No manifesto, Secretvocê deve transferir as chaves autorizadas para a conta de serviço. A documentação descreve como criar uma conta de serviço e obter as chaves.

Teremos o maior prazer em receber feedback e novos problemas, se você encontrar algum problema!

Sumário


Temos usado o CCM implementado em cinco clusters do Kubernetes nas últimas duas semanas e planejamos expandir seu número para 20 no próximo mês. Atualmente, o uso do CCM para instalações grandes e críticas do K8s não é recomendado.

Como no caso da CSI, ficaremos felizes se os desenvolvedores do Yandex aceitarem o desenvolvimento e o suporte deste projeto - estamos prontos para transferir o repositório a pedido deles, a fim de lidar com tarefas mais especializadas para nós.

PS


Leia também no nosso blog:


All Articles