Kubernetes se presentó en un artículo anterior, "Introducción a Kubernetes en Amazon Web Services (AWS)". Kubernetes también se trató en otro artículo, "Uso de Kubernetes (K8s) en IBM Bluemix". Kubernetes se puede instalar en bare metal en casi cualquier sistema operativo, incluidos Fedora, CentOS, Ubuntu y CoreOS para fines de desarrollo.
El problema
La instalación de Kubernetes en bare metal implica la ejecución de varios comandos para configurar un nodo maestro, nodos de trabajo, red de módulos, etc.
La solución
Kubernetes 1.4 presenta una nueva herramienta llamada kubeadm para arrancar un clúster de Kubernetes. El kubeadm inicia un clúster de Kubernetes con dos comandos. Después de instalar Docker, kubectl y kubelet, el nodo maestro se puede iniciar con kubeadm init y nodos trabajadores agregados con kubeadm join .
En este artículo, utilizaremos el siguiente procedimiento para instalar y arrancar un clúster de Kubernetes y, posteriormente, probar el clúster:
- Inicie tres nuevas instancias de Ubuntu en Amazon EC2.
- En todas las instancias de Ubuntu, instale Docker, kubeadm, kubectl y kubelet.
- Desde una de las instancias de Ubuntu, inicialice el maestro del clúster de Kubernetes con el siguiente comando:
kubeadm init
- Aplicar la política de red de Calico Pod kubeadm/calico.yaml .
- Únase a las otras dos instancias de Ubuntu (nodos) con maestro con kubeadm join --token=
- En el maestro, se enumeran tres nodos con 'kubectl get nodes'.
- Ejecutar una aplicación en maestro:
kubectl -s http://localhost:8080 run nginx --image=nginx --replicas=3 --port=80
- Lista de los pods:
kubectl get pods -o wide
- Desinstale el clúster de Kubernetes.
kubeadm reset
Este artículo tiene las siguientes secciones:
- Configuración del entorno
- Instalación de Docker, kubeadm, kubectl y kubelet en cada host
- Inicializar el maestro
- Instalación de la red Calico Pod
- Unir nodos al clúster
- Instalación de una aplicación de muestra
- Desinstalación del clúster
- Limitaciones
- Otros desarrollos en kubeadm
- Conclusión
Configuración del entorno
El kubeadm La herramienta requiere que las siguientes máquinas ejecuten uno de Ubuntu 16.04+, HypriotOS v1.0.1+ o CentOS 7 ejecutándose en ellas.
- Una máquina para el nodo maestro
- Una o más máquinas para los nodos trabajadores
Se requiere al menos 1 GB de RAM en cada una de las máquinas. Hemos utilizado tres máquinas Ubuntu que se ejecutan en Amazon EC2 para iniciar un clúster con un solo nodo maestro y dos nodos de trabajo. Las tres máquinas Ubuntu se muestran en la Figura 1.
Figura 1: Máquinas Ubuntu
Instalación de Docker, kubeadm, kubectl y kubelet en cada host
En esta sección, instalaremos Docker, kubelet, kubectl y kubeadm en cada una de las tres máquinas. Los componentes instalados se describen en la Tabla 1.
Componente | Descripción |
Docker | El tiempo de ejecución del contenedor. Se recomienda la versión 1.11.2 y la v1.10.3 y la v1.12.1 también están bien. Obligatorio en todas las máquinas del clúster. |
kubelet | El componente principal de Kubernetes que se ejecuta en todas las máquinas del clúster. Inicia contenedores y Pods. Obligatorio en todas las máquinas del clúster. |
kubectl | La herramienta de línea de comandos para administrar un clúster. Requerido solo en el nodo principal, pero útil si se instala en todos los nodos. |
kubeadm | La herramienta para iniciar un clúster. Obligatorio en todas las máquinas del clúster. |
Tabla 1: Componentes para instalar
Obtenga la dirección IP pública de cada una de las tres máquinas e inicie sesión mediante SSH en cada una de las máquinas:
ssh -i "docker.pem" [email protected] ssh -i "docker.pem" [email protected] ssh -i "docker.pem" [email protected]
Los comandos para instalar los binarios deben ejecutarse como root; por lo tanto, configure el usuario como root.
sudo su -
Ejecute los siguientes comandos en cada una de las máquinas:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF > /etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
El primer comando descarga los paquetes necesarios para Kubernetes, como se muestra en el resultado de la Figura 2.
Figura 2: Descarga de paquetes para Kubernetes
El comando 2 descarga las listas de paquetes de los repositorios y las actualiza con las versiones más recientes de los paquetes.
apt-get update
El resultado se muestra en la Figura 3.
Figura 3: Actualización de paquetes de repositorio
A continuación, instale Docker:
# Install docker if you don't have it already. apt-get install -y docker.io
Docker se instala, como se muestra en la salida del comando en la Figura 4.
Figura 4: Instalando Docker
Y, posteriormente, instale kubelet (componente central de Kubernetes), kubeadm (herramienta de arranque), kubectl (herramienta de administración de clústeres) y kubernetes-cni (complemento de red):
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
El resultado de los comandos anteriores se muestra en la Figura 5.
Figura 5: Instalación de kubelet, kubeadm, kubectln y kubernetes-cni
Inicializar el Maestro
A continuación, inicialice el maestro en el que se ejecutan la base de datos etcd y el servidor API. El kubelet inicia Pods para ejecutar estos componentes. Ejecute el siguiente comando que detecta automáticamente las direcciones IP:
kubeadm init
Como se muestra en la salida del comando, primero, se ejecutan algunas comprobaciones previas al vuelo para validar el estado del sistema. Posteriormente, se genera un token maestro/tokens que se usará como clave de autenticación mutua para los nodos trabajadores que desean unirse al clúster. A continuación, se generan una clave y un certificado de autoridad certificadora autofirmados para proporcionar identidades a cada uno de los nodos del clúster para la comunicación con los clientes. Se crea una clave de servidor API y un certificado para el servidor API para la comunicación con los clientes. Una utilidad/kubeconfig se crea un archivo para que kubelet se conecte al servidor API y otro util/kubeconfig Se crea un archivo para la administración. Posteriormente, se crea la configuración del cliente API. La salida de kubeadm init El comando se muestra en la Figura 6.
Figura 6: Ejecutando kubeadm init
Todos los componentes del plano de control quedan listos. El primer nodo queda listo y se realiza una implementación de prueba. También se crean los componentes complementarios esenciales kube-discovery, kube-proxy y kube-dns, como se muestra en el resultado del comando en la Figura 7. El maestro de Kubernetes se inicializa correctamente. Se genera un comando con la siguiente sintaxis; debe ejecutarse en las máquinas (nodos) que se unirán al clúster.
kubeadm join -token=<token> <IP Address of the master node>
El comando anterior debe copiarse y conservarse para su uso posterior en los nodos trabajadores.
Figura 7: Maestro de Kubernetes inicializado
De forma predeterminada, los nodos maestros no son programables y lo son mediante el uso de la contaminación "dedicada". El nodo principal podría programarse con el siguiente comando:
kubectl taint nodes --all dedicated-
El kubeadm El comando admite algunas otras opciones (consulte la Tabla 2) que no teníamos que usar, pero que podrían usarse para anular el comando predeterminado.
Parámetro de comando | Descripción | Predeterminado |
--skip-preflight-checks | Omite las comprobaciones previas | Se realizan comprobaciones previas |
--use-kubernetes-version | Establece la versión de Kubernetes a usar | v1.5.1 |
--api-advertise-addresses | El comando kubeadm init detecta automáticamente y usa la dirección IP de la interfaz de red predeterminada y la usa para generar certificados para el servidor API. Este parámetro de configuración se puede utilizar para anular el valor predeterminado con una o más direcciones IP en las que se va a validar el servidor API. | Detección automática |
--api-external-dns-names | Este parámetro de configuración se puede usar para anular la interfaz de red predeterminada con uno o más nombres de host en los que se va a validar el servidor API. Solo se debe usar una de las direcciones IP o nombres DNS externos. | |
--proveedor de nube | Especifica un proveedor de la nube. El administrador de la nube es compatible con "aws", "azure", "cloudstack", "gce", "mesos", "openstack", "ovirt", "rackspace" y "vsphere". La configuración del proveedor de la nube se puede proporcionar en el archivo /etc/kubernetes/cloud-config. El uso de un proveedor de la nube también tiene la ventaja de usar volúmenes persistentes y equilibrio de carga. | Sin detección automática de un proveedor de la nube |
--pod-red-cidr | Asigna rangos de red (CIDR) a cada nodo y es útil para ciertas soluciones de red, incluidos los proveedores de Flannel y Cloud. | |
--servicio-cidr | Anula la subred que usa Kubernetes para asignar direcciones IP a los pods. El /etc/systemd/system/kubelet.service.d/10-kubeadm.conf también debe modificarse. | 10.96.0.0/12 |
--servicio-dns-dominio | Anula el sufijo del nombre DNS para asignar servicios con nombres DNS; tiene el formato | clúster.local |
--token | Especifica el token que se utilizará para la autenticación mutua entre el maestro y los nodos que se unen al clúster. | Generado automáticamente |
Tabla 2: Opciones de comando de Kubeadm
Instalación de la red Calico Pod
Para que los Pods puedan comunicarse entre sí, se debe instalar un complemento de red de Pod. Calico proporciona una configuración de instalación alojada en kubeadm en forma de ConfigMap en http://docs.projectcalico.org/master/getting-started/kubernetes/installation/hosted/kubeadm/calico.yaml que usaremos en esta sección para instalar una red Pod. Ejecute el siguiente comando en el nodo maestro para instalar la red Pod:
kubectl apply -f http://docs.projectcalico.org/master/getting-started/ kubernetes/installation/hosted/kubeadm/calico.yaml
Alternativamente, descargue calico.yaml y copiar al nodo maestro:
scp -i "docker.pem" calico.yaml [email protected]:~
Posteriormente, ejecute el siguiente comando:
kubectl apply -f calico.yaml
Calico y un clúster etcd de un solo nodo se instalan, como se muestra en la Figura 8.
Figura 8: Instalación de la política de Calico
Posteriormente, enumere todos los pods en todos los espacios de nombres de Kubernetes.
kubectl get pods --all-namespaces
El kube-dns El pod debe estar ejecutándose, como se muestra en la Figura 9.
Figura 9: Listado de pods en todos los espacios de nombres
Unir nodos al clúster
En esta sección, uniremos los nodos de trabajo al clúster mediante unión kubeadm comando, que tiene la siguiente sintaxis:
kubeadm join --token=<token> <master-ip>
Opcionalmente, la unión kubeadm el comando se puede ejecutar con --skip-preflight-checks opción para saltarse la validación preliminar.
La unión de kubeadm El comando utiliza el token proporcionado para comunicarse con el servidor API y obtener el certificado de CA raíz, y crea un par de claves locales. Posteriormente, se envía una solicitud de firma de certificado (CSR) al servidor API para su firma y el kubelet local se configura para conectarse al servidor API.
Ejecute kubeadm join comando copiado de la salida de kubeadm init comando en cada una de las máquinas Ubuntu que se van a unir al clúster.
Primero, inicie sesión SSH en la instancia/s de Ubuntu:
ssh -i "docker.pem" [email protected]
y
ssh -i "docker.pem" [email protected]
Posteriormente, ejecute kubeadm join dominio. En primer lugar, se realizan algunas comprobaciones previas al vuelo. El token proporcionado se valida. A continuación, se utiliza el descubrimiento de nodos. Se crea un cliente de descubrimiento de información de clúster y se solicita información del servidor API. Se recibe un objeto de información de clúster y se verifica una firma mediante el token proporcionado. Se encuentra que la firma de información del clúster y el contenido son válidos y el descubrimiento del nodo está completo. Posteriormente, se realiza un bootstrapping de nodos, en el que se utilizan los extremos de la API https://10.0.0.129:6443 para establecer una conexión. Posteriormente, se realiza una solicitud de firma de certificado (csr) utilizando un cliente API para obtener un certificado único para el nodo. Una vez que se recibe un certificado firmado del servidor API, se genera un archivo de configuración de kubelet. El mensaje "Unión de nodo completa" que se muestra en la Figura 10 indica que el nodo se ha unido al clúster.
Figura 10: Unir un nodo al clúster
Del mismo modo, ejecute el mismo comando en la otra máquina con Ubuntu. El otro nodo también se une al clúster, como se indica en el resultado de la Figura 11.
Figura 11: Unión del segundo nodo al clúster
En el nodo principal, ejecute el siguiente comando para enumerar los nodos:
kubectl get nodes
El nodo principal y los dos nodos de trabajo deberían aparecer en la lista, como se muestra en la Figura 12.
Figura 12: Listado de nodos de clúster de Kubernetes
Instalación de una aplicación de muestra
A continuación, probaremos el clúster. Ejecute el siguiente comando para ejecutar un nginx Clúster de pod basado en tres réplicas:
kubectl -s http://localhost:8080 run nginx --image=nginx --replicas=3 --port=80
Enumere las implementaciones:
kubectl get deployments
Enumere los pods de todo el clúster:
kubectl get pods -o wide
Exponga la implementación como un servicio de tipo LoadBalancer :
kubectl expose deployment nginx --port=80 --type=LoadBalancer
Enumere los servicios:
kubectl get services
El resultado de los comandos anteriores indica el nginx Se creó la implementación y los tres pods se ejecutan en los dos nodos trabajadores del clúster. También se crea un servicio llamado "nginx", como se muestra en la Figura 13.
Figura 13: Ejecutar un clúster de nginx Pod
Copie la IP del clúster del servicio. Ejecute el comando curl para invocar el servicio:
curl 10.0.0.99
Se genera el marcado HTML del servicio, como se muestra en la Figura 14.
Figura 14: Invocando el servicio nginx
Desinstalación del clúster
Para desinstalar el clúster instalado por kubeadm, ejecute el siguiente comando:
kubeadm reset
El clúster se desinstala, como se muestra en la Figura 15.
Figura 15: Desinstalación/restablecimiento del clúster de Kubernetes
Limitaciones
kubeadm tiene varias limitaciones y se recomienda solo para uso de desarrollo. Las limitaciones de kubeadm son las siguientes:
- Solo se admiten unos pocos sistemas operativos:Ubuntu 16.04+, CentOS 7, HypriotOS v1.0.1+.
- No apto para uso en producción.
- La integración de proveedores en la nube es experimental.
- Se crea un clúster con un único maestro con una única base de datos etcd. No se admite alta disponibilidad, lo que implica que el maestro es un punto único de falla (SPOF).
- Las funciones HostPort y HostIP no son compatibles.
- Algunos otros problemas conocidos cuando se usa kubeadm con RHEL/CentOS 7 y VirtualBox.
Más avances en kubeadm
kubeadm está en alfa en Kubernetes v 1.5 y está en beta desde Kubernetes 1.6. Se continúan realizando correcciones y mejoras menores en kubeadm con cada nueva versión de Kubernetes:
- Con Kubernetes 1.7, las modificaciones a los recursos internos del clúster instalados con kubeadm se sobrescriben al actualizar de v 1.6 a v 1.7.
- En Kubernetes 1.8, el token Bootstrap predeterminado creado con kubeadm init deja de ser válido y se elimina después de 24 horas de haber sido creado para limitar la exposición de la valiosa credencial. La unión de kubeadm El comando delega el arranque de TLS al propio kubelet en lugar de volver a implementar el proceso. El arranque KubeConfig el archivo se escribe en /etc/kubernetes/bootstrap-kubelet-conf con unión de kubeadm .
Conclusión
En este artículo, usamos la función de la herramienta kubeadm disponible desde Kubernetes v1.4 para iniciar un clúster de Kubernetes. En primer lugar, se instalan los archivos binarios necesarios para Docker, kubectl, kubelet y kubeadm. Posteriormente, el kubeadm init El comando se utiliza para inicializar el nodo maestro en el clúster. Finalmente, el kubeadm join El comando se utiliza para unir nodos trabajadores con el clúster. Una muestra de nginx se ejecuta la aplicación para probar el clúster.