Note:

Uso de Terraform para desplegar varios clusters de Kubernetes en diferentes regiones de OCI mediante OKE y creación de una red de malla completa mediante RPC

Introducción

En este tutorial, explicaremos cómo crear varios clusters de Kubernetes mediante Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) y desplegaremos estos clusters en tres países diferentes (regiones). Para acelerar el despliegue y desplegar los clusters de Kubernetes de forma consistente con la menor cantidad de errores de configuración, utilizaremos Terraform y algunos scripts bash personalizados.

image

También hemos desplegado de forma manual clusters únicos mediante el método de creación rápida y el método de creación personalizado.

Este tutorial es una actualización basada en esta documentación: Despliegue de varios clusters de Kubernetes en Oracle Cloud.

Objetivos

Tarea 1: Determinación de la topología (estrella frente a malla)

Estamos creando estos clústeres de Kubernetes para desplegar una aplicación basada en contenedores que se despliega en todas las regiones. Para permitir la comunicación entre estos clusters de Kubernetes, necesitamos tener algún tipo de comunicación de red. Por ahora, esto está fuera del alcance de este tutorial, pero necesitamos tomar algunas decisiones arquitectónicas por adelantado. Una de estas decisiones es determinar si queremos permitir la comunicación directa entre todas las regiones o queremos utilizar una región como centro para todas las comunicaciones y las otras como radio.

Topología de estrella: la topología de estrella permite la comunicación entre las regiones mediante una única región de hub. Por lo tanto, si los clusters de Kubernetes en San José desean comunicarse con los clusters de Kubernetes en Dubai, utilizarán Ámsterdam como centro de tránsito.

image

Topología de malla: la topología de malla permite la comunicación directa desde y hacia todas las regiones (clusters de Kubernetes). Por lo tanto, si los clusters de Kubernetes en San José desean comunicarse con los clusters de Kubernetes en Dubai, pueden comunicarse directamente.

image

En este tutorial, vamos a crear una topología de malla, y esta conectividad se realizará mediante DRG y RPC.

Tarea 2: Preparación del entorno para la autenticación y ejecución de scripts de Terraform

Antes de utilizar Terraform, debemos preparar nuestro entorno. Para utilizar Terraform, abra un terminal. En este tutorial, estamos utilizando la aplicación de terminal OS X.

image

  1. Ejecute el siguiente comando para verificar que Terraform está instalado, agregado a su ruta de acceso y cuál es la versión.

    Last login: Thu Apr  4 08:50:38 on ttys000
    iwhooge@iwhooge-mac ~ % terraform -v
    zsh: command not found: terraform
    iwhooge@iwhooge-mac ~ %
    
  2. Puede ver que no se encuentra el comando, lo que significa que Terraform no está instalado o que no se ha agregado a la variable de ruta de acceso.

image

Como puede ver, Terraform no está instalado, por lo que debemos instalarlo. Observará que no solo está instalando Terraform, sino que también son necesarios varios pasos para desplegar la aplicación Terraform y preparar el entorno para que nuestra solución completa de creación de scripts despliegue tres clusters de Kubernetes en tres regiones diferentes.

La siguiente imagen proporciona orientación sobre las tareas necesarias que se deben realizar.

image

Tarea 2.1: Instalación de Homebrew

Terraform se puede instalar con diferentes métodos. En este tutorial, instalaremos Terraform con Homebrew.

Homebrew es un gestor de paquetes para MacOS (y Linux) que se puede utilizar para instalar aplicaciones y sus dependencias necesarias son como apt o yum.

Tarea 2.2: Uso de Homebrew para instalar Terraform

En esta tarea, utilizaremos Homebrew para instalar el paquete de Terraform.

Tarea 2.3: Creación de claves RSA locales para la autenticación de OCI

