• Stars
    star
    894
  • Rank 50,711 (Top 2 %)
  • Language HCL
  • License
    GNU General Publi...
  • Created 8 months ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Uma maneira fácil de garantir seu próprio cluster Kubernetes gratuitamente e para sempre

Criando um Cluster Kubernetes na OCI utilizando OpenTofu #MêsDoKubernetes

Crie uma conta gratuita na Oracle Cloud, e provisione um cluster Kubernetes utilizando o Terraform de forma simples e rápida.

Acesse este link e crie a sua conta

Pontos Importantes Antes de Começar

  • Devido limitações da conta gratuita, você provavelmente precisará realizar o upgrade para uma conta Pay As You Go para conseguir criar o cluster utilizando as instâncias gratuitas VM.Standard.A1.Flex. Você não será cobrado pelo uso de recursos gratuitos mesmo após o upgrade.

  • Crie um alerta na sua conta para não ser cobrado por acidente Budget.

  • Não altere o shape da instância utilizada no cluster, pois a única instância gratuita compatível com o OKE é a VM.Standard.A1.Flex.

Instalando o OpenTofu

  • GNU/Linux
curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh -o install-opentofu.sh
chmod +x install-opentofu.sh
./install-opentofu.sh --install-method deb
rm install-opentofu.sh
  • Windows
Invoke-WebRequest -outfile "install-opentofu.ps1" -uri "https://get.opentofu.org/install-opentofu.ps1"
& .\install-opentofu.ps1 -installMethod standalone
Remove-Item install-opentofu.ps1

Instalando o OCI CLI

  • GNU/Linux
  1. Execute o comando de instalação:
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
  1. Quando solicitado para atualizar a variável PATH, digite yes e ele atualizará automaticamente o arquivo .bashrc ou .bash_profile. Se você utiliza um shell diferente, precisará informar o caminho para o OCI CLI (por exemplo, ~/zshrc).

  2. Reinicie sua sessão no terminal.

  3. Verifique a instalação.

oci -v
  • Windows
  1. Faça download do instalador MSI da CLI do OCI para Windows no GitHub Releases

  2. Execute o instalador e siga as instruções.

Instalando Kubectl - Kubernetes 1.28.2

  • GNU/Linux

Kubectl é quem faz a comunicação com a API Kubernetes usando CLI. Devemos usar a mesma versão que está explicita no arquivo de variáveis. Veja variables.tf

  1. Baixando o binário kubectl
curl -LO https://dl.k8s.io/release/v1.28.2/bin/linux/amd64/kubectl
  1. Instalando o binário
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
  1. Adicione kubectl completion bash
echo '
source <(kubectl completion bash)' >> ~/.bashrc
  1. Valide a versão
kubectl version --client
  • Note: O comando acima irá gerar um aviso: "WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short."

Você pode ignorar este aviso. Você está apenas verificando a versão do kubectl que instalou.

  • Windows
  1. Baixe o binário kubectl
curl.exe -LO "https://dl.k8s.io/release/v1.28.2/bin/windows/amd64/kubectl.exe"
  1. Anexe a pasta binária kubectl à sua variável de ambiente PATH.

  2. Valide a versão

kubectl version --client --output=yaml

🔗 Guia de instalação para todos os ambientes

Autenticando na OCI

  1. Antes de começar, clone o repositório.
git clone https://github.com/Rapha-Borges/oke-free.git
  1. Crie uma API key
  • Entre no seu perfil, acesse a aba API Keys e clique em Add API Key.
  1. Selecione Generate API key pair, faça o download da chave privada. Em seguida, clique em Add.

  2. Após o download, mova a chave para o diretório do OCI CLI e renomeie para oci_api_key.pem.

  • GNU/Linux
mkdir -p ~/.oci && mv ~/Downloads/<nome_do_arquivo>.pem ~/.oci/oci_api_key.pem
  • Windows
move C:\Users\<user>\Downloads\<nome_do_arquivo>.pem C:\Users\<user>\.oci\oci_api_key.pem
  1. Corrija as permissões da chave privada:
oci setup repair-file-permissions --file <caminho_da_chave_privada>
  1. Copie o texto que apareceu na página de criação da API KEY para o arquivo de configuração do OCI CLI. Não se esqueça de substituir o valor do compo key_file pelo caminho da chave privada.
  • GNU/Linux
vim ~/.oci/config
[DEFAULT]
user=ocid1.user.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fingerprint=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tenancy=ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
region=xxxxxxxx
key_file=~/.oci/oci_api_key.pem
  • Windows
notepad C:\Users\<user>\.oci\config
[DEFAULT]
user=ocid1.user.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fingerprint=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tenancy=ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
region=xxxxxxxx
key_file=C:\Users\<user>\.oci\oci_api_key.pem
  1. Crie a pasta ./ssh e gere a chave ssh (No Windows, utilize o Git Bash para executar o comando abaixo).
