CSE: Kubernetes para quem está no vCloud

CSE: Kubernetes para quem está no vCloud
Olá a todos!

Aconteceu que nossa pequena equipe, não exatamente recentemente, e definitivamente não de repente, chegou ao ponto de transferir alguns (e, no futuro, todos) produtos para o Kubernetes.

As razões para isso foram muitas, mas nossa história não é sobre controvérsias.

Em termos de infraestrutura, nossa escolha era limitada. vCloud Director e vCloud Director. Optamos pela versão mais recente e decidimos começar.

Mais uma vez, folheando "The Hard Way", conclui rapidamente que uma ferramenta para automatizar pelo menos processos básicos, como implantação e dimensionamento, era necessária há tempos. Um mergulho profundo no Google revelou um produto chamado VMware Container Service Extension (CSE) — um produto de código aberto que permite automatizar a criação e o dimensionamento de clusters k8s para quem está no vCloud.

Aviso: O CSE tem suas limitações, mas atendeu perfeitamente aos nossos objetivos. Além disso, a solução deve ser suportada pelo provedor de nuvem, mas como a parte do servidor também é de código aberto, exija sua disponibilidade do gerente mais próximo 🙂

Para começar a usá-lo, é necessário ter uma conta de administrador na organização vCloud e uma rede roteada já criada para o cluster (durante o processo de implantação, é necessário ter acesso à internet a partir dessa rede, não se esqueça de configurar o Firewall/NAT). A endereçamento não é importante. Neste exemplo, usaremos 10.0.240.0/24.

CSE: Kubernetes para quem está no vCloud

Como após a criação, será necessário gerenciar o cluster de alguma forma, recomenda-se a existência de um VPN com roteamento para a rede criada. Estamos usando o SSL-VPN padrão, configurado no Edge Gateway da nossa organização.

Em seguida, é necessário instalar o cliente CSE a partir do qual a gestão dos clusters k8s será realizada. No meu caso, é meu laptop de trabalho e alguns containers bem escondidos que cuidam da automação.

O cliente requer a instalação do Python versão 3.7.3 ou superior e do módulo vcd-cli, então vamos instalar ambos.

pip3 install vcd-cli

pip3 install container-service-extension

Após a instalação, verificamos a versão do CSE e obtemos o seguinte:

# vcd cse version
Error: No such command "cse".

Surpreendentemente, mas corrigível. Acontece que é necessário integrar o CSE como um módulo ao vcd-cli.
Para isso, é necessário primeiro fazer login no vcd-cli na nossa organização:

# vcd login MyCloud.provider.com org-dev admin
Password: 
admin logged in, org: 'org-dev', vdc: 'org-dev_vDC01'

Depois disso, o vcd-cli criará um arquivo de configuração ~/.vcd-cli/profiles.yaml
No final deste arquivo, é necessário adicionar o seguinte:

extensions:
  - container_service_extension.client.cse

Depois disso, verificamos novamente:

# vcd cse version
CSE, Container Service Extension for VMware vCloud Director, version 2.5.0

A etapa de instalação do cliente foi concluída. Vamos tentar implantar o primeiro cluster.
O CSE possui vários conjuntos de parâmetros de uso, todos podem ser visualizados. aqui.

Primeiro, vamos criar chaves para acesso sem senha ao futuro cluster. Este ponto é importante, pois por padrão o acesso por senha para os nós será desativado e, se as chaves não forem definidas, pode-se ter muito trabalho através do console das máquinas virtuais, o que não é exatamente conveniente.

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

Tentamos iniciar a criação do cluster:

vcd cse cluster create MyCluster --network k8s_cluster_net --ssh-key ~/.ssh/id_rsa.pub --nodes 3 --enable-nfs

Se recebermos um erro Erro: Sessão expirada ou usuário não está logado. Por favor, faça o login novamente. — faça o login novamente no vcd-cli no vCloud conforme descrito acima e repita a tentativa.

Desta vez, tudo está bem e a tarefa de criação do cluster foi iniciada.

Operação do cluster: Criando o vApp do cluster 'MyCluster' (38959587-54f4-4a49-8f2e-61c3a3e879e0) a partir do template 'photon-v2_k8-1.12_weave-2.3.0' (revisão 1)

A conclusão da tarefa levará cerca de 20 minutos, enquanto isso, vamos analisar os principais parâmetros de inicialização.