Para permitir la autenticación con OCI mediante una clave de API, solo necesitamos generar una nueva clave privada y pública con este fin.

  1. Ejecute el siguiente comando para cambiar el directorio al directorio principal.

    iwhooge@iwhooge-mac ~ % cd ~/
    
  2. Ejecute el siguiente comando para verificar que se encuentra en el directorio raíz.

    iwhooge@iwhooge-mac ~ % pwd
    
  3. Verifique que el directorio raíz sea correcto.

    /Users/iwhooge
    
  4. Ejecute el siguiente comando para crear un nuevo directorio que contenga la información para autenticarse con OCI.

    iwhooge@iwhooge-mac ~ % mkdir .oci
    
  5. Ejecute el siguiente comando para generar una clave 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. Ejecute el siguiente comando para que el archivo de clave privada sea legible.

    iwhooge@iwhooge-mac ~ % chmod 600 ~/.oci/4-4-2023-rsa-key.pem
    
  7. Ejecute el siguiente comando para generar una clave RSA pública a partir de la clave 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 que se haya completado la escritura de claves.

    writing RSA key
    
  9. Ejecute el siguiente comando para ver el contenido de la clave RSA privada.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key.pem
    
  10. Verifique el contenido de la clave RSA privada.

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpQIBAAKCAQEA52+LJ+gp3MAJGtXTeQ/dmqq6Xh1zufK0yurLt/0w/DuxqEsL
    RT7x+Znz6EOVLx34Ul27QnHk7bhXaDCuwInnaOTOiS97AnLuFM08tvFksglnJssA
    JsszfTzUMNf0w4wtuLsJ5oRaPbVUa01TIm6HdwKAloIKYSn6z8gcvfLLItkyvPRo
    XXX
    w3yip+Yxr1YN3LjpDbZk4WTagKWoVQzp5nrfZlyU7ToZcMpUn/fIUsI=
    -----END RSA PRIVATE KEY-----
    
  11. Ejecute el siguiente comando para ver el contenido de la clave RSA pública.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key-public.pem
    
  12. Verifique el contenido de la clave RSA pública.

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

image

Tarea 2.4: Generación de claves SSH locales para la autenticación del host bastión

También necesitamos crear claves SSH locales para autenticarnos con el host de Bastion. Esta es otra clave que estamos utilizando para la autenticación con la consola de OCI (API).

  1. Ejecute el siguiente comando para cambiar el directorio a su directorio SSH.

    iwhooge@iwhooge-mac ~ % cd ~/.ssh/
    
  2. Ejecute el siguiente comando para verificar que tiene una clave SSH pública y privada que se puede utilizar.

    iwhooge@iwhooge-mac .ssh % ls -l -a
    
  3. Tenga en cuenta que no tenemos ningún par de claves SSH. En este tutorial, generaremos un nuevo par de claves 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. Ejecute el siguiente comando para generar un nuevo par de claves 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. Deje la frase de contraseña vacía y haga clic en INTRO.

    Enter passphrase (empty for no passphrase):
    
  6. Deje la frase de contraseña vacía y haga clic en INTRO.

    Enter same passphrase again:
    
  7. Tenga en cuenta que el nuevo par de claves SSH se guarda en las ubicaciones proporcionadas.

    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

Tarea 2.5: Creación de una clave de API en la consola de OCI y adición de la clave pública a su cuenta de OCI

Tarea 2.6: Recopilación de la información necesaria para su entorno de OCI

Necesitamos recopilar información para nuestros archivos de Terraform para la autenticación de OCI mediante la API. La mayor parte de la información ya se proporciona en el archivo de configuración de autenticación de API creado en la tarea 2.5.

Este es el compartimento en el que desplegará los clusters de Kubernetes.

Tarea 3: Creación de archivos y scripts de Terraform

Hemos completado la preparación de nuestra máquina local, incluida la configuración de claves de Terraform, RSA y SSH, la configuración del entorno de OCI (API) y la recopilación de toda la información esencial necesaria para autenticar Terraform con OCI. Ahora cree el script de Terraform.

En primer lugar, debemos verificar que estamos suscritos a las regiones en las que estamos desplegando nuestros clusters de Kubernetes. Si estamos realizando el despliegue en una región no suscrita, se producirá un error de autenticación y el despliegue fallará.

