En este post vamos a preparar la computadora del operador e instalar RKE

Requisitos

  • Leer parte 1 y 2

Laboratorio

Prepara la computadora del operador

  1. Necesitamos preparar la computadora del operador con el binario RKE, podemos descargarlo en la siguiente pagina
Releases · rancher/rke
Rancher Kubernetes Engine (RKE), an extremely simple, lightning fast Kubernetes distribution that runs entirely within containers. - rancher/rke

2. Una vez que encuentres la version y arquitectura correcta para tu computadora, da click derecho sobre el archivo y selecciona "Copy link location"

No descargues un pre-release, descarga unicamente lastest release o release

3. Abre una terminal en la computadora del operador y usa wget seguido de la liga para descargar el binario

wget https://github.com/rancher/rke/releases/download/v1.2.1/rke_linux-amd64

4. Dale permisos de ejecución

chmod +x rke_linux_amd64

5. Revisa cuales son las carpetas de entorno $PATH, usa el comando echo $PATH para mostrarlas

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

6. Mueve el binario a una carpeta de entorno PATH y renombra, personalmente prefiero /usr/local/bin/ por que casi siempre esta vacío

sudo mv rke_linux_amd64 /usr/local/bin/rke

7. Revisa la instalación

rke --version
rke version v1.2.1

8. Ahora instalemos kubectl el cli que puede comunicarse al master de Kubernetes, iniciemos instalando las dependencias

sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl

9. Descarga el binario de kubectl con el siguiente comando

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"

10. Dale permisos de ejecución

chmod +x kubectl

11. Mueve el binario al la carpeta de entorno $PATH

sudo mv kubectl /usr/local/bin/

12. Revisa la instalación de kubectl

kubectl version --client
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:50:19Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}

13. Instala Helm, obten el binario de la siguiente liga

Releases · helm/helm
The Kubernetes Package Manager. Contribute to helm/helm development by creating an account on GitHub.

14. Ubica la arquitectura correcta de tu cpu y da clic derecho seleccionando "Copy Link Location"

15. Descarga el binario con wget copiando después el link

wget https://get.helm.sh/helm-v3.4.0-linux-amd64.tar.gz

16. Descomprime el archivo con tar

tar -zxvf helm-v3.4.0-linux-amd64.tar.gz

17. Mueve el binario a una carpeta de entorno $PATH

sudo mv linux-amd64/helm /usr/local/bin

18. Prueba el binario

helm version
version.BuildInfo{Version:"v3.4.0", GitCommit:"7090a89efc8a18f3d8178bf47d2462450349a004", GitTreeState:"clean", GoVersion:"go1.14.10"}

Instala RKE

19. Tenemos todo listo para instalar el clúster RKE, primero necesitamos crear el archivo de configuración, vamos a llamarlo "cluster.yml", este es un archivo YAML, si quieres saber mas acerca de YAML puedes encontrarlo aquí

nano cluster.yml

20. Agrega la configuracion de nodos

nodes:
  - address: 192.168.1.50
#    internal_address:
    user: ubuntu
    role: [controlplane, worker, etcd]
  - address: 192.168.1.51
#    internal_address:
    user: ubuntu
    role: [controlplane, worker, etcd]
  - address: 192.168.1.52
#    internal_address:
    user: ubuntu
    role: [controlplane, worker, etcd]

En esta área vamos a especificar los nodos, cada guion medio (-) representa un nodo y sus atributos, veamos mas en detalle

Variable Opción requerido
address dirección externa para comunicarse con el clúster
internal_address dirección interna para comunicación entre nodos no
user usuario que usará los comandos docker
role controlplane, worker, etcd al menos uno
Si tienes una dirección IP externa y vas a usar mas de un cluster RKE sobre internet, necesitas poner la dirección externa e interna.

En mi caso voy a usar los 3 puestos en los nodos (roles), para el Servidor Rancher, sin embargo es recomendable separar por lo menos los trabajadores (workers) para que la carga de trabajo no interfiera con el cluster, en este caso no habra problema por que dedicaremos el cluster al servidor Rancher

Ahora que sabemos en que se compone la parte de nodos, voy a usar otro tipo de configuraciones, es importante que revises la configuracion ideal para tus requerimientos, el documento de muestra de Rancher RKE viene muy bien explicado, puedes revisarlo aquí y aquí

Copia información de la pagina web a tus requerimientos, mi archivo quedo así

nodes:
  - address: 192.168.1.51
#    internal_address:
    user: ubuntu
    role: [controlplane, worker, etcd]
  - address: 192.168.1.52
