Kops: Implantação do Kubernetes Programaticamente.

Miguel Fontanilla
AWS
June 21, 2020

A configuração de um cluster Kubernetes do zero pode ser um desafio, especialmente se você não usar os serviços gerenciados do Kubernetes e precisar garantir a Alta Disponibilidade.

Kops (Kubernetes Operations) é uma ferramenta de código aberto que ajuda a configurar, atualizar e gerenciar Clusters Kubernetes "não gerenciados" sobre fornecedores de nuvem pública. Nesta postagem, você aprenderá como implantar um cluster HA Kubernetes na AWS.


Kops by Pattern Match

Configurando o Kops.

O primeiro passo aqui será obter o Kops CLI. Supondo que você esteja usando uma distribuição Linux, você pode usar os comandos abaixo. Caso contrário, verifique este link.


 
  
curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops-linux-amd64
sudo mv kops-linux-amd64 /usr/local/bin/kops
 

Além disso, você precisará interagir com a API da AWS, portanto, precisará da CLI da AWS. O conjunto de comandos abaixo mostra como instalá-lo nas distribuições Linux. Para qualquer outro sistema operacional, siga estas instruções.

 
  
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
 

O Kops precisará de um usuário programático do AWS IAM para poder implantar a infraestrutura necessária para o cluster Kubernetes. Este usuário deve ter acesso total aos serviços IAM, EC2, S3, VPC e Route53. Para fazer isso, você pode anexar diretamente as políticas gerenciadas AmazonEC2FullAccess, AmazonRoute53FullAccess AmazonS3FullAccess, IAMFullAccess e AmazonVPCFullAccess ao usuário.

Ao criar o usuário, selecione a opção de acesso programático, pois, assim, a AWS gerará um par de Chaves de acesso e Chaves secretas para a CLI acessar a API da AWS. Armazene bem a chave secreta, pois é a única vez que ela será exibida.Depois de ter as duas chaves, configure-as como as chaves padrão da CLI emitindo o seguinte comando. Com este comando, você também pode definir a região padrão da AWS.

 
  
aws configure
 

Para armazenar o estado dos clusters, o Kops precisará de um bucket S3. Você pode usar suas novas credenciais para criar o bucket usando a AWS CLI. Além disso, é aconselhável ativar o versionamento do bucket, pois pode ajudá-lo a recuperar o estado do cluster em caso de falha.

 
  
aws s3api create-bucket --bucket  --region eu-west-1
aws s3api put-bucket-versioning --bucket   --versioning-configuration Status=Enabled
 

Criando o cluster

O script abaixo ajuda na criação do cluster, para configurar melhor os parâmetros do cluster e algumas opções adicionais. Você pode selecionar a versão do Kubernetes, o número de master nodes e de worker nodes, o tipo de instância e as zonas de disponibilidade nas quais as instâncias serão implantadas.

As opções de rede e a faixa CIDR da rede também podem ser definidas aqui. Você pode verificar a lista de opções de rede suportadas aqui. Além disso, você pode escolher se deseja gerar uma saída de TerraForm ou de CloudFormation.

Defina os parâmetros de acordo com suas necessidades e execute o script. Neste exemplo, usaremos um nome de cluster que termina com .k8s.local, pois é a configuração mais simples, sem a necessidade de um servidor DNS externo para propagar os IPs da API do Kubernetes. Se você precisar usar um serviço DNS externo, verifique esta documentação. Ao executar o script, o Kops gerará a especificação do cluster, mas ainda não implantará o cluster.

 
  
#!/bin/bash

# Kops Kubernetes HA deployment for aws
export CLOUD=aws
MASTER_NUMBER=3
MASTER_ZONES="eu-west-1a,eu-west-1b,eu-west-1c"
MASTER_SIZE="t2.medium"
WORKER_NUMBER=3
WORKER_ZONES="eu-west-1a,eu-west-1b,eu-west-1c"
WORKER_SIZE="t2.medium"
CNI_PLUGIN="calico" 
CLUSTER_NAME="testlab.k8s.local" # if ends in .k8s.local --> gossip-based cluster
K8S_VERSION=1.17.0
NETWORK_CIDR="10.240.0.0/16"
NW_TOPOLOGY="private" # public: uses a gateway | private
STORAGE_BUCKET=""
BUCKET_REGION="eu-west-1"
EXTRA_ARGS=" --target=terraform " 
# EXTRA_ARGS=" --target=cloudformation " 

export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)
export KOPS_STATE_STORE="s3://${STORAGE_BUCKET}"

# configure cluster
kops create cluster --node-count ${WORKER_NUMBER} --zones ${WORKER_ZONES} \
    --master-zones ${MASTER_ZONES} --node-size ${WORKER_SIZE} \
    --master-size ${MASTER_SIZE} --kubernetes-version=${K8S_VERSION} \
    --network-cidr=${NETWORK_CIDR} --cloud=${CLOUD} \
    --topology ${NW_TOPOLOGY} --networking ${CNI_PLUGIN}   ${CLUSTER_NAME} \
    ${EXTRA_ARGS} \
 