Para este tutorial, estamos utilizando las siguientes tres regiones para el despliegue: Ámsterdam, San José y Dubai.

Tarea 4: Ejecución de clusters de Terraform y OKE junto con los recursos necesarios (VCN, subredes, DRG, RPC, etc.)

Tenemos los scripts de Terraform en su lugar con el parámetro correcto. Ahora, ejecute los scripts y cree nuestro entorno que consta de tres clusters de Kubernetes en tres regiones diferentes.

En la siguiente imagen se muestra desde donde está configurando la conexión SSH al host bastión y desde el host bastión al host operador.

image

Ahora, hemos desplegado tres clusters de Kubernetes en las distintas regiones. Eche un vistazo a los recursos desplegados desde un nivel superior en la consola de OCI.

Tarea 5: Establecer conexiones RPC

Establezca las conexiones entre los distintos anexos de RPC. Repasemos primero en las diferentes regiones.

Recopilar todos los OCID de RPC

Repita el proceso para todas las conexiones de intercambio de tráfico remoto en todas las regiones de todos los DRG y guárdelas.

Ahora, hemos recopilado los siguientes OCID de conexión de intercambio de tráfico remoto:

Creación de Peerings de RPC

Configure el intercambio de tráfico en C1 en C2 y C3. Esto configurará automáticamente el intercambio de tráfico para C1 en el lado C2 y C3, y la configuración del intercambio de tráfico en C2 en C3 configurará automáticamente el intercambio de tráfico para C2 en el lado C3.

Configure los intercambios C1 (Ámsterdam).

Configure el intercambio de tráfico C2 (San José).

Tarea 6: Uso del visualizador de red para verificar las conexiones de RPC

Realice una comprobación adicional para asegurarse de que la RPC se ha configurado correctamente con Network Visualizer.

  1. Haga clic en el menú de hamburguesa en la esquina superior izquierda.
  2. Haga clic en Red.
  3. Haga clic en Visualizador de red.

image

  1. Asegúrese de que está conectado a la región Ámsterdam.
  2. Tenga en cuenta que la región de Amsterdam es c1.
  3. Tenga en cuenta las conexiones desde Ámsterdam a San José y Dubai.

image

  1. Asegúrese de que está conectado a la región San José.
  2. Tenga en cuenta que la región de San José es c2.
  3. Tenga en cuenta las conexiones de San José a Ámsterdam y Dubai.

image

  1. Asegúrese de estar conectado a la región Dubai.
  2. Tenga en cuenta que la región de Dubai es c3.
  3. Tenga en cuenta las conexiones desde Dubai a Ámsterdam y San José.

image

Tarea 7: Uso del bastión y el operador para comprobar el funcionamiento de la conectividad

Hemos creado los clusters de Kubernetes (en las tres regiones diferentes) y conectado las regiones mediante RPC. Ahora podemos utilizar el host de operador para verificar que el operador puede gestionar los clusters de Kubernetes.

  1. Ejecute el siguiente comando (que se proporcionó después de la finalización del 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. Ejecute el siguiente comando que iterará mediante un bucle for a través de cada cluster de Kubernetes (c1, c2 y c3) y recuperará el estado de los nodos de trabajador.

    [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 ~]$
    

    Ejecute el siguiente comando en el terminal después de conectarse al host del operador.

    for c in c1 c2 c3; do
      kubectx $c
      kubectl get nodes
    done
    
  3. Observe la salida de todos los nodos de todos los clusters de Kubernetes desplegados mediante el script de Terraform.

image

Ejecute el comando kubectl get all -n kube-system con el bucle 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 ~]$

Tarea 8: Supresión de los clusters de OKE con Terraform

Hemos utilizado Terraform para nuestro despliegue, por lo que también podemos utilizar Terraform para suprimir el despliegue completo.

Agradecimientos

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en Oracle Learning Explorer.

Para obtener documentación sobre el producto, visite Oracle Help Center.