Índice de contenidos
1. Entorno
Este tutorial está escrito usando el siguiente entorno:
- Hardware: Slimbook Pro 2 13.3″ (Intel Core i7, 32GB RAM)
- Sistema Operativo: LUbuntu 18.04
2. Introducción
Nota importante: seguir los pasos de este tutorial supone costes en la cuenta de AWS.
En este tutorial vamos a ver los pasos necesarios para montar un clúster de Kubernetes en producción en el cloud de Amazon gracias a Kops («Kubernetes Operations»).
Para ello vamos a seguir esta guía de Kumori Labs pero comentando los cambios que hay que hacer para adaptarla a las últimas versiones.
Para continuar con esta guía necesitamos como pre-requisitos:
- Clientes de Vagrant, VirtualBox, Git y AWS cli instalados en nuestra máquina.
- Una cuenta de administrador en AWS.
- Un nombre de dominio real comprado en algún proveedor como el propio AWS, Google Domains, GoDaddy, etc…
3. Vamos al lío
Lo primero que vamos a hacer es crear una cuenta de usuario especifica para el manejo de Kubernetes con Kops.
Para ello haciendo uso del CLI de AWS creamos un grupo en AWS llamado «kops».
$> aws iam create-group --group-name kops
Ahora establecemos una variable de entorno con todos los permisos que otorgamos a los miembros de este grupo.
export arns=" arn:aws:iam::aws:policy/AmazonEC2FullAccess arn:aws:iam::aws:policy/AmazonRoute53FullAccess arn:aws:iam::aws:policy/AmazonS3FullAccess arn:aws:iam::aws:policy/IAMFullAccess arn:aws:iam::aws:policy/AmazonVPCFullAccess"
Ejecutamos una sentencia donde recorremos cada uno de los anteriores permisos y se lo asignamos al grupo kops.
$> for arn in $arns; do aws iam attach-group-policy --policy-arn "$arn" --group-name kops; done
Creamos el usuario «kops».
$> aws iam create-user --user-name kops
Ahora añadimos este usuario al grupo kops.
$> aws iam add-user-to-group --user-name kops --group-name kops
Y por último creamos el access key para el usuario «kops».
$> aws iam create-access-key --user-name kops
Este comando nos va a devolver un JSON con los campos SecretAccessKey y AccessKeyID que vamos a almacenar en las siguientes variables de entorno para interactuar con AWS.
$> export AWS_ACCESS_KEY_ID="AWS Access Key ID" $> export AWS_SECRET_ACCESS_KEY="AWS Secret Access Key"
También es necesario tener creadas las credenciales de SSH en nuestra máquina. Las cuales se almacenan en ~/.ssh/id_rsa.pub y ~/.ssh/id_rsa. Si trabajas habitualmente con Git casi seguro que ya las tienes creadas y si no es tan sencillo como ejecutar el siguiente comando dejando la ruta por defecto.
$> ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Es el momento de clonar el siguiente proyecto.
$> git clone https://github.com/kumorilabs/getting-to-know-k8s.git $> cd getting-to-know-k8s.git
Un paso importante antes de arrancar Vagrant es abrir el fichero /scripts/provision-vagrant.sh para verificar las versiones y su compatibilidad. A mi me ha ido bien con las siguientes versiones:
export KUBECTL_VERSION="1.11.1" export KUBEFED_VERSION="1.11.1" export KOPS_VERSION="1.10.0" export HUGO_VERSION="0.47" export TERRAFORM_VERSION="0.11.8"
En este punto ya estamos en disposición de arrancar el proyecto con Vagrant para que nos cree una instancia con todas las herramientas (awscli, kops, kubectl, …) instaladas y configuradas, así que ejecutamos:
$> vagrant up
Pasados unos minutos (tardará más porque se tendrá que descargar el box) ya podemos entrar en la máquina con el comando:
$> vagrant ssh
A partir de este punto todos los comandos los vamos a ejecutar desde la máquina de Vagrant que en el arranque ha cogido las credenciales del usuario «kops» y las claves de SSH.
El alcance de este tutorial es la creación del clúster de Kubernetes haciendo uso de Kops así que lo primero que vamos a hacer es preparar unas variables de entorno que nos ayudarán en el proceso.
Primero establecemos el valor para DOMAIN_NAME el cual tiene que ser el nombre de dominio o sudominio que tengamos comprado.
$> export DOMAIN_NAME="tunombredominio.org"
Después vamos a establecer un nombre de clúster que vamos a utilizar para identificarlo junto con el DOMAIN_NAME.
$> export CLUSTER_ALIAS="k8s"
Ahora componemos el nombre completo del clúster.
$> export CLUSTER_FULL_NAME="${CLUSTER_ALIAS}.${DOMAIN_NAME}"
Y establecemos la zona de disponibilidad donde queremos crear el clúster.
$> export CLUSTER_AWS_AZ="eu-west-1b"
Otro paso previo necesario para la creación del clúster es crear un bucket de S3 que Kops va a utilizar para almacenar los ficheros de configuración necesarios. Para crearlo ejecutamos:
$> aws s3api create-bucket --bucket ${CLUSTER_FULL_NAME}-state
Y establecemos la variable de entorno.
$> export KOPS_STATE_STORE="s3://${CLUSTER_FULL_NAME}-state"
Antes de crear el clúster vamos a verificar que nuestro nombre de dominio tiene disponible correctamente los servidores de DNS, ya que de lo contrario no podremos crear el clúster.
Para ello utilizamos la herramienta dig disponible en el box de Vagrant y ejecutamos:
$> dig NS tunombredominio.org
Hasta que este comando no responda con algo similar a esto, no podrás crear el clúster.
tunombredominio.org. 21600 IN NS ns-cloud-e1.googledomains.com. tunombredominio.org. 21600 IN NS ns-cloud-e2.googledomains.com. tunombredominio.org. 21600 IN NS ns-cloud-e3.googledomains.com. tunombredominio.org. 21600 IN NS ns-cloud-e4.googledomains.com.
Si esto no es así tendrás que hacer las modificaciones necesarias en tu servidor de dominio y esperar a que las modificaciones de DNS se propaguen para volver a intentarlo.
En caso de que sea correcto, ya podemos crear el clúster con el siguiente comando:
$> kops create cluster \ --name=${CLUSTER_FULL_NAME} \ --zones=${CLUSTER_AWS_AZ} \ --master-size="t2.medium" \ --node-size="t2.medium" \ --node-count="2" \ --dns-zone=${DOMAIN_NAME} \ --ssh-public-key="~/.ssh/id_rsa.pub" \ --kubernetes-version="1.11.1"
Este comando no crea físicamente los elementos en AWS sino que nos permite un preview de lo que va a hacer. Para confirmar que queremos crear los elementos (y empezar con el coste) tenemos que ejecutar:
$> kops update cluster ${CLUSTER_FULL_NAME} --yes
Pasados unos minutos podremos ver en la web de AWS que se crean tres nuevas instancias, un master y dos nodos, con todos los grupos de permisos y el autoescalado configurado y que en la parte de Route 53 se han creado nuevas entradas de RecordSets dentro del Hosted Zone. Hasta que estas entradas no cambien la IP por defecto 203.0.113.123 por unas reales asociadas al nombre de dominio, el clúster no estará operativo.
Para comprobar que el clúster funciona, podemos ejecutar algún comando de Kubernetes como:
$> kubectl get nodes
Y ver que nos responde con el nodo master y los dos nodos asociados.
Otro paso que podemos hacer es instalar el dashboard ejecutando:
$> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
Por defecto la seguridad del dashboard está habilitada así que tenemos que ejecutar el siguiente comando para ver el username y la password:
$> kubectl config view --minify
Ahora accedemos al dashboard a través del navegador a la URL: https://api.k8s.tunombredominio.org/api/v1/namespaces/kube-system/services/kubernetes-dashboard:/proxy/
Ingresamos el username y la password y ya estamos dentro, pero nos damos cuenta de que pinchando en las opciones de menú vemos que por seguridad todas las operaciones están deshabilitadas, con un mensaje del tipo: deployments.apps is forbidden: User «system:serviceaccount:kube-system:kubernetes-dashboard» cannot list deployments.apps in the namespace «default»
Para habilitar los permisos tenemos que crear un fichero dashboard-admin.yaml con el siguiente contenido:
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard labels: k8s-app: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system
Y lo ejecutamos sobre el clúster con el comando:
$> kubectl create -f dashboard-admin.yaml
De esta forma ya podemos hacer las operaciones desde el dashboard aunque personalmente aconsejo realizarlas desde la línea de comandos.
Para eliminar el clúster, simplemente tenemos que ejecutar:
$> kops delete cluster ${CLUSTER_FULL_NAME} --yes
Y si no lo estamos usando para otra cosa, también podemos borrar el bucket asociado.
$> aws s3api delete-bucket --bucket ${CLUSTER_FULL_NAME}-state
4. Conclusiones
Kubernetes se está convirtiendo en el estándar de facto para orquestar el despliegue de aplicaciones basadas en contenedores; que mejor que tenerlo disponible en el cloud gracias a AWS y Kops.
Cualquier duda o sugerencia en la zona de comentarios.
Saludos.