Contacta: +34 955 277 794 |

info@dcloud.es

Despliegue de un cluster K8s con KOPS
07
julio
2020

No sé si os ocurre (a mi muchísimo), siempre que comento con compañeros qué estoy utilizando personalmente de forma directa o indirecta para el desarrollo o despliegue de alguna tecnología, no coincidimos es más, se me queda cara de “¿que me estoy perdiendo??” a la vez que mi respuesta casi siempre es, “si si… lo conozco…”, lo que viene siendo pequeñas mentiras piadosas…

Para el despliegue de un cluster Kubernetes no iba a ser menos. Existen multitud de opciones: Kops, Kubeadm, Rancher, KubeSpray, Kube-aws, … además obviamente de los clusters K8s como servicio entregados direcamtente por los proveedores cloud.

¿Qué herramienta elegir para éste proyecto?.  

Vamos a analizar de forma muy superficial las diferencias entre Kops y Kubeadm.

¿Qué es Kops?

Kops o Kubernetes Operations, es un proyecto de código abierto que permite desplegar y mantener un cluster Kubernetes de forma fácil y rápida. Soporta despliegue de infraestructuras sobre los servicios de AWS (soportado oficialmente), GCP y OpenStack (en versión beta) y vSphere pero en versión alpha.  https://github.com/kubernetes/kops

Algunas de las características de Kops:

  • Despliegue o provisiona uno o varios clusters de Masters.
  • Soporta topologías publicas y privadas.
  • Despliegue de clusters en Virtual Private Cloud (VPC) existentes o crea nuevas VPC desde cero con todos los elementos necesarios, incluido el servicio Load Balancer.
  • Posibilidad de despliegue de una instancia “Bastion” para el acceso SSH a nodos del cluster de forma individual.
  • Despliegue de actualizaciones de forma fácil y automática de forma disruptiva.
  • Soporte de despliegue de clusters heterogéneos con creación de múltiples grupos de instancias.  
  • Modelo de sincronización de estado con opción –dry-run como testing de despliegues, actualizaciones y cambios en la configuración.

Kops vs Kubeadm

La diferencia principal entre ambas herramientas radica en que Kubeadm no provisiona la infraestructura donde se despliega el cluster de Kubernetes, como si lo hace en cambio Kops. Por lo tanto Kubeadm asume que los servidores ya se encuentran aprovisionados. Kops por su parte es responsable del lifecycle del cluster, desde el provisionamiento, actualización hasta la eliminación, y es consciente del estado de todos los componentes o servicios: nodos, masters, load balancers, networking, autenticación, etc…

La diferencia positiva de Kubeadm por otro lado es que permite el despliegue del cluster de Kubernetes prácticamente sobre cualquier infraestructura, on-premises (independiente del hardware subyacente), AWS, GCP, etc… Podríamos decir que ambas herramientas no son competidores entre sí, si no que más bien pueden llegar a complementarse mutuamente.

Como desplegar K8s con Kops.

En éste caso la configuración hace uso de AWS como proveedor de infraestructura. Como prerequisitos Kops requiere tener instalado kubectl, aws cli, un bucket S3 y como elemento fundamental disponer de un dominio DNS correctamente configurado.

Básicamente Kops se comunica con las APIs de AWS y Kubernetes y almacena la información de gestión (estados, configuraciones, keys, etc.. ) en un bucket S3.

  1. El primer paso es la descarga e instalación de Kops en la máquina desde donde se desplegará y/o gestionará la infraestructura (en este caso todo se hace bajo Linux):
curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64

chmod +x kops-linux-amd64

sudo mv kops-linux-amd64 /usr/local/bin/kops
  1. Creación de un usuario con los permisos requeridos. Este enlace recoge la información específica sobre los permisos necesarios.
  2. DNS – siempre esencial, no lo iba a ser menos para Kops. En el caso del despliegue sobre AWS, Kops tiene la capacidad de gestionar las entradas relativas al cluster K8s, siempre y cuando el servicio DNS se encuentre “hospedado” en Route53 de la cuenta AWS donde se está desplegando la infraestructura. Para éste caso el dominio es k8s-kops-lab.example.com. En ese caso Kops creará de forma predeterminada dos registros: uno para el acceso API y otro para el host Bastion (en el caso de se seleccione esta opción).
  3. Creación del S3 bucket:
aws s3api create-bucket \
    --bucket infocluster.k8s-kops-lab.example.com \
    --region eu-west-1
