Skip to content

Commit

Permalink
Merge branch 'Rapha-Borges:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
gitbarnabedikartola authored Feb 1, 2024
2 parents 3a4b18b + 6e30c86 commit 6547210
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 66 deletions.
36 changes: 36 additions & 0 deletions .github/workflows/close-inactive-issues.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Close inactive issues
on:
schedule:
- cron: "30 1 * * *"

jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v5
with:
days-before-issue-stale: 30
days-before-issue-close: 14
stale-issue-label: "stale"
stale-issue-message: >
This issue has been automatically marked as stale because it has not had
activity in the 30 days. It will be closed in 14 days if no further activity occurs. Please
feel free to leave a comment if you believe the issue is still relevant.
Thank you for your contributions!
close-issue-message: >
This issue has been automatically closed because it has not had any further
activity in the last 14 days. Thank you for your contributions!
days-before-pr-stale: 60
days-before-pr-close: 14
stale-pr-label: "stale"
stale-pr-message: >
This pull request has been automatically marked as stale because it has not had
activity in the last 60 days. It will be closed in 14 days if no further activity occurs. Please
feel free to give a status update or ping for review. Thank you for your contributions!
close-pr-message: >
This pull request has been automatically closed because it has not had any further
activity in the last 14 days. Thank you for your contributions!
repo-token: ${{ secrets.GITHUB_TOKEN }}
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,10 @@ id_rsa*

# Ignore output shell
output-gen*
tfplan
tfplan

# file with credentials
env.sh

# Directory for sensible files and external files: i.e. env.sh / deployment.yaml
temp
113 changes: 53 additions & 60 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,44 +1,35 @@
# Criando um Cluster Kubernetes na OCI utilizando Terraform [#MêsDoKubernetes](https://github.com/linuxtips/MesDoKubernetes)

