Este repositório contém os arquivos de terraform
utilizados para criação e gerenciamento de um cluster kubernetes
, utlizando o OKE
da OCI
, da minha conta pessoal utilizada para estudos.
- Arquivo de estado
- Requisitos
- Infraestrutura
- Recursos provisionados e roadmap
- Instalando o provider e inicializando o backend
- Planejando o ambiente
- Subindo o ambiente
- Configurando acesso ao cluster via kubectl
- Destruindo o ambiente
- Links úteis
Por motivos de padronização em meus projetos pessoais, esse repositório está apontando o tfstate
para o meu bucket s3
. Caso queira clonar e subir um ambiente utilizando esse repositório, será necessário alterar a seção de backend
no arquivo main.tf
, com a configuração desejada.
- conta na
OCI
terraform
instaladokubect
instaladooci cli
instalada e configurada- ter um
API Key
criado na OCI - conta na
AWS
e variavéisaccess key
/secret key
/region
exportadas na shell em execução para armazenamento dotfstate
, caso estiver utilizando os3
comobackend
(opcional) - definir as variáveis necessárias para login e para alocação dos recursos, conforme tabela abaixo:
Variável | Descrição | Autenticação | Alocação |
---|---|---|---|
tenancy_ocid | identificação única da conta | ✅ | ❌ |
user_ocid | usuário que está aplicando o terraform |
✅ | ❌ |
fingerprint | assinatura compatível com a API Key |
✅ | ❌ |
private_key_path | caminho da chave privada compatível com a API Key |
✅ | ❌ |
region | região utilizada para declaração do provider e alocação de recursos |
✅ | ✅ |
compartment_ocid | compartimento utilizado para alocação dos recursos | ❌ | ✅ |
availability_domain | domínio de disponibilidade utilizado para alocação dos recursos | ❌ | ✅ |
Para definir as variáveis, estou utilizando o arquivo terraform.tfvars
.
Exemplo de conteúdo do arquivo terraform.tfvars
:
#!/bin/bash
tenancy_ocid = "ocid1.tenancy.oc1..XXXXXXXXXXXX"
user_ocid = "ocid1.user.oc1..XXXXXXXXXXXXXXXXXX"
fingerprint = "XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"
private_key_path = "~/.keys/oci_api_key_tf.pem"
region = "sa-saopaulo-1"
compartment_ocid = "ocid1.compartment.oc1..XXXX"
availability_domain = "CyEp:SA-SAOPAULO-1-AD-1"
O terraform
atual provisiona um cluster kubernetes
, utilizando o serviço de kubernetes
gerenciado da oracle (OKE
), com 4 worker nodes
utilizando arquitetura ARM
, e expoẽ publicamente o endpoint
do API server
através de um IP
fixo.
Nesse modelo, temos uma subnet
pública, que é utilizada para alocação do API server
e para o load balancer
utilizado como ingress
no cluster (provisionado via K8S), e uma subnet
privada, para alocação dos worker nodes
.
Para garantir a segurança, são provisionados NSGs
(network security groups) em cada recurso ao invés de secutiry lists
a nível de subnet
, sendo assim,
modificamos o security list
padrão que é criado junto com a VCN
, para liberar todo o tráfego.
OBS: Essa arquitetura está utilizando dos recursos always free da oracle, e não é recomendado para produção devido utilização da arquitetura ARM
nos worker nodes
.
✅ = Provisionado
⏳ = Em roadmap
Recurso | Descrição | Status |
---|---|---|
vcn | rede virtual na nuvem | ✅ |
internet gateway | gateway utilizado para dar acesso a internet na subrede pública (entrada/saída) | ✅ |
nat gateway | gateway utilizado para dar acesso a internet na subnet privada (somente saída) | ✅ |
service gateway | gateway utilizada para dar acesso aos serviços internos da OCI | ✅ |
default vcn security list | altera a security list padrão da vnc, liberando todo o tráfico. | ✅ |
public subnet | subnet pública, utilizada para alocação do Kubernetes API Endpoint e LB | ✅ |
public subnet route table | tabela de rotas da subnet publica | ✅ |
private subnet | subnet privada, utlizada para alocação dos worker nodes | ✅ |
private subnet route table | tabela de rotas da subnet privada | ✅ |
api server network security group | grupo de segurança do api server | ✅ |
oke master | serviço de kubernetes gerenciado | ✅ |
node poll network security group | grupo de segurança dos worker nodes | ✅ |
node pool | abstração para conjunto de worker nodes | ✅ |
bastion | acesso aos worker nodes da subnet privada | ⏳ |
container registry | utilizado para guardar as imagens de containers | ⏳ |
file system | utilizado para PVs do cluster | ⏳ |
terraform init
terraform plan
terraform apply
export OKE_CLUSTER_ID=$(terraform output -raw cluster_id)
oci ce cluster create-kubeconfig --cluster-id $OKE_CLUSTER_ID --file $HOME/.kube/config \
--region sa-saopaulo-1 --token-version 2.0.0 --kube-endpoint PUBLIC_ENDPOINT
terraform destroy