aws s3api put-bucket-versioning \
    --bucket infocluster.k8s-kops-lab.example.com  \ 
    --versioning-configuration Status=Enabled
aws s3api put-bucket-encryption \ 
    --bucket infocluster.k8s-kops-lab.example.com  \
    --server-side-encryption-configuration \ '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'

5. Kops require la utilización de dos variables importantes, que se utilizan prácticamente con cada comando Kops. Añadir variables de entorno en Linux:

### de forma no permanente ###
export KOPS_CLUSTER_NAME=k8s-kops-lab.example.com
export KOPS_STATE_STORE=s3://infocluster.k8s-kops-lab.example.com

Desplegando el cluster:

En nuestro caso vamos a determinar los siguientes tamaños de instancias, como ejemplo para un entorno no demasiado exigente.

RoleAWS Type
Master/etcdm5.large
Workersm5a.xlarge
Bastiont2.nano

En base al tipo de instancia, vamos a obtener la configuración en formato yaml exportando la configuración y haciendo uso de la funcionalidad –dry-run que nos permite “evaluar” la ejecución de un comando. (https://kubernetes.io/docs/reference/using-api/api-concepts/#dry-run).

kops create cluster --name $KOPS_CLUSTER_NAME \
  --node-count 3 \
  --zones eu-west-1a,eu-west-1b,eu-west-1c \
  --master-zones eu-west-1a,eu-west-1b,eu-west-1c \
  --dns-zone k8s-kops-lab.example.com \
  --node-size m5a.xlarge \
  --master-size m5.large \
  --topology private \
  --networking calico \
  --cloud-labels "Environment=Live" \
  --bastion \
  --dry-run -o yaml > $KOPS_CLUSTER_NAME.yaml

Con este comando además de haber creado un fichero local llamado k8s-kops-lab.example.com.yaml, se habrá creado los ficheros de configuración necesarios en el bucket S3 $KOPS_STATE_STORE

Remplazar la SSH key con una que creamos nosotros o ya la tengamos creada.

cd ~/.ssh
ssh-keygen -t rsa -C "nonlive@example.com"

# Finalmente, adjuntamos la key a la configuración de Kops
kops create secret --name $KOPS_CLUSTER_NAME sshpublickey admin -i ~/.ssh/k8s-nonlive.pub

Finalmente desplegamos y validamos el cluster con –yes:

kops update cluster $KOPS_CLUSTER_NAME --yes
kops rolling-update cluster
kops validate cluster

Si el proceso es correcto debemos ver algo similar a esto:

sing cluster from kubectl context: k8s-kops-lab.example.com

Validating cluster 

INSTANCE GROUPS
NAME               ROLE     MACHINETYPE  MIN  MAX  SUBNETS
bastions           Bastion  t2.micro     1    1    utility-eu-west-1a,utility-eu-west-1b,utility-eu-west-1c
master-eu-west-1a  Master   t2.medium    1    1    eu-west-1a
master-eu-west-1b  Master   t2.medium    1    1    eu-west-1b
master-eu-west-1c  Master   t2.medium    1    1    eu-west-1c
nodes              Node     t2.large     2    2    eu-west-1a,eu-west-1b,eu-west-1c

NODE STATUS
NAME                                         ROLE    READY
ip-172-20-103-86.eu-west-1.compute.internal  master  True
ip-172-20-47-88.eu-west-1.compute.internal   node    True
ip-172-20-58-72.eu-west-1.compute.internal   master  True
ip-172-20-92-54.eu-west-1.compute.internal   node    True
ip-172-20-95-21.eu-west-1.compute.internal   master  True

Your cluster k8s-kops-lab.example.com is ready

Si en algún punto se necesita hacer cambios en el fichero yaml con los spec del cluster, se puede hacer con las siguientes instrucciones:

kops replace -f $KOPS_CLUSTER_NAME.yaml
kops update cluster $KOPS_CLUSTER_NAME --yes
kops rolling-update cluster $KOPS_CLUSTER_NAME –yes

En mi experiencia lo cierto es que Kops funciona realmente bien y ciertamente es capaz de desplegarlo todo de forma fácil y rápida. Además el proceso de actualización es totalmente automático, creando nuevas instancias EC2, incorporándolas al cluster y eliminando las instancias con las versiones anteriores, balanceando las cargas sin problemas.

Sin duda una opción muy acertada para el despliegue y mantenimiento de clusters K8s en AWS.

dpedrajas | Etiquetas: , , , ,
  • 580 Views
  • Comments are closed.