Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever em uma conta gratuita, consulte Conceitos Básicos do Oracle Cloud Infrastructure Free Tier.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
Implemente um cluster Kubernetes com Terraform usando o Oracle Cloud Infrastructure Kubernetes Engine
Introdução
A implementação do Kubernetes com o Terraform no Oracle Cloud Infrastructure Kubernetes Engine (OCI Kubernetes Engine ou OKE) oferece uma abordagem simplificada e escalável para gerenciar aplicativos em contêineres na nuvem. O OKE, um serviço Kubernetes gerenciado pela Oracle Cloud Infrastructure, simplifica a implantação, o gerenciamento e o dimensionamento de clusters do Kubernetes.
Usando o Terraform, uma ferramenta Infrastructure as Code (IaC), você pode automatizar o provisionamento e a configuração de clusters do OKE, garantindo consistência e eficiência. Essa combinação permite implementações repetíveis, controle de versão da infraestrutura e atualizações fáceis, tornando-a ideal para equipes nativas da nuvem e focadas em DevOps que buscam aproveitar o ecossistema da Oracle Cloud Infrastructure.
Neste tutorial, vamos implantar uma arquitetura Kubernetes muito específica no OCI OKE usando o Terraform.
Vamos implantar os seguintes componentes:
- Gateway de Internet
- Gateway NAT
- Gateway de Serviço
- 7 x Sub-redes (Privadas e Públicas)
- 2 x Pools de Nós
- 4 x Nós de Trabalho (Instâncias)
- Bastion (Instância)
- Operador (Instância)
Objetivos
- Implante um cluster do Kubernetes com o Terraform usando o OKE.
Pré-requisitos
- Para implantar objetos no OCI usando o Terraform, primeiro você precisa preparar seu ambiente para autenticar e executar scripts do Terraform. Para obter mais informações, consulte Tarefa 2: Preparar seu Ambiente para Autenticação e Executar Scripts do Terraform.
Tarefa 1: Clonar o Repositório com os Scripts do Terraform
-
Clone o repositório
terraform-oci-oke
a partir daqui: terraform-oci-oke.- No momento de escrever este tutorial, a versão mais recente é
5.1.8
. - Você pode fazer download do arquivo zip completo com o repositório completo ou cloná-lo usando o comando
git clone
. - Clique na versão para acessar a ramificação 5.1.8.
- Observe que você está na ramificação 5.1.8.
- Clique na pasta docs.
- No momento de escrever este tutorial, a versão mais recente é
-
Clique na pasta src.
-
Clique no arquivo SUMMARY.md.
-
Clique em Introdução.
- Observe que você ainda está na ramificação 5.1.8; outras ramificações podem conter diferentes tipos de etapas de documentação, dependendo da versão do código.
- Observe que você está na página começando, e essa página fará exatamente o que o título diz.
Na saída a seguir, você pode ver como usamos a página Conceitos Básicos para criar este tutorial.
-
Execute o comando
git clone
para clonar o repositório.iwhooge@iwhooge-mac ~ % git clone https://github.com/oracle-terraform-modules/terraform-oci-oke.git tfoke
-
Execute o comando a seguir para alterar a pasta para a pasta do repositório.
-
Execute o comando a seguir para listar o conteúdo da pasta.
-
Você pode ver todos os arquivos do repositório.
-
Crie um arquivo
providers.tf
dentro desse diretório com o conteúdo a seguir.providers.tf
:provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = var.region tenancy_ocid = var.tenancy_id user_ocid = var.user_id } provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = var.home_region tenancy_ocid = var.tenancy_id user_ocid = var.user_id alias = "home" }
- Execute o comando a seguir para listar o conteúdo da pasta.
- Observe que o arquivo
providers.tf
é criado.
-
Execute o comando a seguir para inicializar o Terraform e fazer upgrade dos módulos necessários.
iwhooge@iwhooge-mac tfoke % terraform init --upgrade
-
Observe que a mensagem: O Terraform foi Inicializado com sucesso é exibida.
-
Certifique-se de ter as informações a seguir disponíveis para criar o arquivo
terraform.tfvars
. Essas informações podem ser recuperadas usando as seguintes etapas mencionadas aqui: Tarefa 2: Preparar seu Ambiente para Autenticação e Executar Scripts do Terraform.OCID da Tenancy ocid1.tenancy.oc1..aaaaaaaaXXX OCID do Usuário ocid1.user.oc1..aaaaaaaaXXX Impressão Digital 30:XXX Região me-abudhabi-1 Caminho da Chave Privada ~/.oci/4-4-2023-rsa-key.pem OCID do Compartimento ocid1.compartment.oc1..aaaaaaaaXXX -
Precisamos criar um arquivo
terraform.tfvars
dentro desse diretório com o conteúdo a seguir.terraform.tfvars
:# Identity and access parameters api_fingerprint = "30:XXX" api_private_key_path = "~/.oci/4-4-2023-rsa-key.pem" home_region = "me-abudhabi-1" region = "me-abudhabi-1" tenancy_id = "ocid1.tenancy.oc1..aaaaaaaaXXX" user_id = "ocid1.user.oc1..aaaaaaaaXXX" # general oci parameters compartment_id = "ocid1.compartment.oc1..aaaaaaaaXXX" timezone = "Australia/Sydney" # ssh keys ssh_private_key_path = "~/.ssh/id_rsa" ssh_public_key_path = "~/.ssh/id_rsa.pub" # networking create_vcn = true assign_dns = true lockdown_default_seclist = true vcn_cidrs = ["10.0.0.0/16"] vcn_dns_label = "oke" vcn_name = "oke" # Subnets subnets = { bastion = { newbits = 13, netnum = 0, dns_label = "bastion", create="always" } operator = { newbits = 13, netnum = 1, dns_label = "operator", create="always" } cp = { newbits = 13, netnum = 2, dns_label = "cp", create="always" } int_lb = { newbits = 11, netnum = 16, dns_label = "ilb", create="always" } pub_lb = { newbits = 11, netnum = 17, dns_label = "plb", create="always" } workers = { newbits = 2, netnum = 1, dns_label = "workers", create="always" } pods = { newbits = 2, netnum = 2, dns_label = "pods", create="always" } } # bastion create_bastion = true bastion_allowed_cidrs = ["0.0.0.0/0"] bastion_user = "opc" # operator create_operator = true operator_install_k9s = true # iam create_iam_operator_policy = "always" create_iam_resources = true create_iam_tag_namespace = false // true/*false create_iam_defined_tags = false // true/*false tag_namespace = "oke" use_defined_tags = false // true/*false # cluster create_cluster = true cluster_name = "oke" cni_type = "flannel" kubernetes_version = "v1.29.1" pods_cidr = "10.244.0.0/16" services_cidr = "10.96.0.0/16" # Worker pool defaults worker_pool_size = 0 worker_pool_mode = "node-pool" # Worker defaults await_node_readiness = "none" worker_pools = { np1 = { shape = "VM.Standard.E4.Flex", ocpus = 2, memory = 32, size = 1, boot_volume_size = 50, kubernetes_version = "v1.29.1" } np2 = { shape = "VM.Standard.E4.Flex", ocpus = 2, memory = 32, size = 3, boot_volume_size = 150, kubernetes_version = "v1.30.1" } } # Security allow_node_port_access = false allow_worker_internet_access = true allow_worker_ssh_access = true control_plane_allowed_cidrs = ["0.0.0.0/0"] control_plane_is_public = false load_balancers = "both" preferred_load_balancer = "public"
- Execute o comando a seguir para listar o conteúdo da pasta.
- Observe que o arquivo
terraform.tfvars
é criado.
Tarefa 2: Executar Aplicação do Terraform e Criar um Cluster do OKE com os Recursos Necessários (VCN, Sub-redes etc.)
-
Execute o comando a seguir para planejar a implantação de cluster do Kubernetes no OKE usando o Terraform.
iwhooge@iwhooge-mac tfoke % terraform plan
- Observe que esse código do Terraform implantará 77 objetos.
- Execute o comando
terraform apply
.
-
Execute o comando a seguir para aplicar a implantação de cluster do Kubernetes no OKE usando o Terraform.
iwhooge@iwhooge-mac tfoke % terraform apply
- Observe que esse código do Terraform implantará 77 objetos.
- Digite
yes
para continuar a implantação.
Quando a implantação for concluída, você verá uma mensagem informando que a aplicação foi concluída.
-
Observe a saída que foi fornecida com informações úteis que você pode precisar para sua referência.
Saídas:
apiserver_private_host = "10.0.0.22" availability_domains = tomap({ "1" = "cAtJ:ME-ABUDHABI-1-AD-1" }) bastion_id = "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkxxxxxx5chephxjadkxqa2ekxksb5gokj4q" bastion_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaxxxxxxxxxxxy5qm22odw7by37h77ki6cosoqd7pzwq" bastion_public_ip = "129.151.149.237" bastion_subnet_cidr = "10.0.0.0/29" bastion_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaxxxxxxxxxxxxxxxxmyzp6f2czibfr6534evfkt7m2a" cluster_endpoints = tomap({ "kubernetes" = "" "private_endpoint" = "10.0.0.22:6443" "public_endpoint" = "" "vcn_hostname_endpoint" = "cbyedhyevbq.cp.oke.oraclevcn.com:6443" }) cluster_id = "ocid1.cluster.oc1.me-abudhabi-1.aaaaaaaxxxxxxxxxxxxx57gz5q26hmpzkbcbyedhyevbq" control_plane_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaavxvgoewcgxxxxxxxxxxxxx6psycdz6zz5gaf6re4kcxa" control_plane_subnet_cidr = "10.0.0.16/29" control_plane_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaajvvpdmuixxxxxxxxxxxjkpx77hqu3v2s4qilnp56a" dynamic_group_ids = tolist([ "ocid1.dynamicgroup.oc1..aaaaaaaafsikvwgexxxxxxxxx5tx2u4c2s2eic4sslwyabva", ]) ig_route_table_id = "ocid1.routetable.oc1.me-abudhabi-1.aaaaaaaalxxxxxxxxxxxxxxcyzrl2af4ihrkhcjttu2w7aq" int_lb_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaanwppaafc7fyiwcoyhjxxxxxxxxxxxxxxxxx6a6752l7547gxg7ea" int_lb_subnet_cidr = "10.0.2.0/27" int_lb_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaawo5xmcwwbzk3gxxxxxxxxxxxxxxxxxxjjfllbvsdauaq" lpg_all_attributes = {} nat_route_table_id = "ocid1.routetable.oc1.me-abudhabi-1.aaaaaaaapqn3uqtszdcxxxxxxxxxxxxxxxxxliwveow232xgffigq" operator_id = "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac5exxxxxxxxxxxxxxxxxxxxxxxrfdxsjdfzmq56jja" operator_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaao5kh3z3eaf4zhbtxixxxxxxxxxxxxxxxxxxxxxevyds3cbrjqzthv5ja" operator_private_ip = "10.0.0.14" operator_subnet_cidr = "10.0.0.8/29" operator_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaa6vnirazbox2edmtnxrzhxxxxxxxxxxxxxxxxxxxishk7556iw6zyq" pod_subnet_cidr = "10.0.128.0/18" pod_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaasfnwg3lnyphk5h275r46ksi3xxxxxxxxxxxxxxxxxxxxxxxqz25iwkcinxa" policy_statements = tolist([ "Allow dynamic-group oke-operator-lccwyk to MANAGE clusters in compartment id ocid1.compartment.oc1..aaaaaaaa323ijv54zwkwbz2hhr2nnqoywlpxxxxxxxxxxxxxxxxxxxxxxxtecokaq4h4a", ]) pub_lb_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaae5stez5u26g6x75dy5nf72mfcixxxxxxxxxxxxxxxxxxxxxxxx2nwkwv5nkaa" pub_lb_subnet_cidr = "10.0.2.32/27" pub_lb_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaagr5j2l6tu3rmroejg6t4nrixxxxxxxxxx6oar6xcirvq" ssh_to_bastion = "ssh -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx" ssh_to_operator = "ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx' -i ~/.ssh/id_rsa opc@10.0.0.14" state_id = "lccwyk" vcn_id = "ocid1.vcn.oc1.me-abudhabi-1.amaaaaaapkbrwsaatndqrw3xq7e7krqfxxxxxxxxxxxxxxxpywz4qvhida" worker_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaazbpfavygiv4xy3khfi7cxunixxxxxxxxxxxxxxxxjvsm6jqtja" worker_pool_ids = { "np1" = "ocid1.nodepool.oc1.me-abudhabi-1.aaaaaaaauo57ekyoiiaif25gq7uwrpxxxxxxxxxxxxxxpsnygeam7t2wa" "np2" = "ocid1.nodepool.oc1.me-abudhabi-1.aaaaaaaa7423cp6zyntxwxokol3kmdxxxxxxxxxxxxx3wnayv2xq6nyq" } worker_pool_ips = { "np1" = { "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac3t3smjsyxjgen4zqjpxxxxxxxxxxxxx663igu7cznla" = "10.0.90.37" } "np2" = { "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac2eayropnzgazrxxxxxxxxxxxxxxxxpiykrq4r5pbga" = "10.0.125.238" "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsace4aup47ukjcedxxxxxxxxxxxxxxxxxx2hdxbsyiitva" = "10.0.92.136" "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsacojjri4b7qsaxxxxxxxxxxxxxxxxxnarf75ejv7a2a" = "10.0.111.157" } } worker_subnet_cidr = "10.0.64.0/18" worker_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaarrnazbrmwbiyl3ljmdxhgmxxxxxxxxxxxxxxxxxxxv3wtgmiucnsa" iwhooge@iwhooge-mac tfoke %
Tarefa 3: Confirmar Implantação do Terraform na Console do OCI
Navegue até a Console do OCI e confirme as implantações do Terraform a seguir.
-
Cluster do OCI Kubernetes Engine
-
Vá até a Console do OCI.
- Navegue até Serviços ao Desenvolvedor e clique em Clusters do Kubernetes (OKE).
- Clique no cluster oke do Kubernetes criado na Tarefa 2.
-
Rolar para Baixo.
- Clique em Pools de nós.
- Clique no pool de nós np1.
-
Rolar para Baixo.
-
Observe que há um nó de trabalho no pool de nós np1.
-
Vá para a página anterior e clique no pool de nós np2.
-
Rolar para Baixo.
-
Observe que há três nós de trabalho no pool de nós np2.
-
-
Instâncias
-
Vá até a Console do OCI.
- Navegue até o serviço Compute e clique em Instâncias.
- Revise os quatro nós de trabalhador do cluster do Kubernetes.
- Verifique o operador do cluster do Kubernetes.
- Verifique se o host bastion pertence ao cluster do Kubernetes.
-
-
Rede Virtual na Nuvem
-
Vá para a Console do OCI, navegue até Rede, Redes virtuais na nuvem e clique na VCN oke.
-
Clique em Sub-redes e você poderá ver todas as sete sub-redes do cluster do Kubernetes.
-
A imagem a seguir ilustra o que criamos até agora com o script Terraform.
-
Tarefa 4: Usar o Bastion e o Operador para Verificar a Conectividade
Na saída, você encontrará alguns comandos para estabelecer conexão com o ambiente do Kubernetes quando a implantação do Terraform for concluída.
-
Execute o comando a seguir para estabelecer conexão com o bastion host.
ssh_to_bastion = "ssh -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx"
-
Execute o comando a seguir para estabelecer conexão com o operador do Kubernetes por meio do bastion host.
ssh_to_operator = "ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx' -i ~/.ssh/id_rsa opc@10.0.0.14"
-
Gerenciaremos o cluster do Kubernetes do operador. Digite yes duas vezes e execute o comando
kubectl get nodes
para obter os nós de Trabalho do Kubernetes. -
Para facilitar em termos de conexões SSH, adicione os comandos adicionais a seguir no arquivo
~/.ssh/config
.Host bastion47 HostName 129.xxx.xxx.xxx user opc IdentityFile ~/.ssh/id_rsa UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50 Host operator47 HostName 10.0.0.14 user opc IdentityFile ~/.ssh/id_rsa ProxyJump bastion47 UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50
Depois de adicionar o conteúdo a seguir ao arquivo
~/.ssh/config
, você poderá usar nomes simples nos comandos SSH.iwhooge@iwhooge-mac tfoke % ssh operator47
Tarefa 5: Excluir o Cluster do Kubernetes usando o Terraform
-
Execute o comando
terraform destroy
para excluir o cluster do Kubernetes no OKE.iwhooge@iwhooge-mac tfoke % terraform destroy
-
Insira sim.
Quando o processo de destruição for concluído, você verá uma mensagem informando que a destruição foi concluída.
Próximas Etapas
A implementação do cluster do Kubernetes no OCI Kubernetes Engine usando o Terraform fornece uma solução eficiente, automatizada e escalável para gerenciar aplicativos em contêineres na nuvem.
Ao aproveitar os recursos IaC do Terraform, você garante que seus clusters do Kubernetes sejam implantados de forma consistente e possam ser facilmente mantidos ou atualizados com o tempo.
Essa integração simplifica o processo, permitindo um melhor controle de versão, dimensionamento automatizado e uma configuração de infraestrutura repetível. Esteja você gerenciando um único cluster ou dimensionando entre ambientes, essa abordagem permite que as equipes gerenciem suas cargas de trabalho do Kubernetes com confiabilidade e facilidade na Oracle Cloud Infrastructure.
Confirmações
- Autor - Iwan Hoogendoorn (Especialista em Rede da OCI)
Mais Recursos de Aprendizagem
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o Oracle Help Center.
Deploy a Kubernetes Cluster with Terraform using Oracle Cloud Infrastructure Kubernetes Engine
G18106-01
October 2024