githubixx.kubernetes_worker
ansible-role-kubernetes-worker
Este rol de Ansible se utiliza en Kubernetes the not so hard way with Ansible - Worker. Este rol de Ansible configura nodos trabajadores de Kubernetes. Para más información, consulta Kubernetes the not so hard way with Ansible - Worker.
Versiones
Etiquetamos cada lanzamiento y tratamos de seguir versionado semántico. Si deseas usar el rol, te recomiendo que verifiques la última etiqueta. La rama principal es básicamente desarrollo, mientras que las etiquetas marcan versiones estables. Por ejemplo, una etiqueta 24.0.0+1.27.8
significa que esta es la versión 24.0.0
de este rol y está destinada a ser utilizada con la versión de Kubernetes 1.27.8
(aunque debería funcionar con cualquier versión K8s 1.27.x). Si el rol cambia, X.Y.Z
antes de +
aumentará. Si cambia la versión de Kubernetes, X.Y.Z
después de +
también aumentará. Esto permite etiquetar correcciones de errores y nuevas versiones principales del rol mientras se desarrolla para una versión específica de Kubernetes. Esto es especialmente útil para lanzamientos importantes de Kubernetes con cambios significativos.
Requisitos
Este playbook espera que ya hayas implementado los componentes del controlador de Kubernetes (ver kubernetes-controller y Kubernetes the not so hard way with Ansible - Control plane.
También necesitas tener instalados containerd, CNI plugins y runc. Para permitir que los Pods
de Kubernetes se comuniquen entre diferentes hosts, tiene sentido instalar Cilium más tarde, una vez que los nodos trabajadores estén en funcionamiento. Por supuesto, Calico
, WeaveNet
, kube-router
, o flannel u otras soluciones de red de Kubernetes son opciones válidas.
Sistemas Operativos Compatibles
- Ubuntu 20.04 (Focal Fossa)
- Ubuntu 22.04 (Jammy Jellyfish)
Registro de Cambios
Historial de cambios:
Consulta el CHANGELOG.md completo
IMPORTANTE La versión 24.0.0+1.27.8
tuvo muchos cambios que podrían romper compatibilidad. Así que si actualizas desde una versión < 24.0.0+1.27.8
por favor lee también el CHANGELOG de esa versión.
Cambios recientes:
26.0.0+1.29.4
ACTUALIZACIÓN
- actualizar
k8s_release
a1.29.4
- actualizar
MOLECULA
- usar
alvistack
en vez de cajas Vagrantgenéricas
- usar
25.0.1+1.28.8
- ACTUALIZACIÓN
- actualizar
k8s_release
a1.28.8
- actualizar
25.0.0+1.28.5
ACTUALIZACIÓN
- actualizar
k8s_release
a1.28.5
- actualizar
OTROS CAMBIOS
- ajustar acción de Github debido a cambios en Ansible Galaxy
.yamllint
: extender la longitud máxima de línea de 200 a 300
MOLECULA
- cambiar a Ubuntu 22.04 para la VM de activos de prueba
- cambiar las direcciones IP
- ajustar nombres comunes para certificados / cambiar algoritmo a ecdsa y tamaño del algoritmo
- eliminar
collections.yml
Instalación
Descarga directamente desde Github (cambia al directorio de roles de Ansible antes de clonar. Puedes averiguar la ruta del rol usando el comando
ansible-config dump | grep DEFAULT_ROLES_PATH
):git clone https://github.com/githubixx/ansible-role-kubernetes-worker.git githubixx.kubernetes_worker
A través del comando
ansible-galaxy
y descarga directa desde Ansible Galaxy:ansible-galaxy install role githubixx.kubernetes_worker
Crea un archivo
requirements.yml
con el siguiente contenido (esto descargará el rol desde Github) e instala conansible-galaxy role install -r requirements.yml
(cambiaversion
si es necesario):
---
roles:
- name: githubixx.kubernetes_worker
src: https://github.com/githubixx/ansible-role-kubernetes-worker.git
version: 26.0.0+1.29.4
Variables del Rol
# El directorio base para la configuración de Kubernetes y archivos de certificados
# relacionados con todo lo que tiene que ver con los nodos trabajadores. Después de
# que el playbook haya finalizado, este directorio contendrá varias subcarpetas.
k8s_worker_conf_dir: "/etc/kubernetes/worker"
# Todos los archivos de certificados (relacionados con la infraestructura de claves
# privadas) especificados en "k8s_worker_certificates" (ver "vars/main.yml") se almacenarán aquí.
# El propietario y el grupo de este nuevo directorio serán "root". Los permisos del archivo
# serán "0640".
k8s_worker_pki_dir: "{{ k8s_worker_conf_dir }}/pki"
# El directorio para almacenar los binarios de Kubernetes (ver la variable "k8s_worker_binaries"
# en "vars/main.yml"). El propietario y el grupo de este nuevo directorio serán "root"
# en ambos casos. Los permisos para este directorio serán "0755".
#
# NOTA: El directorio predeterminado "/usr/local/bin" normalmente ya existe en cada
# instalación de Linux con el propietario, grupo y permisos mencionados anteriormente.
# Si tus configuraciones actuales son diferentes, considera un directorio diferente.
# Pero asegúrate de que el nuevo directorio esté incluido en el valor de tu variable "$PATH".
k8s_worker_bin_dir: "/usr/local/bin"
# Versión de K8s
k8s_worker_release: "1.29.4"
# La interfaz en la que deben escuchar los servicios de Kubernetes. Dado que toda la
# comunicación del clúster debería usar una interfaz VPN, el nombre de la interfaz
# normalmente es "wg0" (WireGuard), "peervpn0" (PeerVPN) o "tap0".
#
# La interfaz de red en la que deben escuchar los servicios de Kubernetes worker.
# Esto incluye:
#
# - kube-proxy
# - kubelet
#
k8s_interface: "eth0"
# El directorio desde donde copiar los certificados de K8s. Por defecto,
# esto se expandirá al $HOME LOCAL del usuario (el usuario que ejecuta
# "ansible-playbook ...") más "/k8s/certs". Esto significa que si el
# directorio $HOME del usuario es, por ejemplo, "/home/da_user",
# entonces "k8s_ca_conf_directory" tendrá un valor de
# "/home/da_user/k8s/certs".
k8s_ca_conf_directory: "{{ '~/k8s/certs' | expanduser }}"
# La dirección IP o el nombre de host del punto final de la API de Kubernetes.
# Esta variable es utilizada por "kube-proxy" y "kubelet" para conectarse
# al "kube-apiserver" (servidor API de Kubernetes).
#
# Por defecto, se especifica aquí el primer host en el grupo Ansible "k8s_controller".
# NOTA: ¡Esta configuración no es tolerante a fallos! Eso significa que si
# el primer host en el grupo Ansible "k8s_controller" está caído,
# el nodo trabajador y su carga de trabajo continúan funcionando,
# pero el nodo trabajador no recibe actualizaciones del servidor API de Kubernetes.
#
# Si tienes un balanceador de carga que distribuye el tráfico entre todos
# los servidores API de Kubernetes, debe especificarse aquí (ya sea su IP
# o el nombre DNS). Pero debes asegurarte de que la dirección IP
# o el nombre DNS que deseas usar aquí esté incluido en el certificado TLS
# del servidor API de Kubernetes (ver la variable "k8s_apiserver_cert_hosts"
# del rol https://github.com/githubixx/ansible-role-kubernetes-ca).
# Si no está especificado, obtendrás errores de certificado en
# los registros de los servicios mencionados anteriormente.
k8s_worker_api_endpoint_host: "{% set controller_host = groups['k8s_controller'][0] %}{{ hostvars[controller_host]['ansible_' + hostvars[controller_host]['k8s_interface']].ipv4.address }}"
# Igual que arriba, pero para el puerto. Especifica en qué puerto
# están escuchando los servidores API de Kubernetes. Nuevamente, si hay
# un balanceador de carga en su lugar que distribuye las solicitudes
# a los servidores API de Kubernetes, coloca el puerto del
# balanceador de carga aquí.
k8s_worker_api_endpoint_port: "6443"
# Paquetes del sistema necesarios en un nodo trabajador de Kubernetes.
# Puedes agregar paquetes adicionales en cualquier momento. Pero ten en
# cuenta que si eliminas uno o más de la lista predeterminada,
# tu nodo trabajador podría no funcionar como se espera o no funcionar
# en absoluto.
k8s_worker_os_packages:
- ebtables
- ethtool
- ipset
- conntrack
- iptables
- iptstate
- netstat-nat
- socat
- netbase
# Directorio para almacenar la configuración de kubelet
k8s_worker_kubelet_conf_dir: "{{ k8s_worker_conf_dir }}/kubelet"
# Configuración de kubelet
#
# Si deseas habilitar el uso de "RuntimeDefault" como el perfil de seccomp predeterminado
# para todas las cargas de trabajo, añade estas configuraciones a "k8s_worker_kubelet_settings":
#
# "seccomp-default": ""
#
# También consulta:
# https://kubernetes.io/docs/tutorials/security/seccomp/#enable-the-use-of-runtimedefault-as-the-default-seccomp-profile-for-all-workloads
k8s_worker_kubelet_settings:
"config": "{{ k8s_worker_kubelet_conf_dir }}/kubelet-config.yaml"
"node-ip": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
"kubeconfig": "{{ k8s_worker_kubelet_conf_dir }}/kubeconfig"
# kubelet kubeconfig
k8s_worker_kubelet_conf_yaml: |
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "{{ k8s_worker_pki_dir }}/ca-k8s-apiserver.pem"
authorization:
mode: Webhook
clusterDomain: "cluster.local"
clusterDNS:
- "10.32.0.254"
failSwapOn: true
healthzBindAddress: "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
healthzPort: 10248
runtimeRequestTimeout: "15m"
serializeImagePulls: false
tlsCertFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}.pem"
tlsPrivateKeyFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}-key.pem"
cgroupDriver: "systemd"
registerNode: true
containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
# Directorio para almacenar la configuración de kube-proxy
k8s_worker_kubeproxy_conf_dir: "{{ k8s_worker_conf_dir }}/kube-proxy"
# Configuración de kube-proxy
k8s_worker_kubeproxy_settings:
"config": "{{ k8s_worker_kubeproxy_conf_dir }}/kubeproxy-config.yaml"
k8s_worker_kubeproxy_conf_yaml: |
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
clientConnection:
kubeconfig: "{{ k8s_worker_kubeproxy_conf_dir }}/kubeconfig"
healthzBindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}:10256
mode: "ipvs"
ipvs:
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 2s
iptables:
masqueradeAll: true
clusterCIDR: "10.200.0.0/16"
Dependencias
Ejemplo de Playbook
- hosts: k8s_worker
roles:
- githubixx.kubernetes_worker
Pruebas
Este rol tiene una pequeña configuración de prueba que se crea utilizando Molecule, libvirt (vagrant-libvirt) y QEMU/KVM. Por favor, consulta mi publicación en el blog Probando roles de Ansible con Molecule, libvirt (vagrant-libvirt) y QEMU/KVM sobre cómo configurarlo. La configuración de prueba está aquí.
Después, se puede ejecutar Molecule. Esto instalará algunas máquinas virtuales (VM) con sistemas operativos Ubuntu compatibles e instalará un clúster de Kubernetes:
molecule converge
En este momento, el clúster no está completamente funcional ya que falta un complemento de red. Por ejemplo, la comunicación Pod a Pod entre dos nodos diferentes aún no es posible. Para solucionar esto, se puede usar el siguiente comando para instalar Cilium para todas las necesidades de red de Kubernetes y CoreDNS para la parte de DNS de Kubernetes:
molecule converge -- --extra-vars k8s_worker_setup_networking=install
Después de esto, básicamente tendrás un clúster de Kubernetes completamente funcional.
También se incluye un pequeño paso de verificación:
molecule verify
Para limpiar, ejecuta
molecule destroy
Licencia
LICENCIA PÚBLICA GENERAL GNU Versión 3
Información del Autor
ansible-galaxy install githubixx.kubernetes_worker