Espero que esté familiarizado con los términos básicos de Kubernetes como nodo, servicio, clúster, porque no voy a explicar esas cosas aquí.
Este es un tutorial paso a paso para mostrarle cómo implementar un clúster de Kubernetes listo para producción.
¿Listo para la producción? Sí, los ejemplos usan un dominio de muestra, por lo que si posee un dominio, puede configurarlo en una infraestructura pública. También puede usarlo para pruebas locales. Realmente depende de ti.
He usado CentOS Linux en los ejemplos, pero debería poder usar cualquier otra distribución de Linux. Excepto por los comandos de instalación, el resto de los pasos deberían ser aplicables a todos.
Voy a usar este grupo simple de un nodo maestro/de control y dos nodos trabajadores:
El tutorial se divide en dos partes principales.
La primera parte es básicamente un requisito previo y trata de preparar sus máquinas haciendo lo siguiente:
- Configure nombres de host correctamente en todos los hosts
- Desactive el intercambio en todos los nodos
- Añadir reglas de cortafuegos
- Configurar tablas de IP
- Deshabilitar SELinux
La segunda parte es la implementación real del clúster de Kubernetes y consta de los siguientes pasos:
- Configurar el repositorio de Kubernetes
- Instalar kubelet, kubeadm, kubectl y docker
- Habilite e inicie el servicio kubelet y docker
- Habilitar finalizaciones de bash
- Crear clúster con kubeadm
- Configurar red de pods
- Únete a los nodos de trabajo
- Pruebe el clúster creando un módulo de prueba
Parte 1:preparación de sus sistemas para la implementación del clúster de Kubernetes
Necesita 3 servidores que se ejecuten en máquinas virtuales o bare metal o una plataforma en la nube como Linode, DigitalOcean o Azure.
Tengo 3 máquinas virtuales CentOS ejecutándose con los siguientes detalles:
- Nodo principal de Kubernetes:172.42.42.230 kmaster-centos7.example.com/kmaster-centos7
- Nodo de trabajo 1 de Kubernetes:172.42.42.231 kworker-centos71.example.com/kworker-centos71
- Nodo de trabajo 2 de Kubernetes:172.42.42.232 kworker-centos72.example.com/kworker-centos72
Verifique las direcciones IP de sus máquinas y cámbielas según corresponda.
Paso 1. Configure correctamente los nombres de host en todos los sistemas
Puede agregar la IP y la información del subdominio correspondiente cambiando los registros DNS de su dominio.
En caso de que no tenga acceso al DNS, actualice el archivo /etc/hosts en los nodos maestro y trabajador con la siguiente información:
[[email protected] ~]# cat /etc/hosts
127.0.0.1 kmaster-centos7.example.com kmaster-centos7
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.42.42.230 kmaster-centos7.example.com kmaster-centos7
172.42.42.231 kworker-centos71.example.com kworker-centos71
172.42.42.232 kworker-centos72.example.com kworker-centos72
[[email protected] ~]#
Haga ping a los nodos de trabajo para verificar que los cambios en el archivo host funcionan bien.
Paso 2. Desactive el intercambio (por razones de rendimiento)
El programador de Kubernetes determina el mejor nodo disponible en el que implementar los pods recién creados. Si se permite el intercambio de memoria en un sistema host, esto puede generar problemas de rendimiento y estabilidad dentro de Kubernetes.
Por este motivo, Kubernetes requiere que desactive el intercambio en todos los nodos:
swapoff -a
Paso 3. Agregar reglas de firewall
Los nodos, contenedores y pods deben poder comunicarse a través del clúster para realizar sus funciones. Firewalld está habilitado en CentOS de forma predeterminada, por lo que sería conveniente abrir los puertos necesarios.
En el nodo principal, necesita estos puertos:
- 6443:servidor API de Kubernetes:utilizado por todos
- 2379–2380:API de cliente del servidor etcd:utilizada por kube-apiserver, etcd
- 10250:API de Kubelet:utilizado por uno mismo, plano de control
- 10251:kube-scheduler:utilizado por uno mismo
- 10252:kube-controller-manager:usado por uno mismo
En los nodos trabajadores, se requieren estos puertos:
- 10250:API de Kubelet:utilizado por uno mismo, plano de control
- 30000–32767:Servicios de NodePort:utilizado por Todos
El comando firewall-cmd abre el puerto 6443 de esta manera:
firewall-cmd --permanent --add-port=6443/tcp
En los nodos maestro y trabajador, utilice el comando anterior para abrir los puertos necesarios que se han mencionado en esta sección.
Para el rango de puertos, puede reemplazar el número de puerto con el rango como firewall-cmd --permanent --add-port=2379-2380/tcp
.
Una vez que haya agregado las nuevas reglas de firewall en cada máquina, vuelva a cargar el firewall:
firewall-cmd --reload
Paso 4. Configurar iptables
En los nodos maestro y trabajador, asegúrese de que br_netfilter
el módulo del núcleo está cargado. Esto se puede hacer ejecutando lsmod | grep br_netfilter
. Para cargarlo explícitamente llame a sudo modprobe br_netfilter
.
Configure las net.bridge.bridge-nf-call-iptables a '1' en su archivo de configuración sysctl. Esto garantiza que las tablas de IP procesen correctamente los paquetes durante el filtrado y el reenvío de puertos.
[[email protected] ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
Ejecute este comando para que los cambios surtan efecto:
sysctl --system
Paso 5. Deshabilitar SELinux (para Red Hat y CentOS)
Los contenedores subyacentes serían necesarios para acceder al sistema de archivos del host. CentOS viene con SELinux (Linux con seguridad mejorada) habilitado en modo de aplicación. Esto podría bloquear el acceso al sistema de archivos del host.
Puede deshabilitar SELinux o configurarlo en modo permisivo, lo que deshabilita efectivamente sus funciones de seguridad.
[[email protected] ~]# setenforce 0
[[email protected] ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[[email protected] ~]#
Parte 2:Implementación del clúster de Kubernetes
Ahora que ha configurado los ajustes correctos en sus nodos maestro y trabajador, es hora de comenzar la implementación del clúster.
Paso 1. Configurar el repositorio de Kubernetes
Los paquetes de Kubernetes no están disponibles en los repositorios oficiales de CentOS 7. Este paso debe realizarse en el nodo principal y en cada nodo trabajador.
Ingrese lo siguiente y verifíquelo una vez agregado el contenido.
[[email protected] ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
Actualice y verifique que el repositorio de Kubernetes se agregue a la lista de repositorios:
[[email protected] ~]# yum update -y
[[email protected] ~]# yum repolist | grep -i kubernetes
!kubernetes Kubernetes 570
Paso 2. Instalar kubelet, kubeadm, kubectl y Docker
kubelet, kubeadm, kubectl Se requieren tres paquetes básicos junto con el tiempo de ejecución del contenedor (que es docker aquí) para usar Kubernetes.
Instale estos paquetes en cada nodo:
yum install -y kubelet kubeadm kubectl docker
Paso 3. Habilite e inicie los servicios de kubelet y docker
Ahora que ha instalado los paquetes necesarios, habilite (para que se inicie automáticamente en cada arranque) kubelet y docker en cada nodo.
Habilite kubelet en cada nodo:
[[email protected] ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
Habilitar ventana acoplable en cada nodo:
[[email protected] ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
También debe iniciar estos servicios para que puedan usarse de inmediato:
[[email protected] ~]# systemctl start kubelet
[[email protected] ~]# systemctl start docker.service
Paso 4. Habilite la finalización de bash (para una vida más fácil con Kubernetes)
Habilite las finalizaciones de bash en todos los nodos para que no tenga que escribir manualmente todos los comandos por completo. La pestaña haría eso por ti.
[[email protected] ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[[email protected] ~]# echo "source <(kubeadm completion bash)" >> ~/.bashrc
[[email protected] ~]# echo "source <(docker completion bash)" >> ~/.bashrc
Paso 5. Crear un clúster con kubeadm
Inicialice un clúster ejecutando el siguiente comando:
kubeadm init --apiserver-advertise-address=172.42.42.230 --pod-network-cidr=10.244.0.0/16
Lo mismo con --pod-network-cidr. Especifique el rango de direcciones IP para la red de módulos. Si se establece, el plano de control asignará automáticamente CIDR para cada nodo.
Para obtener más opciones, consulte este enlace.
Al final de la salida del comando kube-init, puede ver los pasos para ejecutar el clúster:
...
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.42.42.230:6443 --token 22m8k4.kajx812tg74199x3 \
--discovery-token-ca-cert-hash sha256:03baa45e2b2bb74afddc5241da8e84d16856f57b151e450bc9d52e6b35ad8d22
```
**Manage cluster as regular user:
**In the above kube-init command output you can clearly see that to start using your cluster, you need to run the following commands as a regular user:
```bash
[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[[email protected] ~]#
Debe ejecutar esos comandos uno por uno para iniciar el clúster de Kubernetes:
[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# chown $(id -u):$(id -g) $HOME/.kube/config
Paso 6. Configurar red de pod
La red de pods es la red superpuesta entre los nodos trabajadores. Con la red de pods, los contenedores en diferentes nodos se comunican entre sí.
Hay varias opciones de red de Kubernetes disponibles. Use el siguiente comando para instalar el complemento de red Flannel Pod:
[[email protected] ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
clusterrole.rbac.authorization.k8s.io/flannel created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[[email protected] ~]#
Verifique el estado del clúster y verifique que el nodo maestro (plano de control) esté listo.
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-centos7.example.com Ready master 2m v1.19.2
Compruebe también todos los pods que se ejecutan en todos los espacios de nombres.
kubectl get pods --all-namespaces
Paso 7. Unir los nodos trabajadores al clúster
Consulte el resultado que obtuvo en el paso 5 y copie los comandos recomendados. Ejecútelo en cada nodo trabajador para conectarlo al clúster:
kubeadm join 172.42.42.230:6443 --token 22m8k4.kajx812tg74199x3 \
> --discovery-token-ca-cert-hash sha256:03baa45e2b2bb74afddc5241da8e84d16856f57b151e450bc9d52e6b35ad8d22
Vuelva a verificar el estado del clúster para ver que todos los nodos de trabajo se han unido correctamente al clúster y están listos para servir cargas de trabajo.
[[email protected] ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kmaster-centos7.example.com Ready master 9m17s v1.19.2 172.42.42.230 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://1.13.1
kworker-centos71.example.com Ready <none> 7m10s v1.19.2 172.42.42.231 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://1.13.1
kworker-centos72.example.com Ready <none> 7m8s v1.19.2 172.42.42.232 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://1.13.1
Verifique todos los pods que se ejecutan en todos los espacios de nombres:
kubectl get pods -o wide --all-namespaces
Paso 8. Probar el clúster creando un test pod
Ahora que tiene todo en su lugar, es hora de probar el clúster. Crear un pod:
[[email protected] ~]# kubectl run mypod1 --image=httpd --namespace=default --port=80 --labels app=fronend
pod/mypod1 created
Ahora, verifique el estado del pod:
[[email protected] ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mypod1 1/1 Running 0 29s 10.244.1.2 kworker-centos71.example.com <none> <none>
[[email protected] ~]#
¡Ahora tiene un clúster de Kubernetes completamente funcional en funcionamiento en CentOS!
Espero que les guste el tutorial. Si tiene preguntas o sugerencias, deje un comentario y estaré encantado de ayudarle.
Y conviértase en miembro del Manual de Linux para disfrutar de contenido exclusivo solo para miembros.