Você pode verificar a especificação do cluster emitindo o comando abaixo. Lembre-se de definir o sinalizador de estado com o nome do seu bucket de estado. Também pode ser usado para modificar clusters já criados.

 
  
kops edit cluster testlab.k8s.local  --state s3://
 

O comando edit abrirá um editor vi, onde você poderá modificar todos os parâmetros de acordo com suas necessidades. Se você examinar a especificação yaml, poderá ver que a especificação do cluster corresponde a todos os parâmetros passados para o comando create, e são adicionados elementos adicionais necessários para suportar a infraestrutura do cluster, como sub-redes.

 
  
apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
  creationTimestamp: "2020-06-03T20:29:13Z"
  name: testlab.k8s.local
spec:
  api:
    loadBalancer:
      type: Public
  authorization:
    rbac: {}
  channel: stable
  cloudProvider: aws
  configBase: s3:///testlab.k8s.local
  etcdClusters:
  - cpuRequest: 200m
    etcdMembers:
    - instanceGroup: master-eu-west-1a
      name: a
    - instanceGroup: master-eu-west-1b
      name: b
    - instanceGroup: master-eu-west-1c
      name: c
    memoryRequest: 100Mi
    name: main
    version: 3.2.24
  - cpuRequest: 100m
    etcdMembers:
    - instanceGroup: master-eu-west-1a
      name: a
    - instanceGroup: master-eu-west-1b
      name: b
    - instanceGroup: master-eu-west-1c
      name: c
    memoryRequest: 100Mi
    name: events
    version: 3.2.24
  iam:
    allowContainerRegistry: true
    legacy: false
  kubelet:
    anonymousAuth: false
  kubernetesApiAccess:
  - 0.0.0.0/0
  kubernetesVersion: 1.17.0
  masterInternalName: api.internal.testlab.k8s.local
  masterPublicName: api.testlab.k8s.local
  networkCIDR: 10.240.0.0/16  
  networking:
    calico:
      majorVersion: v3
  nonMasqueradeCIDR: 100.64.0.0/10
  sshAccess:
  - 0.0.0.0/0
  subnets:
  - cidr: 10.240.32.0/19
    name: eu-west-1a
    type: Private
    zone: eu-west-1a
  - cidr: 10.240.64.0/19
    name: eu-west-1b
    type: Private
    zone: eu-west-1b
  - cidr: 10.240.96.0/19
    name: eu-west-1c
    type: Private
    zone: eu-west-1c
  - cidr: 10.240.0.0/22
    name: utility-eu-west-1a
    type: Utility
    zone: eu-west-1a
  - cidr: 10.240.4.0/22
    name: utility-eu-west-1b
    type: Utility
    zone: eu-west-1b
  - cidr: 10.240.8.0/22
    name: utility-eu-west-1c
    type: Utility
    zone: eu-west-1c
  topology:
    dns:
      type: Public
    masters: private
    nodes: private
 

Ao emitir o seguinte comando, a especificação do cluster gerará um cluster real na conta da AWS. Seja paciente, pois demora um pouco. Se o comando for executado sem a flag –yes, ele mostrará todos os recursos que estão prestes a serem criados, mas os recursos não serão criados.

 
  
kops update cluster  --state s3:// --yes
 

Após a conclusão do processo de criação, você pode verificar o painel do AWS EC2 para ver suas novas instâncias, 3 master nodes e 3 worker nodes nesse caso.


Uma boa maneira de verificar se tudo está funcionando é executando os seguintes comandos. O primeiro exibe o status de todos os elementos do plano de controle, enquanto o segundo lista os nodes e seus status.

 
  
kubectl get componentstatuses
kubectl get nodes
 

Além disso, o Kops oferece uma verificação de cluster integrada que também é muito útil.


 
  
kops validate cluster  --state s3:// 
 

Removendo

Se você deseja excluir o cluster e todos os recursos associados que foram criados, basta realizar o seguinte comando. Se você o usar sem a flag –yes, ele exibirá uma lista detalhada de todos os elementos que serão destruídos, mas não os destruirá até você adicionar a flag.

 
  
kops delete cluster testlab.k8s.local  --state s3:// --yes
 

Mais sobre Kops

O Kops é uma ferramenta amplamente usada para gerenciar clusters Kubernetes em ambientes de produção e oferece bastante flexibilidade e recursos avançados que ajudam a personalizar cada cluster de acordo com os requisitos que ele deve atender. Ajuda na criação, atualização e melhoria dos clusters de maneira simples. No entanto, lembre-se de que o Kops não suporta todos os recursos que o Kubernetes oferece ao criar um cluster 'manualmente', por exemplo, nem todos os plug-ins de rede são suportados pelo Kops no momento, ou pelo menos não de maneira estável.


Se você quer saber mais sobre o Kops, leia a documentação.


Related Posts

Newsletter BrazilClouds.com

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form