#    internal_address:
    user: ubuntu
    role: [controlplane, worker, etcd]
  - address: 192.168.1.53
#    internal_address:
    user: ubuntu
    role: [controlplane, worker, etcd]

# If set to true, RKE will not fail when unsupported Docker version
# are found
ignore_docker_version: false

# Cluster level SSH private key
# Used if no ssh information is set for the node
ssh_key_path: ~/.ssh/rke

# Enable use of SSH agent to use SSH private keys with passphrase
# This requires the environment `SSH_AUTH_SOCK` configured pointing
#to your SSH agent which has the private key added
ssh_agent_auth: false

# Set the name of the Kubernetes cluster  
cluster_name: rancher

# Specify network plugin-in (canal, calico, flannel, weave, or none)
# We going to use flannel work with arm64 architecture, change your iface
network:
    plugin: flannel
    options:
        flannel_iface: eth0
        flannel_backend_type: vxlan

# Use this network plug-in if you are using amd64 architecture 
# network:
#    plugin: canal
#    options:
#        canal_iface: eth1
#        canal_flannel_backend_type: vxlan


# Etcd snapshots
services:
  etcd:
    backup_config:
      interval_hours: 12
      retention: 6
    snapshot: true
    creation: 6h
    retention: 24h
    
# Currently only nginx ingress provider is supported.
# To disable ingress controller, set `provider: none`
# `node_selector` controls ingress placement and is optional
ingress:
    provider: nginx
    options:
     use-forwarded-headers: "true"
Algo que necesito puntualizar aquí, es que el plug-in de red (network) por default es canal, yo voy a usar flannel, por que voy a usar arquitectura para arm64, y es recomendado, si tu vas a usar amd64, por favor comenta la parte del plug-in flannel y habilita la parte de canal, puedes leer mas al respecto aquí

21. Vamos a crear el clúster RKE

rke up

22. Al final vas a tener algo como esto

INFO[0304] [addons] CoreDNS deployed successfully       
INFO[0304] [dns] DNS provider coredns deployed successfully 
INFO[0304] [addons] Setting up Metrics Server           
INFO[0304] [addons] Saving ConfigMap for addon rke-metrics-addon to Kubernetes 
INFO[0304] [addons] Successfully saved ConfigMap for addon rke-metrics-addon to Kubernetes 
INFO[0304] [addons] Executing deploy job rke-metrics-addon 
INFO[0319] [addons] Metrics Server deployed successfully 
INFO[0319] [ingress] Setting up nginx ingress controller 
INFO[0319] [addons] Saving ConfigMap for addon rke-ingress-controller to Kubernetes 
INFO[0319] [addons] Successfully saved ConfigMap for addon rke-ingress-controller to Kubernetes 
INFO[0319] [addons] Executing deploy job rke-ingress-controller 
INFO[0334] [ingress] ingress controller nginx deployed successfully 
INFO[0334] [addons] Setting up user addons              
INFO[0334] [addons] no user addons defined              
INFO[0334] Finished building Kubernetes cluster successfully 
Revisa que no tengas advertencias o errores

23. Cuando termine, van a quedar tres archivos cluster.rkestate,  cluster.yml y kube_config_cluster.yml guarda estos archivos en un lugar seguro, estos archivos contienen el estado de tu clúster y los accesos para kubectl.

Rancher recomienda encriptar cluster.rkstate

24. Usa el archivo kube_config_cluster.yml para configurar kubectl, exportando KUBECONFIG

export KUBECONFIG=./kube_config_cluster.yml

25. Prueba la conexión de kubectl con el Master de kubernetes con get nodes

kubectl get nodes
NAME             STATUS     ROLES                      AGE   VERSION
ubuntu-1         Ready   controlplane,etcd,worker      10m   v1.19.3
ubuntu-2         Ready   controlplane,etcd,worker      10m   v1.19.3
ubuntu-3         Ready   controlplane,etcd,worker      10m   v1.19.3

En el siguiente post vamos a instalar el servidor Rancher sobre el clúster RKE

Limpieza

Para eliminar el clúster solo se necesita usar el comando rke remove usando los archivos cluster.rkstate y cluster.yml

rke remove
INFO[0000] Running RKE version: v1.2.1                  
Are you sure you want to remove Kubernetes cluster [y/n]:y
...
INFO[0038] Removing local admin Kubeconfig: ./kube_config_cluster.yml 
INFO[0038] Local admin Kubeconfig removed successfully  
INFO[0038] Removing state file: ./cluster.rkestate      
INFO[0038] State file removed successfully              
INFO[0038] Cluster removed successfully        

References: