Criar um Cluster do Kubernetes

Use o Terraform para configurar um cluster do Kubernetes na sua conta do Oracle Cloud Infrastructure.

As principais tarefas incluem:

  • Copie seus scripts existentes dos tutoriais do Terraform.
  • Edite os scripts existentes para reutilização.
  • Escreva novos scripts para um cluster do Kubernetes.
Um diagrama dos componentes necessários para criar um cluster do Kubernetes com o Terraform. Em um ambiente Linux local, o usuário se conecta a uma conta do Oracle Cloud Infrastructure e cria um cluster. A criação do cluster inclui a criação de recursos de rede. Os recursos de rede incluem uma sub-rede regional privada para nós de trabalho. Esses nós são nós de computação. Também existe uma sub-rede regional pública criada para uso de balanceadores de carga. Neste exemplo, cada sub-rede regional abrange três domínios de disponibilidade: AD1, AD2 e AD3. A sub-rede pública está conectada à internet com uma seta bidirecional. A sub-rede privada tem duas setas de saída unidirecionais, uma para a internet e outra para a rede de serviços da Oracle.

Para obter mais informações, consulte:

1. Reunir as Informações Necessárias

Reúna informações para as instâncias de computação no pool de nós.

Obter a Forma do Nó
Este tutorial usa VM.Standard2.1 para as instâncias de computação no pool de nós.
Salve o <node-shape> VM.Standard2.1 no bloco de notas.
Para saber mais sobre a forma, vá para Formas Padrão.
Obter ID da Imagem
  1. Na barra de navegação da Console, localize sua região.
  2. Vá para Notas da Release da Imagem.
  3. Selecione Oracle Linux 7.x.
  4. Selecione o Oracle Linux 7.x-<date> mais recente. Não selecione nenhuma imagem identificada como Gen2-GPU.
  5. Copie o OCID da Imagem da sua região.
  6. Salve o <image-ocid> no bloco de notas.
    Observação

    Certifique-se de selecionar um OCID comercial sem gov em seu OCID.

2. Copiar Scripts Existentes

Copie scripts criados em Configurar uma Infraestrutura Simples com o OCI Terraform. Em seguida, remova os scripts e as saídas relacionadas à instância de computação. Na próxima seção, você declara um pool de nós com instâncias de computação.