ssh-keygen -t rsa -b 4096 -f ./ssh/id_rsa
  1. Crie o arquivo com as variáveis de ambiente, substituindo os valores das variáveis pelos valores da sua conta (o conteúdo usado no arquivo ~/.oci/config acima).
  • GNU/Linux
vim ./env.sh
export TF_VAR_tenancy_ocid=<your tenancy ocid>
export TF_VAR_user_ocid=<your user ocid>
export TF_VAR_fingerprint=<your fingerprint>
export TF_VAR_private_key_path=~/.oci/oci_api_key.pem
export TF_VAR_ssh_public_key=$(cat ssh/id_rsa.pub)
# Optional if you want to use a different profile name change the value below
export TF_VAR_oci_profile="DEFAULT"

Agora rode o script para exportar as variáveis:

source ./env.sh
  • Windows

No Windows, você pode criar um arquivo env.bat com o conteúdo abaixo e executar o arquivo para exportar as variáveis.

set TF_VAR_tenancy_ocid=<your tenancy ocid>
set TF_VAR_user_ocid=<your user ocid>
set TF_VAR_fingerprint=<your fingerprint>
set TF_VAR_private_key_path=C:\Users\<user>\.oci\oci_api_key.pem
set TF_VAR_ssh_public_key=C:\Users\<user>\.oci\ssh\id_rsa.pub
# Optional if you want to use a different profile name change the value below
set TF_VAR_oci_profile="DEFAULT"

Agora execute o arquivo para exportar as variáveis:

env.bat

Criando o cluster

  1. Instale os módulos
tofu init
  1. Crie o cluster.
tofu apply
  • OBS: Opicionalmente, você pode utilizar o comando tofu plan para visualizar as alterações que serão realizadas antes de executar o tofu apply. Com os seguintes comandos:
tofu plan -out=oci.tfplan
tofu apply -auto-approve "oci.tfplan"
  1. Edite o arquivo ~/.kube/config para adicionar a autenticação com a API KEY conforme exemplo abaixo.
- name: user-xxxxxxxxxx
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      command: oci
      args:
      - ce
      - cluster
      - generate-token
      - --cluster-id
      - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      - --region
      - xxxxxxxxxxx
      - --auth            # ADICIONE ESSA LINHA
      - api_key           # ADICIONE ESSA LINHA
      - --profile         # ADICIONE ESSA LINHA
      - DEFAULT           # ADICIONE ESSA LINHA
  1. Acesse o cluster.
kubectl get nodes

Script para criação do cluster

Atenção: O script está em fase de testes e funciona apenas no Linux.

Caso queira automatizar o processo de criação do cluster, basta executar o script main.sh que está na raiz do projeto. O script irá gerar a chave SSH, adicionar a chave pública na TF_VAR, inicializar o Terraform e criar o cluster.

./main.sh

Load Balancer

O cluster que criamos já conta com um Network Load Balancer configurado para expor uma aplicação na porta 80. Basta configurar um serviço do tipo NodePort com a porta 80 e a nodePort 30080. Exemplos de como configurar o serviço podem ser encontrados no diretório manifests.

O endereço do Load Balancer é informado na final da execução, no formato public_ip = "xxx.xxx.xxx.xxx" e pode ser consultado a qualquer momento com o comando:

tofu output public_ip

Deletando o cluster

  1. Para deletar o cluster bastar executar o comando:
tofu destroy

Problemas conhecidos

  • Se você tentar criar um cluster com uma conta gratuita e receber o erro abaixo

Error: "Out of capacity" ou "Out of host capacity"

As contas gratuitas tem um número limitado de instâncias disponíveis, possivelmente a região que você está tentando criar o cluster não tem mais instâncias disponíveis. Você pode esperar até que novas instâncias fiquem disponíveis ou tentar criar o cluster em outra região. Além disso, o upgrade para uma conta Pay As You Go pode resolver o problema, pois as contas Pay As You Go tem um número maior de instâncias disponíveis. Você não será cobrado pelo uso de recursos gratuitos mesmo após o upgrade.

  • Erro 401-NotAuthenticated ou o comando kubectl não funciona. Isso ocorre porque o token de autenticação expirou

Gere um novo token de autenticação e exporte para a variável de ambiente OCI_CLI_AUTH.

oci session authenticate --region us-ashburn-1
  • Linux
export OCI_CLI_AUTH=security_token
  • Windows
set OCI_CLI_AUTH=security_token
  • Erros devido a falha na execução do tofu destroy, impossibilitando a exclusão do cluster e todos os recuros. Ou erros como o Error Code: CompartmentAlreadyExists que não são resolvidos com o tofu destroy

Para resolver esse problema, basta deletar os recursos manualmente no console da OCI. Seguindo a ordem abaixo:

Obs: Caso não apareça o Cluster ou a VPN para deletar, certifique que selecionou o Compartment certo k8s.

Referências

Criado por @Raphael Borges