—network — a rede que criamos anteriormente.
—ssh-key — as chaves que geramos, que serão gravadas nos nós do cluster.
—nodes n — Número de nós Worker do cluster. O mestre será sempre um, essa é a limitação do CSE.
—enable-nfs — criar um nó adicional para compartilhamento NFS para volumes persistentes. Uma opção um pouco mais técnica, sobre a qual voltaremos a discutir mais tarde.

Enquanto isso, no vCloud, é possível observar visualmente a criação do cluster.
CSE: Kubernetes para quem está no vCloud

Assim que a tarefa de criação do cluster for concluída, ele estará pronto para uso.

Vamos verificar a correção do deployment com o comando vcd cse cluster info MyCluster

CSE: Kubernetes para quem está no vCloud

Em seguida, precisamos obter a configuração do cluster para uso. kubectl

# vcd cse cluster config MyCluster > ./.kube/config

E podemos verificar o estado do cluster já com ela:

CSE: Kubernetes para quem está no vCloud

Neste ponto, o cluster pode ser considerado funcional, se não fosse pela questão com volumes persistentes. Como estamos no vCloud, não conseguimos usar o vSphere Provider. A opção —enable-nfs destina-se a suavizar esse problema, mas não funcionou completamente. É necessário um ajuste manual.

Para começar, nosso nó precisa criar um disco Independente separado no vCloud. Isso garante que nossos dados não desaparecerão junto com o cluster, caso ele seja removido. Além disso, vamos conectar o disco ao NFS.

# vcd disk create nfs-shares-1 100g --description 'Kubernetes NFS shares'
# vcd vapp attach mycluster nfsd-9604 nfs-shares-1

Depois disso, vamos via ssh (você realmente criou as chaves?) para nosso nó NFS e terminar de conectar o disco:

root@nfsd-9604:~# parted /dev/sdb
(parted) mklabel gpt
Atenção: O rótulo de disco existente em /dev/sdb será destruído e todos os dados nesse disco serão perdidos. Você deseja continuar?
Sim/Não? sim
(parted) unit GB
(parted) mkpart primary 0 100
(parted) print
Modelo: VMware Disco virtual (scsi)
Disco /dev/sdb: 100GB
Tamanho do setor (lógico/físico): 512B/512B
Tabela de partição: gpt
Flags do disco:

Número  Início   Fim    Tamanho   Sistema de arquivos  Nome     Flags
 1      0.00GB  100GB  100GB               primário

(parted) quit
root@nfsd-9604:~# mkfs -t ext4 /dev/sdb1
Criando sistema de arquivos com 24413696 blocos de 4k e 6111232 inodes
UUID do sistema de arquivos: 8622c0f5-4044-4ebf-95a5-0372256b34f0
Cópias de superbloco armazenadas nos blocos:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000, 7962624, 11239424, 20480000, 23887872

Alocando tabelas de grupo: feito
Escrevendo tabelas de inode: feito
Criando journal (32768 blocos): feito
Escrevendo superblocos e informações de contabilidade do sistema de arquivos: feito

Criamos um diretório para os dados e montamos a nova partição:

mkdir /export
echo '/dev/sdb1  /export   ext4  defaults   0 0' >> /etc/fstab
mount -a

Vamos criar cinco partições de teste e compartilhá-las para o cluster:

>cd /export
>mkdir vol1 vol2 vol3 vol4 vol5
>vi /etc/exports
# Adicione isso ao final do arquivo
/export/vol1 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol2 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol3 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol4 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol5 *(rw,sync,no_root_squash,no_subtree_check)
#:wq! ;)
# Em seguida, exportamos as partições
>exportfs -r

Após toda essa mágica, podemos criar PV e PVC em nosso cluster da seguinte forma:
PV:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-vol1
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    # O mesmo IP do host NFS ao qual nos conectamos via ssh anteriormente.
    server: 10.150.200.22
    path: "/export/vol1"
EOF

PVC:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 10Gi
EOF

Com isso, a história da criação de um cluster termina e a história do seu ciclo de vida começa. Como bônus, aqui estão mais dois comandos úteis do CSE que podem economizar recursos de forma significativa em algumas ocasiões:

#Увеличиваем размер кластера до 8 воркер нод
>cse cluster resize MyCluster --network k8s_cluster_net --nodes 8

#Выводим ненужные ноды из кластера с их последующим удалением
>vcd cse node delete MyCluster node-1a2v node-6685 --yes

Obrigado a todos pelo tempo dedicado, se houver perguntas — fiquem à vontade para perguntar nos comentários.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster