Kops: desplegando Kubernetes programáticamente

Miguel Fontanilla
Computación en la nube
June 5, 2020

Kops: desplegando Kubernetes programáticamente

Desplegar y configurar un clúster de Kubernetes desde cero puede ser bastante complejo, especialmente si no se emplean servicios de Kubernetes gestionados y es necesario garantizar alta disponibilidad. Kops (Kubernetes Operations) es una herramienta open source que permite crear, configurar, gestionar y hacer upgrades de clústers de Kubernetes no gestionados sobre proveedores de nube pública. En este post, aprenderás como desplegar un clúster de Kubernetes en alta disponibilidad en AWS utilizando Kops.

Kops por Pattern Match

Configurando Kops

El primer paso para utilizar Kops es instalar su CLI. Si estás utilizando una distribución de Linux de 64 bits, puedes utilizar los siguientes comandos, en cualquier otro caso échale un ojo a esta documentación.



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

Además tendrás que interaccionar con la API de AWS, por lo que es necesario instalar el AWS CLI. El conjunto de comandos a continuación permite instalarlo en máquinas Linux de 64 bits. Para cualquier otro tipo de SO, sigue estas instrucciones.



curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

Kops va a necesitar un usuario programático de IAM en AWS, de forma que pueda desplegar la infraestructura necesaria para el clúster de Kubernetes. Éste usuario debe tener permisos totales sobre los servicios IAM, EC2, S3, VPC y Route53. Para hacerlo de forma rápida y sencilla, se pueden asociar al usuario las policies gestionadas AmazonEC2FullAccess, AmazonRoute53FullAccess AmazonS3FullAccess, IAMFullAccess y AmazonVPCFullAccess.

Cuando crees el usuario para Kops, selecciona la opción de acceso programático, ya que al hacerlo AWS generará un par de claves (Access Key y Secret Key) para que el CLI pueda acceder a la API de AWS. Asegúrate de guardar bien la Secret Key porque es la única vez que AWS la mostrará. Una vez que dispongas de ambas claves, configúralas como las claves por defecto del CLI de AWS ejecutando el siguiente comando. También puedes configurar la región de AWS por defecto. Selecciona la que quieras utilizar para tu clúster.



aws configure

Para poder almacenar la configuración y el estado de los clústers, Kops va a necesitar un bucket S3. Es el momento de utilizar el AWS CLI con las nuevas credenciales configuradas para crear el bucket. Además, es recomendable activar el versionado en el bucket, ya que puede servir para recuperar el estado de los clústers en caso de fallo.



aws s3api create-bucket --bucket [your-s3-bucket] --region eu-west-1
aws s3api put-bucket-versioning --bucket [your-s3-bucket]  --versioning-configuration Status=Enabled

Creando el clúster

El script que encontrarás a continuación es una ayuda para la creación del clúster. Es posible seleccionar la versión de Kubernetes, el número de nodos masters y workers, el tipo de instancias, así como las zonas de disponibilidad en las que se desplegarán las instancias. Además se pueden configurar las diferentes opciones de red y el rango CIDR a utilizar. Para más información acerca de las opciones de red soportadas por Kops visita esta página. Además puedes utilizar flags adicionales para generar una salida en terraform o cloudformation de la infraestructura generada.

Modifica los parámetros en función de tus necesidades y ejecuta el script. Para este ejemplo, utilizaremos un cluster cuyo nombre acabará en .k8s.local, ya que es la configuración más sencilla, pues no requiere un servidor DNS externo para propagar las IPs de la API de Kubernetes. Si necesitas utilizar un servicio de DNS externo, puedes consultar la documentación avanzada de Kops. Al ejecutar el script, Kops generará la especificación del clúster, pero no lo desplegará aún.



#!/bin/bash

# Kops Kubernetes HA deployment for aws
export CLOUD=aws
MASTER_NUMBER=3
MASTER_ZONES="eu-west-1a,eu-west-1b,eu-west-1c"
MASTER_SIZE="t2.medium"
WORKER_NUMBER=3
WORKER_ZONES="eu-west-1a,eu-west-1b,eu-west-1c"
WORKER_SIZE="t2.medium"
CNI_PLUGIN="calico" 
CLUSTER_NAME="testlab.k8s.local" # if ends in .k8s.local --> gossip-based cluster
K8S_VERSION=1.17.0
NETWORK_CIDR="10.240.0.0/16"
NW_TOPOLOGY="private" # public: uses a gateway | private
STORAGE_BUCKET="[your-s3-bucket]"
BUCKET_REGION="eu-west-1"
EXTRA_ARGS=" --target=terraform " 
# EXTRA_ARGS=" --target=cloudformation " 

export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)
export KOPS_STATE_STORE="s3://${STORAGE_BUCKET}"

# configure cluster
kops create cluster --node-count ${WORKER_NUMBER} --zones ${WORKER_ZONES} \
    --master-zones ${MASTER_ZONES} --node-size ${WORKER_SIZE} \
    --master-size ${MASTER_SIZE} --kubernetes-version=${K8S_VERSION} \
    --network-cidr=${NETWORK_CIDR} --cloud=${CLOUD} \
    --topology ${NW_TOPOLOGY} --networking ${CNI_PLUGIN}   ${CLUSTER_NAME} \
    ${EXTRA_ARGS} \

Puedes comprobar la configuración del clúster ejecutando el siguiente comando. Puede utilizarse también para modificar clústers que ya han sido desplegados.



kops edit cluster testlab.k8s.local  --state s3://[your-s3-bucket]

El comando edit abre el editor vi, que permite modificar los parámetros del cúster de acuerdo con las necesidades existentes. Si analizas con detalle la configuración en yaml mostrada por vi, podrás ver que los parámetros coinciden con los especificados en la llamada al comando create, y también se añaden algunos elementos que no se especificaron, pero son necesarios para que funcione el clúster, como las diferentes subredes de AWS.



apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
  creationTimestamp: "2020-06-03T20:29:13Z"
  name: testlab.k8s.local
spec:
  api:
    loadBalancer:
      type: Public
  authorization:
    rbac: {}
  channel: stable
  cloudProvider: aws
  configBase: s3://[your-s3-bucket]/testlab.k8s.local
  etcdClusters:
  - cpuRequest: 200m
    etcdMembers:
    - instanceGroup: master-eu-west-1a
      name: a
    - instanceGroup: master-eu-west-1b
      name: b
    - instanceGroup: master-eu-west-1c
      name: c
    memoryRequest: 100Mi
    name: main
    version: 3.2.24
  - cpuRequest: 100m
    etcdMembers:
    - instanceGroup: master-eu-west-1a
      name: a
    - instanceGroup: master-eu-west-1b
      name: b
    - instanceGroup: master-eu-west-1c
      name: c
    memoryRequest: 100Mi
    name: events
    version: 3.2.24
  iam:
    allowContainerRegistry: true
    legacy: false
  kubelet:
    anonymousAuth: false
  kubernetesApiAccess:
  - 0.0.0.0/0
  kubernetesVersion: 1.17.0
  masterInternalName: api.internal.testlab.k8s.local
  masterPublicName: api.testlab.k8s.local
  networkCIDR: 10.240.0.0/16  
  networking:
    calico:
      majorVersion: v3
  nonMasqueradeCIDR: 100.64.0.0/10
  sshAccess:
  - 0.0.0.0/0
  subnets:
  - cidr: 10.240.32.0/19
    name: eu-west-1a
    type: Private
    zone: eu-west-1a
  - cidr: 10.240.64.0/19
    name: eu-west-1b
    type: Private
    zone: eu-west-1b
  - cidr: 10.240.96.0/19
    name: eu-west-1c
    type: Private
    zone: eu-west-1c
  - cidr: 10.240.0.0/22
    name: utility-eu-west-1a
    type: Utility
    zone: eu-west-1a
  - cidr: 10.240.4.0/22
    name: utility-eu-west-1b
    type: Utility
    zone: eu-west-1b
  - cidr: 10.240.8.0/22
    name: utility-eu-west-1c
    type: Utility
    zone: eu-west-1c
  topology:
    dns:
      type: Public
    masters: private
    nodes: private

Si ejecutas el siguiente comando, la especificación del clúster anteriormente inspeccionada generará el clúster en la cuenta de AWS. Tómatelo con calma porque suele tardar un poquito. Si el comando se ejecuta sin el flag –yes, mostrará una lista con todos los recursos que se deben crear para genera el clúster, pero los recursos no se crearán hasta que se añada el flag.



kops update cluster [your-cluster-name] --state s3://[your-s3-bucket] --yes

Cuando termine el proceso de creación, puedes echar un vistazo al dashboard de EC2 de AWS para ver tus nuevas instancias, 3 masters y 3 workers en este caso.

Una manera muy buena para comprobar si todo está funcionando como debería, es ejecutar los siguientes comandos de Kubernetes. El primero devuelve el estado de todos los elementos del plano de control, mientras que el segundo lista los nodos del clúster y sus estados.



kubectl get componentstatuses
kubectl get nodes

Además, Kops incluye una utilidad para comprobar el estado de salud del clúster que puede ser de gran ayuda también.



kops validate cluster [your-cluster-name] --state s3://[your-s3-bucket]

Desmontando el chiringuito

Si quieres eliminar el clúster y todos los recursos asociados que se crearon con Kops, solo tienes que ejecutar el siguiente comando. Si se utiliza sin el flag –yes, muestra una lista de los recursos a destruir, pero no los elimina hasta que se añada el flag.



kops delete cluster testlab.k8s.local  --state s3://[your-s3-bucket] --yes

Conociendo mejor Kops

Kops es una herramienta bastante extendida para gestionar clústers de Kubernetes en entornos productivos, y proporciona bastante flexibilidad y configuraciones avanzadas que permiten personalizar cada clúster para cumplir los requisitos necesarios. Proporciona ayuda durante la creación, mantenimiento y upgrade de los clústers. No obstante, hay que tener en cuenta que Kops no soporta todas las opciones que soportaría una instalación de Kubernetes manual. Por ejemplo, kops no soporta todos los plugins de red existentes, al menos de una manera estable.

Si quieres saber más acerca de Kops, aquí te dejo su documentación.

Miguel Fontanilla

DevOps/Cloud Engineer at Orange. Cloud Architecture, Virtualization, Services Orchestration, Automation and Optimization. Always learning.

Related Posts

Boletin informativo SpainClouds.com

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form