Copiar os Scripts
  1. No diretório $HOME, crie um diretório chamado tf-cluster e passe para ele.
    mkdir tf-cluster
    cd tf-cluster
  2. Copie todos os arquivos que terminam em .tf do diretório tf-simple-infrastructure.
    cp ../tf-simple-infrastructure/*.tf .
  3. Confirme se você tem os arquivos a seguir no diretório.
    ls
    availability-domains.tf
    compartment.tf
    compute.tf
    outputs.tf
    private-security-list.tf
    private-subnet.tf
    provider.tf
    public-security-list.tf
    public-subnet.tf
    vcn-module.tf
    Observação

    Não copie os arquivos de estado (terraform.tfstate ou terraform.tfstate.backup). Esses arquivos contêm o estado dos recursos do diretório atual. Depois de executar os scripts nesse novo diretório, você obtém um novo arquivo de estado.
Remover Scripts Irrelevantes
  1. Remova o arquivo compute.tf do diretório tf-cluster.
    rm compute.tf
  2. No arquivo outputs.tf, remova todas as saídas da instância de computação.
    
    
    # Outputs for compute instance
    
    output "public-ip-for-compute-instance" {
      value = oci_core_instance.ubuntu_instance.public_ip
    }
    output "instance-name" {
      value = oci_core_instance.ubuntu_instance.display_name
    }
    
    output "instance-OCID" {
      value = oci_core_instance.ubuntu_instance.id
    }
    
    output "instance-region" {
      value = oci_core_instance.ubuntu_instance.region
    }
    
    output "instance-shape" {
      value = oci_core_instance.ubuntu_instance.shape
    }
    
    output "instance-state" {
      value = oci_core_instance.ubuntu_instance.state
    }
    
    output "instance-OCPUs" {
      value = oci_core_instance.ubuntu_instance.shape_config[0].ocpus
    }
    
    output "instance-memory-in-GBs" {
      value = oci_core_instance.ubuntu_instance.shape_config[0].memory_in_gbs
    }
    
    output "time-created" {
      value = oci_core_instance.ubuntu_instance.time_created
    }

3. Criar Scripts

Crie scripts para um cluster, um pool de nós e para imprimir saídas.

Declarar um Cluster
  1. Crie um arquivo denominado cluster.tf.
  2. Adicione o código a seguir a cluster.tf.
    • Substitua <your-cluster-name> pelo nome de sua escolha. Exemplo: tf-cluster.
    # Source from https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/containerengine_cluster
    
    resource "oci_containerengine_cluster" "oke-cluster" {
        # Required
        compartment_id = oci_identity_compartment.tf-compartment.id
        kubernetes_version = "v1.21.5"
        name = "<your-cluster-name>"
        vcn_id = module.vcn.vcn_id
    
        # Optional
        options {
            add_ons{
                is_kubernetes_dashboard_enabled = false
                is_tiller_enabled = false
            }
            kubernetes_network_config {
                pods_cidr = "10.244.0.0/16"
                services_cidr = "10.96.0.0/16"
            }
            service_lb_subnet_ids = [oci_core_subnet.vcn-public-subnet.id]
        }  
    }
  3. Salve o arquivo cluster.tf.
Explicação

Em Referência de Argumento (oci_containerengine_cluster), localize todos os argumentos necessários:

  • compartment_id
  • kubernetes_version
  • nome
  • vcn_id
Para navegar até este URL

Para navegar até Referência de Argumento (oci_containerengine_cluster):

  1. Vá para Provedor do Oracle Cloud Infrastructure.
  2. Na caixa Filtro no canto superior esquerdo, digite container engine.

    Os resultados são retornados para origens de dados e recursos.

  3. Em Mecanismo de Contêiner, vá para Recursos e selecione oci_containerengine_cluster.
  4. Selecione Referência de Argumento.

    A Referência de Argumento é aberta.

Construa um bloco de recursos:

  • Declarar um bloco de recursos com a palavra-chave: resource
  • Adicione um label para o tipo: "oci_containerengine_cluster"
  • Adicione um label para um nome local (sua escolha):
    • O label pode conter letras, dígitos, sublinhados (_) e hifens (-). O primeiro caractere não deve ser um dígito.
    • Exemplo: "oke-cluster"
  • Dentro do bloco de código, forneça um valor para os argumentos obrigatórios:
    • compartment_id: Aponte para o compartimento declarado em compartment.tf: oci_identity_compartment.tf-compartment.id
    • kubernetes_version: Este tutorial usa a versão v1.21.5. Você pode marcar a opção Criação Rápida na Console para a versão mais recente.
    • nome: Designe um nome de sua escolha.
    • vcn_id: Aponte para o compartimento declarado em vcn-module.tf: module.vcn.vcn_id

    Um argumento necessário não tem um valor padrão.

  • Forneça valores para os seguintes argumentos opcionais para substituir seus valores padrão.
    • add_ons: Designe true ou false para os seguintes argumentos:
      • is_kubernetes_dashboard_enabled
      • is_tiller_enabled
    • kubernetes_network_config: Designe um bloco CIDR como uma string para os seguintes argumentos:
      • pods_cidr
      • services_cidr
      Observação

      O bloco CIDR dos pods não deve se sobrepor ao nó de trabalho e aos blocos CIDR de sub-rede do balanceador de carga.

      O bloco CIDR do serviço Kubernetes não deve se sobrepor com o bloco CIDR de VCN.

      O exemplo de código neste tutorial usa os mesmos blocos CIDR da opção Criação Rápida na Console.

      Para obter mais explicações, consulte Blocos CIDR e Kubernetes Engine (OKE).

    • service_lb_subnet_ids: Designe a sub-rede pública declarada em public-subnet.tf
      Observação

      O argumento, service_lb_subnet_ids aceita uma lista de ids de sub-rede:
      • Mesmo que você tenha uma sub-rede, use colchetes para denotar uma lista.
      • Exemplo: [oci_core_subnet.vcn-public-subnet.id]
Declarar um Pool de Nós
  1. Crie um arquivo chamado node-pool.tf.
  2. Adicione o código a seguir a node-pool.tf.
    • Substitua os seguintes campos pelas informações coletadas na seção um:
      • <node-shape> com VM.Standard2.1
      • <image-ocid>
    • Substitua o seguinte campo pelo nome escolhido quando você declarou um cluster:
      • <your-cluster-name>
    # Source from https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/containerengine_node_pool
    
    resource "oci_containerengine_node_pool" "oke-node-pool" {
        # Required
        cluster_id = oci_containerengine_cluster.oke-cluster.id
        compartment_id = oci_identity_compartment.tf-compartment.id
        kubernetes_version = "v1.21.5"
        name = "pool1"
        node_config_details{
            placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            } 
            placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[1].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            }
             placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[2].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            }
            size = 3
        }
        node_shape = "<node-shape>"
    
        # Using image Oracle-Linux-7.x-<date>
        # Find image OCID for your region from https://docs.oracle.com/iaas/images/ 
        node_source_details {
             image_id = "<image-ocid>"
             source_type = "image"
        }
     
        # Optional
        initial_node_labels {
            key = "name"
            value = "<your-cluster-name>"
        }    
    }
  3. Salve o arquivo node-pool.tf.
Explicação

Em Referência de Alarme (oci_containerengine_node_pool), localize todos os argumentos necessários:

  • cluster_id
  • compartment_id
  • kubernetes_version
  • nome
  • node_config_details
    • placement_configs
      • availability_domain
      • subnet_id
  • node_shape
  • node_source_details
    • image_id
    • source_type
Para navegar até este URL

Para navegar até Referência de Alarme (oci_containerengine_node_pool):

  1. Vá para Provedor do Oracle Cloud Infrastructure.
  2. Na caixa Filtro no canto superior esquerdo, digite container engine.

    Os resultados são retornados para origens de dados e recursos.

  3. Em Mecanismo de Contêiner, vá para Recursos e selecione oci_containerengine_node_pool.
  4. Selecione Referência de Argumento.

    A Referência de Argumento é aberta.

Construa um bloco de recursos:

  • Declarar um bloco de recursos com a palavra-chave: resource
  • Adicione um label para o tipo do recurso:
    "oci_containerengine_node_pool"
  • Adicione um label para um nome local (sua escolha):
    • O label pode conter letras, dígitos, sublinhados (_) e hifens (-). O primeiro caractere não deve ser um dígito.
    • Exemplo:"oke-node-pool"
  • Dentro do bloco de código, forneça um valor para os argumentos necessários:
    • cluster_id: Acione para o cluster declarado em cluster.tf:
      oci_containerengine_cluster.oke-cluster.id
    • compartment_id Aponte para o compartimento declarado em compartment.tf:
      oci_identity_compartment.tf-compartment.id
    • kubernetes_version: Este tutorial usa a mesma versão do assistente de Criação de Cluster da Console.
    • nome: Designe um nome de sua escolha. O Assistente de Criação de Cluster da Console usa o nome pool1.
    • node_shape: Insira as informações reunidas na seção um.
    • node_source_details:
      • image_id: Digite as informações reunidas na seção um.
      • source_type: Defina como "image".
  • Forneça valores para os seguintes argumentos opcionais para substituir seus valores padrão.
    • initial_node_labels: Atribua pares de chave/valor para os nós.
      • chave: Designe uma chave à sua escolha. A opção Criação Rápida da Console cria a chave "name".
      • valor: Designe um valor para a chave. A opção Criação Rápida da Console designa "<your-cluster-name>" à chave "name".
Adicionar Saídas

Nesta seção, você declara saídas para o cluster e o pool de nós.

  1. Adicione o código a seguir a outputs.tf.
    # Outputs for k8s cluster
    
    output "cluster-name" {
      value = oci_containerengine_cluster.oke-cluster.name
    }
    output "cluster-OCID" {
      value = oci_containerengine_cluster.oke-cluster.id
    }
    output "cluster-kubernetes-version" {
      value = oci_containerengine_cluster.oke-cluster.kubernetes_version
    }
    output "cluster-state" {
      value = oci_containerengine_cluster.oke-cluster.state
    }
    
    # Outputs for k8s node pool
    
    output "node-pool-name" {
      value = oci_containerengine_node_pool.oke-node-pool.name
    }
    output "node-pool-OCID" {
      value = oci_containerengine_node_pool.oke-node-pool.id
    }
    output "node-pool-kubernetes-version" {
      value = oci_containerengine_node_pool.oke-node-pool.kubernetes_version
    }
    output "node-size" {
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details[0].size
    }
    output "node-shape" {
      value = oci_containerengine_node_pool.oke-node-pool.node_shape
    }
  2. Salve o arquivo outputs.tf.
Explicação
Saídas para Itens da Lista
  • Em geral, os atributos de lista são plurais (termina em s).
  • Exemplo de atributo de lista para pool de nós:
    • node_config_details
  • Para gerar todos os atributos em uma lista, use o atributo de lista sozinho, sem colchetes.
  • Por exemplo:
    output "node-configuration-details"{
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details
    }

    Amostra de saída:

    node-configuration-details = [
      {
        "placement_configs" = [
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-1"
            "subnet_id" = "ocid1.subnet.xxx"
          },
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-2"
            "subnet_id" = "ocid1.subnet.xxx"
          },
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-3"
            "subnet_id" = "ocid1.subnet.xxx"
          },
        ]
        "size" = 3
      },
    ]
  • Para gerar ou chamar um item de uma lista:
    • Utilize o formato a seguir:

      <list-attribute-name>[index].<attribute-from-list>

    • Substitua [index] por:
      • [0] para o primeiro item.
      • [1] para o segundo item.
      • ...
      • [n] para o (n+1)oitem.
  • Por exemplo:

    Valor para o atributo size:

    output "node-size" {
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details[0].size
    }

4. Executar Scripts

Execute os scripts do Terraform para criar um compartimento, uma rede virtual na nuvem, um cluster do Kubernetes e um pool de nós.

Inicializar
  1. Inicialize um diretório de trabalho no diretório tf-cluster.
    terraform init

    Exemplo de saída:

    Initializing the backend...
    
    Initializing provider plugins...
    - Finding hashicorp/oci versions matching ">= 4.41.0"...
    - Installing hashicorp/oci v4.59.0...
    - Installed hashicorp/oci v4.59.0 (signed by HashiCorp)
    
    Terraform has been successfully initialized!
  2. Verifique o conteúdo do diretório tf-cluster.
    ls -a
    Observação

    Diagnóstico e Solução de Problemas:
    • Após executar terraform init
    • mensagem de erro: Falha ao consultar pacotes de provedores disponíveis:
      • Se você estiver em uma VPN, verifique as configurações do proxy.
Agora você tem uma pasta chamada .terraform que inclui os plug-ins do provedor oci.
Plano
  1. Crie um plano de execução:
    terraform plan
  2. Revise as alterações que o Terraform planeja fazer na sua conta.

    Exemplo de saída:

    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
    Plan: 14 to add, 0 to change, 0 to destroy.
Aplicação

Execute seus scripts do Terraform:

terraform apply

Quando for solicitada a confirmação, digite yes para que seus recursos sejam criados.

Pode levar 15 minutos ou mais para que o cluster seja criado. Depois que o Terraform criar os recursos, revise a saída no terminal.

Apply complete! Resources: 14 added, 0 changed, 0 destroyed.

Outputs:
...
cluster-OCID = ocid1.cluster.xxx
cluster-kubernetes-version = "v1.21.5"
cluster-name = <your-cluster-name>
cluster-state = ACTIVE
...
node-pool-OCID = ocid1.nodepool.xxx
node-pool-kubernetes-version = "v1.21.5"
node-pool-name = "pool1"
node-shape = "VM.Standard2.1"
node-size = 3
...
Diagnóstico e Solução de Problemas
  • erros 401 - (Service erro:NotAuthenticated):
    • Você tem um valor incorreto para um dos seguintes itens:
      • OCID da Tenancy
      • OCID do Usuário
      • impressão digital
      • Chave privada RSA (o caminho ou a chave)
  • esse host não está disponível:
    • Você tem um valor incorreto para:
      • identificador da região

Referências:

O Que Vem a Seguir

Parabéns! Você criou um cluster do Kubernetes usando o Terraform, na sua conta do Oracle Cloud Infrastructure.

Agora que você tem um cluster do Kubernetes, tente os tutoriais do Kubernetes em Tutoriais do Desenvolvedor.

Para explorar mais informações sobre desenvolvimento com produtos Oracle, confira estes sites: