Observação:

Usar o Terraform para Implantar Vários Clusters do Kubernetes em diferentes Regiões do OCI usando o OKE e Criar uma Rede de Malha Completa usando RPC

Introdução

Neste tutorial, explicaremos como criar vários clusters do Kubernetes usando o Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) e implantaremos esses clusters em três países diferentes (regiões). Para acelerar a implantação e implantar os clusters do Kubernetes de forma consistente com a menor quantidade de erros de configuração, usaremos o Terraform e alguns scripts bash personalizados.

image

Também implantamos manualmente clusters únicos usando o método de criação rápida e o método de criação personalizada.

Este tutorial é uma atualização baseada nesta documentação: Implantando vários clusters do Kubernetes no Oracle Cloud.

Objetivos

Tarefa 1: Determinar a Topologia (Estrela vs Malha)

Estamos criando esses clusters do Kubernetes para implementar um aplicativo baseado em contêiner que é implantado em todas as regiões. Para permitir a comunicação entre esses clusters do Kubernetes, precisamos ter alguma forma de comunicação de rede. Por enquanto, isso está fora do escopo deste tutorial, mas precisamos tomar algumas decisões arquitetônicas antecipadamente. Uma dessas decisões é determinar se queremos permitir a comunicação direta entre todas as regiões ou se queremos usar uma região como hub para toda a comunicação e as outras como spoke.

Topologia de Estrela: A topologia de estrela permite a comunicação entre as regiões usando uma única região de hub. Então, se os clusters do Kubernetes em San Jose quiserem se comunicar com os clusters do Kubernetes em Dubai, ele usará Amsterdã como um hub de trânsito.

image

Topologia de Malha: A topologia de malha permite comunicação direta de e para todas as regiões (clusters do Kubernetes). Portanto, se os clusters do Kubernetes em San Jose quiserem se comunicar com os clusters do Kubernetes em Dubai, eles poderão se comunicar diretamente.

image

Neste tutorial, vamos criar uma topologia de malha, e essa conectividade será feita usando DRG e RPC.

Tarefa 2: Preparar seu Ambiente para Autenticação e Executar Scripts do Terraform

Antes de usar o Terraform, precisamos preparar nosso ambiente. Para usar o Terraform, abra um terminal. Neste tutorial, estamos usando o aplicativo terminal OS X.

image

  1. Execute o comando a seguir para verificar se o Terraform está instalado, adicionado ao seu caminho e qual é a versão.

    Last login: Thu Apr  4 08:50:38 on ttys000
    iwhooge@iwhooge-mac ~ % terraform -v
    zsh: command not found: terraform
    iwhooge@iwhooge-mac ~ %
    
  2. Você pode ver que o comando não foi encontrado; isso significa que o Terraform não está instalado ou que ele não foi adicionado à variável de caminho.

image

Como você pode ver, o Terraform não está instalado, precisamos instalá-lo. Você notará que não está apenas instalando o Terraform, mas há várias etapas necessárias para implantar o aplicativo Terraform e preparar o ambiente para nossa solução completa de script para implantar três clusters do Kubernetes em três regiões diferentes.

A imagem a seguir fornece orientação sobre as tarefas necessárias a serem seguidas.

image

Tarefa 2.1: Instalar Homebrew

O Terraform pode ser instalado usando diferentes métodos. Neste tutorial, instalaremos o Terraform usando o Homebrew.

O Homebrew é um gerenciador de pacotes para MacOS (e Linux) que pode ser usado para instalar aplicativos e suas dependências necessárias são como apt ou yum.

Tarefa 2.2: Usar Homebrew para Instalar o Terraform

Nesta tarefa, usaremos o Homebrew para instalar o pacote Terraform.

Tarefa 2.3: Criar Chaves RSA Locais para Autenticação do OCI

Para permitir a autenticação com o OCI usando uma chave de API, precisamos gerar uma nova chave privada e pública apenas para essa finalidade.

  1. Execute o comando a seguir para alterar o diretório para o diretório principal.

    iwhooge@iwhooge-mac ~ % cd ~/
    
  2. Execute o comando a seguir para verificar se você está no diretório home.

    iwhooge@iwhooge-mac ~ % pwd
    
  3. Verifique se o diretório home está correto.

    /Users/iwhooge
    
  4. Execute o comando a seguir para criar um novo diretório que conterá as informações a serem autenticadas com o OCI.

    iwhooge@iwhooge-mac ~ % mkdir .oci
    
  5. Execute o comando a seguir para gerar uma chave RSA privada.

    iwhooge@iwhooge-mac ~ % openssl genrsa -out ~/.oci/4-4-2023-rsa-key.pem 2048
    Generating RSA private key, 2048 bit long modulus
    .........................................................................................................................................+++++
    ......+++++
    e is 65537 (0x10001)
    
  6. Execute o comando a seguir para tornar o arquivo de chave privada legível.

    iwhooge@iwhooge-mac ~ % chmod 600 ~/.oci/4-4-2023-rsa-key.pem
    
  7. Execute o comando a seguir para gerar uma chave RSA pública com base na chave privada.

    iwhooge@iwhooge-mac ~ % openssl rsa -pubout -in ~/.oci/4-4-2023-rsa-key.pem -out ~/.oci/4-4-2023-rsa-key-public.pem
    
  8. Verifique se a gravação da chave foi concluída.

    writing RSA key
    
  9. Execute o comando a seguir para verificar o conteúdo da chave RSA privada.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key.pem
    
  10. Verifique o conteúdo da chave RSA privada.

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpQIBAAKCAQEA52+LJ+gp3MAJGtXTeQ/dmqq6Xh1zufK0yurLt/0w/DuxqEsL
    RT7x+Znz6EOVLx34Ul27QnHk7bhXaDCuwInnaOTOiS97AnLuFM08tvFksglnJssA
    JsszfTzUMNf0w4wtuLsJ5oRaPbVUa01TIm6HdwKAloIKYSn6z8gcvfLLItkyvPRo
    XXX
    w3yip+Yxr1YN3LjpDbZk4WTagKWoVQzp5nrfZlyU7ToZcMpUn/fIUsI=
    -----END RSA PRIVATE KEY-----
    
  11. Execute o comando a seguir para verificar o conteúdo da chave RSA pública.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key-public.pem
    
  12. Verifique o conteúdo da chave RSA pública.

    ----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA52+LJ+gp3MAJGtXTeQ/d
    XXX
    mtHVtjLM1ftjYlaRSG5Xl/xdKMC8LH0bxpy3XXzLmDrYCP3LrhrIG8Xmuzsji6Hw
    TQIDAQAB
    -----END PUBLIC KEY-----
    iwhooge@iwhooge-mac ~ %
    

image

Tarefa 2.4: Gerar Chaves SSH Locais para Autenticação do Host do Bastion

Também precisamos criar chaves SSH locais para autenticação com o Bastion host. Esta é outra chave que estamos usando para autenticação com a Console do OCI (API).

  1. Execute o comando a seguir para alterar o diretório para seu diretório SSH.

    iwhooge@iwhooge-mac ~ % cd ~/.ssh/
    
  2. Execute o comando a seguir para verificar se você tem uma chave SSH pública e privada que possa ser usada.

    iwhooge@iwhooge-mac .ssh % ls -l -a
    
  3. Observe que não temos nenhum par de chaves SSH. Neste tutorial, geraremos um novo par de chaves SSH.

    total 16
    drwx------   4 iwhooge  staff   128 Feb  8 12:48 .
    drwxr-x---+ 30 iwhooge  staff   960 Apr  4 11:03 ..
    -rw-------@  1 iwhooge  staff  2614 Feb 28 11:49 known_hosts
    -rw-------@  1 iwhooge  staff  1773 Feb  8 12:48 known_hosts.old
    
  4. Execute o comando a seguir para gerar um novo par de chaves SSH.

    iwhooge@iwhooge-mac .ssh % ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/iwhooge/.ssh/id_rsa):
    
  5. Deixe a frase-senha vazia e clique em INTER.

    Enter passphrase (empty for no passphrase):
    
  6. Deixe a frase-senha vazia e clique em INTER.

    Enter same passphrase again:
    
  7. Observe que o novo par de chaves SSH é salvo nos locais fornecidos.

    Your identification has been saved in /Users/iwhooge/.ssh/id_rsa
    Your public key has been saved in /Users/iwhooge/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:2E7jD5Cvt0C3pArp+u5Q3BWDBDwfbtxp5T6eez75DPc iwhooge@iwhooge-mac
    The key's randomart image is:
    +---[RSA 3072]----+
    | ..o..o          |
    |  o o  o.        |
    |   = o.+         |
    | . .=.++.        |
    |  o...=.S        |
    | . . . Xoo       |
    |. o   o.*o...    |
    | o . . o+o++ .   |
    |.== . ..o=ooo E  |
    +----[SHA256]-----+
    iwhooge@iwhooge-mac .ssh %
    

image

Tarefa 2.5: Criar uma Chave de API na Console do OCI e Adicionar a Chave Pública à sua Conta do OCI

Tarefa 2.6: Coletar as Informações Necessárias para seu Ambiente do OCI

Precisamos coletar algumas informações para nossos arquivos Terraform para autenticação do OCI usando a API. A maioria das informações já é fornecida no arquivo de configuração de autenticação de API criado na Tarefa 2.5.