### EM ATUALIZAÇÃO - VERIFIQUE A [ISSUE #8](https://github.com/Rapha-Borges/oke-free/issues/8) PARA MAIORES INFORMAÇÕES
# Criando um Cluster Kubernetes na OCI utilizando OpenTofu [#MêsDoKubernetes](https://github.com/linuxtips/MesDoKubernetes)

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](https://signup.cloud.oracle.com/)

### Variáveis do Terraform personalizadas para o lab

Caso queira realizar o lab com as configurações utilizadas na live, basta substituir as variáveis do Terraform no arquivo `variables.tf` pelas variáveis abaixo. Mas lembre-se, as instâncias criadas com essas configurações só serão gratuitas enquanto os seus créditos oferecidos pela Oracle durante o #MêsDoKubernetes estiverem ativos.

```
region = us-ashburn-1
### Pontos Importantes Antes de Começar

shape = VM.Standard.E3.Flex
- Devido limitações da conta gratuita, você provavelmente precisará realizar o [upgrade para uma conta](https://cloud.oracle.com/invoices-and-orders/upgrade-and-payment) `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.

memory_in_gbs_per_node = 4
- Crie um alerta na sua conta para não ser cobrado por acidente [Budget](https://cloud.oracle.com/usage/budgets).

image_id = ocid1.image.oc1.iad.aaaaaaaanwsto6tqklfuawgqrve5ugjpbff3l5qtb7bs35dp72ewcnsuwoka
node_size = 1
kubernetes_version = v1.28.2
```
- 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 Terraform
## Instalando o OpenTofu

- GNU/Linux

```sh
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
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

1. Baixe o [Terraform](https://www.terraform.io/downloads.html) e descompacte o arquivo em um diretório de sua preferência.

2. Adicione o diretório ao [PATH do Windows](https://www.java.com/pt-BR/download/help/path_pt-br.html).
```powershell
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

Expand Down Expand Up @@ -70,7 +61,7 @@ oci -v

- GNU/Linux

Kubectl é quem faz a comunicação com a API Kubernetes usando CLI. Devemos usar a mesma versão que está explicita na variáveis do terraform. Veja [variables.tf](variables.tf)
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](variables.tf)

1. Baixando o binário kubectl

Expand Down Expand Up @@ -120,18 +111,24 @@ kubectl version --client --output=yaml

## Autenticando na OCI

1. Crie uma `API key`
1. Antes de começar, clone o repositório.

```sh
git clone https://github.com/Rapha-Borges/oke-free.git
```

2. Crie uma `API key`

- Entre no seu perfil, acesse a aba [API Keys](https://cloud.oracle.com/identity/domains/my-profile/api-keys) e clique em `Add API Key`.

2. Selecione `Generate API key pair`, faça o download da chave privada. Em seguida, clique em `Add`.
3. Selecione `Generate API key pair`, faça o download da chave privada. Em seguida, clique em `Add`.

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

- GNU/Linux

```
mv ~/Downloads/<nome_do_arquivo>.pem ~/.oci/oci_api_key.pem
mkdir -p ~/.oci && mv ~/Downloads/<nome_do_arquivo>.pem ~/.oci/oci_api_key.pem
```

- Windows
Expand All @@ -140,13 +137,13 @@ mv ~/Downloads/<nome_do_arquivo>.pem ~/.oci/oci_api_key.pem
move C:\Users\<user>\Downloads\<nome_do_arquivo>.pem C:\Users\<user>\.oci\oci_api_key.pem
```

4. Corrija as permissões da chave privada:
5. Corrija as permissões da chave privada:

```
oci setup repair-file-permissions --file <caminho_da_chave_privada>
```

5. 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.
6. 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

Expand Down Expand Up @@ -178,18 +175,18 @@ region=xxxxxxxx
key_file=C:\Users\<user>\.oci\oci_api_key.pem
```

6. Crie a chave `ssh` (No Windows, utilize o [Git Bash](https://git-scm.com/downloads) para executar o comando abaixo).
7. Crie a pasta `./ssh` e gere a chave `ssh` (No Windows, utilize o [Git Bash](https://git-scm.com/downloads) para executar o comando abaixo).

```bash
ssh-keygen -t rsa -b 4096 -f ssh/id_rsa
ssh-keygen -t rsa -b 4096 -f ./ssh/id_rsa
```

7. Crie o arquivo com as variáveis de ambiente, substituindo os valores das variáveis pelos valores da sua conta.
8. 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
vim ./env.sh
```

```
Expand All @@ -205,7 +202,7 @@ export TF_VAR_oci_profile="DEFAULT"
Agora rode o script para exportar as variáveis:

```
source env.sh
source ./env.sh
```

- Windows
Expand All @@ -222,38 +219,34 @@ set TF_VAR_ssh_public_key=C:\Users\<user>\.oci\ssh\id_rsa.pub
set TF_VAR_oci_profile="DEFAULT"
```

Agora execute o arquivo para exportar as variáveis:

```
env.bat
```

## Criando o cluster

1. Clone o repositório.

```sh
git clone https://github.com/Rapha-Borges/oke-free.git
```

2. Inicialize o Terraform.
1. Instale os módulos

```sh
terraform init
tofu init
```

3. Crie o cluster.
2. Crie o cluster.

```sh
terraform apply
tofu apply
```

- OBS: Opicionalmente, você pode utilizar o comando `terraform plan` para visualizar as alterações que serão realizadas antes de executar o `terraform apply`. Com os seguintes comandos:
- 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:

```
terraform plan -out=oci.tfplan
terraform apply "oci.tfplan" -auto-approve
tofu plan -out=oci.tfplan
tofu apply -auto-approve "oci.tfplan"
```

4. Edite o arquivo `~/.kube/config` para adicionar a autenticação com a `API KEY` conforme exemplo abaixo.
3. Edite o arquivo `~/.kube/config` para adicionar a autenticação com a `API KEY` conforme exemplo abaixo.

```sh
- name: user-xxxxxxxxxx
Expand All @@ -275,17 +268,17 @@ terraform apply "oci.tfplan" -auto-approve
- DEFAULT # ADICIONE ESSA LINHA
```

5. Acesse o cluster.
4. Acesse o cluster.

```sh
kubectl get nodes
```

### Script para criação do cluster

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.
#### Atenção: O script está em fase de testes e funciona apenas no Linux.

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.

```sh
./main.sh
Expand All @@ -295,18 +288,18 @@ Atenção: O script está em fase de testes e funciona apenas no Linux.

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 saída do Terraform, no formato `public_ip = "xxx.xxx.xxx.xxx"` e pode ser consultado a qualquer momento com o comando:
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:

```sh
terraform output public_ip
tofu output public_ip
```

## Deletando o cluster

1. Para deletar o cluster bastar executar o comando:

```sh
terraform destroy
tofu destroy
```

## Problemas conhecidos
Expand Down Expand Up @@ -339,7 +332,7 @@ export OCI_CLI_AUTH=security_token
set OCI_CLI_AUTH=security_token
```

- ### Erros devido a falha na execução do `terraform 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 `terraform destroy`
- ### 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:

Expand All @@ -349,10 +342,10 @@ Para resolver esse problema, basta deletar os recursos manualmente no console da

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



# Referências

- [Terraform Documentation](https://www.terraform.io/docs/index.html)
- [OpenTofu Documentation](https://opentofu.org/docs/)
- [Terrafom Essentials](https://www.linuxtips.io/course/terraform-essentials)
- [Free Oracle Cloud Kubernetes cluster with Terraform](https://arnoldgalovics.com/oracle-cloud-kubernetes-terraform/)

## Criado por [@Raphael Borges](https://r11s.com.br/)
2 changes: 1 addition & 1 deletion kubeconfig/kubeconfig.tf
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
resource "null_resource" "create_kubeconfig" {
provisioner "local-exec" {
command = "oci ce cluster create-kubeconfig --cluster-id ${var.cluster_id} --file ~/.kube/config --token-version 2.0.0 --kube-endpoint PUBLIC_ENDPOINT"
command = "oci ce cluster create-kubeconfig --cluster-id ${var.cluster_id} --file ~/.kube/config --token-version 2.0.0 --kube-endpoint PUBLIC_ENDPOINT --profile ${var.oci_profile}"
}
}
3 changes: 3 additions & 0 deletions kubeconfig/variables.tf
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
variable "cluster_id" {
}

variable "oci_profile" {
}
3 changes: 2 additions & 1 deletion terrafile.tf
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,9 @@ module "loadbalancer" {

module "kubeconfig" {
source = "./kubeconfig"
cluster_id = module.cluster.cluster_id
depends_on = [ module.loadbalancer ]
cluster_id = module.cluster.cluster_id
oci_profile = var.oci_profile
}

output "public_ip" {
Expand Down
10 changes: 7 additions & 3 deletions variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ variable "image_id" {
default = "ocid1.image.oc1.iad.aaaaaaaao2zpwcb2osmbtliiuzlphc3y2fqaqmcpp5ttlcf573sidkabml7a"
}
# Link to a list of available images (Be sure to select the correct region and CPU architecture. We are using Oracle-Linux-8.8-aarch64-2023.09.26-0-OKE-1.28.2-653)
# https://docs.cloud.oracle.com/iaas/images/
# https://docs.oracle.com/en-us/iaas/images/image/d4c060a5-041c-477b-8226-2d25d91c4ffb/

# ----------> Cluster <----------
variable "k8s_version" {
Expand All @@ -42,7 +42,7 @@ variable "k8s_version" {

variable "node_size" {
type = string
default = "1"
default = "3"
}

variable "cluster_name" {
Expand Down Expand Up @@ -79,7 +79,7 @@ variable "listerner_port" {
default = 80
}

# ----------> SSH <----------
# ----------> Auth <----------

variable "ssh_public_key" {
type = string
Expand All @@ -100,3 +100,7 @@ variable "tenancy_ocid" {
variable "user_ocid" {
type = string
}

variable "oci_profile" {
type = string
}

0 comments on commit 6547210

Please sign in to comment.