Este é o compartimento no qual você implantará seus clusters do Kubernetes.

Tarefa 3: Criar Scripts e Arquivos do Terraform

Concluímos a preparação em nossa máquina local, incluindo a configuração de chaves Terraform, RSA e SSH, a configuração do ambiente OCI (API) e a coleta de todas as informações essenciais necessárias para autenticar o Terraform com o OCI. Agora crie o script do Terraform.

Primeiro, precisamos verificar se estamos inscritos nas regiões nas quais estamos implantando nossos clusters do Kubernetes. Se estivermos implantando em uma região não inscrita, obteremos um erro de autenticação e a implantação falhará.

Para este tutorial, estamos usando as três regiões a seguir para implantação: Amsterdã, San Jose e Dubai.

Tarefa 4: Executar Clusters do Terraform e do OKE junto com os Recursos necessários (VCN, Sub-redes, DRGs, RPCs etc.)

Temos os scripts do Terraform no lugar com o parâmetro correto. Agora, execute os scripts e crie nosso ambiente que consiste em três clusters do Kubernetes em três regiões diferentes.

A imagem a seguir ilustra de onde você está configurando a conexão SSH com o bastion host e do bastion host para o operador host.

image

Agora, implementamos três clusters do Kubernetes nas diferentes regiões. Veja os recursos implantados de um alto nível na Console do OCI.

Tarefa 5: Estabelecer Conexões RPC

Estabeleça as conexões entre os vários anexos RPC. Em primeiro lugar, vamos analisá-las nas diferentes regiões.

Coletar Todos os OCIDs de RPC

Repita o processo para todas as conexões de pareamento remoto em todas as regiões de todos os DRGs e salve-as.

Agora, coletamos os seguintes OCIDs de conexão de pareamento remoto:

Criar Pares RPC

Configure o pareamento em C1 para C2 e C3. Isso configurará automaticamente o pareamento para C1 no lado C2 e C3, e a configuração do pareamento em C2 para C3 configurará automaticamente o pareamento para C2 no lado C3.

Configure os Pares C1 (Amsterdã).

Configure o Pareamento C2 (San Jose).

Tarefa 6: Usar o Visualizador de Rede para Verificar as Conexões RPC

Execute uma verificação adicional para garantir que a RPC tenha sido configurada corretamente com o Visualizador de Rede.

  1. Clique no menu de hambúrguer no canto superior esquerdo.
  2. Clique em Rede.
  3. Clique em Visualizador de Rede.

image

  1. Verifique se você está conectado à região de Amsterdã.
  2. Observe que a região de Amsterdã é c1.
  3. Observe as conexões de Amsterdã para San Jose e Dubai.

image

  1. Verifique se você está conectado à região San Jose.
  2. Observe que a região de San Jose é c2.
  3. Observe as conexões de San Jose para Amsterdã e Dubai.

image

  1. Verifique se você está conectado à região Dubai.
  2. Observe que a região de Dubai é c3.
  3. Observe as conexões de Dubai para Amsterdã e San Jose.

image

Tarefa 7: Usar o Bastion e o Operador para Verificar o Trabalho de Conectividade

Criamos os clusters do Kubernetes (em todas as três regiões diferentes) e conectamos as regiões usando RPC. Agora podemos usar o host do operador para verificar se o operador pode gerenciar os clusters do Kubernetes.

  1. Execute o comando a seguir (que foi fornecido após a conclusão do comando terraform plan).

    Last login: Fri Apr  5 09:10:01 on ttys000
    iwhooge@iwhooge-mac ~ % ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@143.47.183.243' -i ~/.ssh/id_rsa opc@10.1.0.12
    Activate the web console with: systemctl enable --now cockpit.socket
    Last login: Fri Apr  5 07:34:13 2024 from 10.1.0.2
    [opc@o-tmcntm ~]$
    
  2. Execute o comando a seguir que será iterado usando um loop for por meio de cada cluster do Kubernetes (c1, c2 e c3) e recupere o status dos nós de trabalho.

    [opc@o-tmcntm ~]$ for c in c1 c2 c3; do
    >   kubectx $c
    >   kubectl get nodes
    > done
    Switched to context "c1".
    NAME           STATUS   ROLES   AGE   VERSION
    10.1.113.144   Ready    node    76m   v1.28.2
    10.1.125.54    Ready    node    76m   v1.28.2
    Switched to context "c2".
    NAME          STATUS   ROLES   AGE   VERSION
    10.2.65.174   Ready    node    78m   v1.28.2
    10.2.98.54    Ready    node    78m   v1.28.2
    Switched to context "c3".
    NAME           STATUS   ROLES   AGE   VERSION
    10.3.118.212   Ready    node    73m   v1.28.2
    10.3.127.119   Ready    node    73m   v1.28.2
    [opc@o-tmcntm ~]$
    

    Execute o comando a seguir no terminal depois de se conectar ao host do operador.

    for c in c1 c2 c3; do
      kubectx $c
      kubectl get nodes
    done
    
  3. Observe a saída de todos os nós de todos os clusters do Kubernetes que foram implantados usando o script do Terraform.

image

Execute o comando kubectl get all -n kube-system com o loop for.

[opc@o-tmcntm ~]$ for c in c1 c2 c3; do
>   kubectx $c
>   kubectl get all -n kube-system
> done
Switched to context "c1".
NAME                                       READY   STATUS    RESTARTS       AGE
pod/coredns-844b4886f-8b4k6                1/1     Running   0              118m
pod/coredns-844b4886f-g8gbm                1/1     Running   0              122m
pod/csi-oci-node-5xzdg                     1/1     Running   0              119m
pod/csi-oci-node-nsdg4                     1/1     Running   1 (118m ago)   119m
pod/kube-dns-autoscaler-74f78468bf-l9644   1/1     Running   0              122m
pod/kube-flannel-ds-5hsp7                  1/1     Running   0              119m
pod/kube-flannel-ds-wk7xl                  1/1     Running   0              119m
pod/kube-proxy-gpvv2                       1/1     Running   0              119m
pod/kube-proxy-vgtf7                       1/1     Running   0              119m
pod/proxymux-client-nt59j                  1/1     Running   0              119m
pod/proxymux-client-slk9j                  1/1     Running   0              119m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.101.5.5   <none>        53/UDP,53/TCP,9153/TCP   122m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   122m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   122m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        122m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             122m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           122m
deployment.apps/kube-dns-autoscaler   1/1     1            1           122m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-844b4886f                2         2         2       122m
replicaset.apps/kube-dns-autoscaler-74f78468bf   1         1         1       122m
Switched to context "c2".
NAME                                       READY   STATUS    RESTARTS       AGE
pod/coredns-84bd9cd884-4fqvr               1/1     Running   0              120m
pod/coredns-84bd9cd884-lmgz2               1/1     Running   0              124m
pod/csi-oci-node-4zl9l                     1/1     Running   0              122m
pod/csi-oci-node-xjzfd                     1/1     Running   1 (120m ago)   122m
pod/kube-dns-autoscaler-59575f8674-m6j2z   1/1     Running   0              124m
pod/kube-flannel-ds-llhhq                  1/1     Running   0              122m
pod/kube-flannel-ds-sm6fg                  1/1     Running   0              122m
pod/kube-proxy-7ppw8                       1/1     Running   0              122m
pod/kube-proxy-vqfgb                       1/1     Running   0              122m
pod/proxymux-client-cnkph                  1/1     Running   0              122m
pod/proxymux-client-k5k6n                  1/1     Running   0              122m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.102.5.5   <none>        53/UDP,53/TCP,9153/TCP   124m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        124m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        124m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   124m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   124m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        124m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             124m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           124m
deployment.apps/kube-dns-autoscaler   1/1     1            1           124m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-84bd9cd884               2         2         2       124m
replicaset.apps/kube-dns-autoscaler-59575f8674   1         1         1       124m
Switched to context "c3".
NAME                                       READY   STATUS    RESTARTS   AGE
pod/coredns-56c7ffc89c-jt85k               1/1     Running   0          115m
pod/coredns-56c7ffc89c-lsqcg               1/1     Running   0          121m
pod/csi-oci-node-gfswn                     1/1     Running   0          116m
pod/csi-oci-node-xpwbp                     1/1     Running   0          116m
pod/kube-dns-autoscaler-6b69bf765c-fxjvc   1/1     Running   0          121m
pod/kube-flannel-ds-2sqbk                  1/1     Running   0          116m
pod/kube-flannel-ds-l7sdz                  1/1     Running   0          116m
pod/kube-proxy-4qcmb                       1/1     Running   0          116m
pod/kube-proxy-zcrk4                       1/1     Running   0          116m
pod/proxymux-client-4lgg7                  1/1     Running   0          116m
pod/proxymux-client-zbcrg                  1/1     Running   0          116m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.103.5.5   <none>        53/UDP,53/TCP,9153/TCP   121m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        121m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   121m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   121m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        122m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             122m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           121m
deployment.apps/kube-dns-autoscaler   1/1     1            1           121m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-56c7ffc89c               2         2         2       121m
replicaset.apps/kube-dns-autoscaler-6b69bf765c   1         1         1       121m
[opc@o-tmcntm ~]$

Tarefa 8: Excluir os Clusters do OKE usando o Terraform

Usamos o Terraform para nossa implantação, para que também possamos usar o Terraform para excluir a implantação completa.

Confirmação

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.