|
Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado. |
Opciones avanzadas / Configuración
Esta sección contiene información avanzada que describe las diferentes formas en que puedes ejecutar y gestionar K3s, así como los pasos necesarios para preparar el sistema operativo del host para el uso de K3s.
Gestión de certificados
Certificados de CA
K3s genera certificados de CA autofirmados durante el inicio del primer nodo servidor. Estos certificados de CA son válidos durante 10 años y no se renuevan automáticamente.
Para obtener información sobre el uso de certificados de CA personalizados o la renovación de los certificados de CA autofirmados, consulta la k3s certificate rotate-ca documentación del comando.
Certificados de Cliente y Servidor
Los certificados de cliente y servidor de K3s son válidos por 365 días a partir de su fecha de emisión. Cualquier certificado que esté caducado o que esté dentro de los 90 días de caducidad se renueva automáticamente cada vez que K3s se inicia.
Para obtener información sobre la rotación manual de certificados de cliente y servidor, consulta la k3s certificate rotate documentación del comando.
Gestión de tokens
Por defecto, K3s utiliza un único token estático para servidores y agentes. Con cuidado, este token puede ser rotado una vez que se ha creado el clúster.
También es posible habilitar un segundo token estático que solo puede ser utilizado para unir agentes, o crear tokens de unión temporales de estilo kubeadm que expiran automáticamente.
Para obtener más información, consulta la k3s token documentación del comando.
Configuración de la Resolución DNS
Comprobaciones de Viabilidad del Servidor de Nombres
Al iniciar, cada nodo verifica los archivos en /etc/resolv.conf y /run/systemd/resolve/resolv.conf en busca de servidores de nombres de retrobucle, multidifusión o locales de enlace.
Si hay entradas de este tipo presentes, el archivo de configuración no se utiliza, ya que tales entradas no funcionarían correctamente dentro de los pods que heredan la configuración de resolución de nombres de su nodo.
Si no se encuentra un resolv.conf utilizable, K3s imprime un mensaje de advertencia en los registros y genera un resolv.conf provisional que utiliza 8.8.8.8 y 2001:4860:4860::8888 como servidores de nombres.
Si deseas proporcionar a K3s una configuración de resolutor alternativo sin modificar los archivos de configuración del sistema, puedes utilizar la opción --resolv-conf para especificar la ruta a un archivo adecuado.
Los archivos de configuración de resolutor especificados manualmente no están sujetos a comprobaciones de viabilidad.
Importaciones de Configuración Personalizada de CoreDNS
Para personalizar la configuración de CoreDNS, puedes crear un ConfigMap llamado coredns-custom en el espacio de nombres kube-system.
Las claves que coinciden con .override se importan en el Bloque de Servidor :.53.
Se pueden colocar Bloques de Servidor adicionales en claves que coincidan con .server.
Contenido adicional (archivos de zona, etc.) también puede estar presente y se monta bajo /etc/coredns/custom en los pods de coredns.
Aquí hay un ejemplo de ConfigMap que reenvía las búsquedas a example.com a un servidor de nombres en 10.0.0.1 y sirve example.net desde un archivo de texto conforme a RFC 1035:
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns-custom
namespace: kube-system
data:
example-com.override: |
forward example.com 10.0.0.1
example-net.server: |
example.net:53 {
log
errors
file /etc/coredns/custom/db.example.net
}
db.example.net: |
$ORIGIN example.net.
@ 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. 2017042745 7200 3600 1209600 3600
3600 IN NS a.iana-servers.net.
3600 IN NS b.iana-servers.net.
www IN A 127.0.0.1
IN AAAA ::1
Configurando un proxy HTTP
Si estás ejecutando K3s en un entorno que solo tiene conectividad externa a través de un proxy HTTP, puedes configurar tus ajustes de proxy en el servicio systemd de K3s. Estos ajustes de proxy se utilizarán en K3s y se pasarán al containerd y kubelet integrados.
|
La configuración del proxy y otras variables de entorno del host NO se pasan a los Pods. |
El script de instalación de K3s tomará automáticamente las variables HTTP_PROXY, HTTPS_PROXY y NO_PROXY, así como CONTAINERD_HTTP_PROXY, CONTAINERD_HTTPS_PROXY y CONTAINERD_NO_PROXY del shell actual, si están presentes, y las escribirá en el archivo de entorno de tu servicio systemd, normalmente:
-
/etc/systemd/system/k3s.service.env -
/etc/systemd/system/k3s-agent.service.env
Por supuesto, también puedes configurar el proxy editando estos archivos.
K3s añadirá automáticamente los rangos de IP internos de Pod y Servicio del clúster y el dominio DNS del clúster a la lista de entradas NO_PROXY. Debes asegurarte de que los rangos de direcciones IP utilizados por los nodos de Kubernetes (es decir, las IPs públicas y privadas de los nodos) estén incluidos en la lista NO_PROXY, o que los nodos puedan ser alcanzados a través del proxy.
HTTP_PROXY=http://your-proxy.example.com:8888 HTTPS_PROXY=http://your-proxy.example.com:8888 NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
Si deseas configurar los ajustes del proxy para containerd sin afectar a K3s y al Kubelet, puedes prefijar las variables con CONTAINERD_:
CONTAINERD_HTTP_PROXY=http://your-proxy.example.com:8888 CONTAINERD_HTTPS_PROXY=http://your-proxy.example.com:8888 CONTAINERD_NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
Usando Docker como el entorno de ejecución de contenedor
K3s incluye y utiliza por defecto containerd, un entorno de ejecución de contenedor estándar de la industria. A partir de Kubernetes 1.24, el Kubelet ya no incluye dockershim, el componente que permite al kubelet comunicarse con dockerd. K3s 1.24 y versiones superiores incluyen cri-dockerd, lo que permite actualizar versión sin problemas desde versiones anteriores de K3s mientras se sigue utilizando el entorno de ejecución de contenedor Docker.
Para utilizar Docker en lugar de containerd:
-
Instala Docker en el nodo de K3s. Uno de los scripts de instalación de Docker de Rancher se puede utilizar para instalar Docker:
curl https://releases.rancher.com/install-docker/20.10.sh | sh -
Instala K3s utilizando la opción
--docker:curl -sfL https://get.k3s.io | INSTALL_K3S_ARTIFACT_URL=<PRIME-ARTIFACTS-URL>/k3s sh -s - --docker -
Confirma que el clúster está disponible:
$ sudo k3s kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system local-path-provisioner-6d59f47c7-lncxn 1/1 Running 0 51s kube-system metrics-server-7566d596c8-9tnck 1/1 Running 0 51s kube-system helm-install-traefik-mbkn9 0/1 Completed 1 51s kube-system coredns-8655855d6-rtbnb 1/1 Running 0 51s kube-system svclb-traefik-jbmvl 2/2 Running 0 43s kube-system traefik-758cd5fc85-2wz97 1/1 Running 0 43s -
Confirma que los contenedores de Docker están en ejecución:
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e4d34729602 897ce3c5fc8f "entry" About a minute ago Up About a minute k8s_lb-port-443_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0 bffdc9d7a65f rancher/klipper-lb "entry" About a minute ago Up About a minute k8s_lb-port-80_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0 436b85c5e38d rancher/library-traefik "/traefik --configfi…" About a minute ago Up About a minute k8s_traefik_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0 de8fded06188 rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0 7c6a30aeeb2f rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0 ae6c58cab4a7 9d12f9848b99 "local-path-provisio…" About a minute ago Up About a minute k8s_local-path-provisioner_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0 be1450e1a11e 9dd718864ce6 "/metrics-server" About a minute ago Up About a minute k8s_metrics-server_metrics-server-7566d596c8-9tnck_kube-system_031e74b5-e9ef-47ef-a88d-fbf3f726cbc6_0 4454d14e4d3f c4d3d16fe508 "/coredns -conf /etc…" About a minute ago Up About a minute k8s_coredns_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0 c3675b87f96c rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0 4b1fddbe6ca6 rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0 64d3517d4a95 rancher/pause:3.1 "/pause"
Usando etcdctl
etcdctl proporciona una CLI para interactuar con los servidores etcd. K3s no incluye etcdctl.
Si deseas utilizar etcdctl para interactuar con el etcd embebido de K3s, instala etcdctl utilizando la documentación oficial.
ETCD_VERSION="v3.5.5"
ETCD_URL="https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz"
curl -sL ${ETCD_URL} | sudo tar -zxv --strip-components=1 -C /usr/local/bin
Puedes utilizar etcdctl configurándolo para usar los certificados y claves gestionados por K3s para la autenticación:
sudo etcdctl version \
--cacert=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt \
--cert=/var/lib/rancher/k3s/server/tls/etcd/client.crt \
--key=/var/lib/rancher/k3s/server/tls/etcd/client.key
Configurando containerd
|
Puerta de versión
K3s incluye containerd 2.0 a partir de las versiones de febrero de 2025: v1.31.6+k3s1 y v1.32.2+k3s1. Ten en cuenta que containerd 2.0 prefiere la versión de configuración 3, mientras que containerd 1.7 prefiere la versión de configuración 2. |
K3s generará un archivo de configuración para containerd en /var/lib/rancher/k3s/agent/etc/containerd/config.toml, utilizando valores específicos para la configuración actual del clúster y del nodo.
Para personalización avanzada, puedes crear una plantilla de configuración de containerd en el mismo directorio:
-
Para containerd 2.0, coloca una plantilla de configuración de versión 3 en
config-v3.toml.tmpl.Consulta la documentación de containerd 2.0 para más información.
-
Para containerd 1.7 y versiones anteriores, coloca una plantilla de configuración de versión 2 en
config.toml.tmpl.Consulta la documentación de containerd 1.7 para más información.
Containerd 2.0 es compatible hacia atrás con versiones de configuración anteriores, y k3s seguirá generando la configuración de versión 2 heredada desde config.toml.tmpl si config-v3.toml.tmpl no se encuentra.
El archivo de plantilla se renderiza en la configuración de containerd utilizando la text/template biblioteca.
Consulta ContainerdConfigTemplateV3 y ContainerdConfigTemplate en templates.go para el contenido de la plantilla por defecto.
La plantilla se ejecuta con una estructura ContainerdConfig como su valor punto (argumento de datos).
Plantilla base
Puedes extender la plantilla base de K3s en lugar de copiar y pegar la plantilla completa del código fuente de K3s. Esto es útil si solo necesitas construir sobre la configuración existente añadiendo unas pocas líneas adicionales antes o después de los valores por defecto.
{{ template "base" . }}
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.'custom']
runtime_type = "io.containerd.runc.v2"
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.'custom'.options]
BinaryName = "/usr/bin/custom-container-runtime"
SystemdCgroup = true
|
Para obtener los mejores resultados, NO copies simplemente un |
Soporte para entornos de ejecución de contenedor alternativos
K3s detectará automáticamente entornos de ejecución de contenedor alternativos si están presentes cuando K3s se inicia. Los entornos de ejecución de contenedor soportados son:
crun, lunatic, nvidia, nvidia-cdi, nvidia-experimental, slight, spin, wasmedge, wasmer, wasmtime, wws
K3s utiliza la variable de entorno PATH del servicio para buscar ejecutables de entorno de ejecución de contenedor.
Si K3s no detecta un entorno de ejecución de contenedor instalado, asegúrate de que esté presente en una vía del sistema, que generalmente incluye:
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
Entorno de ejecución de contenedor NVIDIA
Las GPU NVIDIA requieren la instalación del entorno de ejecución de contenedor NVIDIA para programar y ejecutar cargas de trabajo aceleradas en Pods. Para usar GPUs NVIDIA con K3s, realiza los siguientes pasos:
-
Instala el repositorio del paquete nvidia-container en el nodo siguiendo las instrucciones en: https://nvidia.github.io/libnvidia-container/
-
Instala los paquetes del entorno de ejecución de contenedor nvidia. Por ejemplo:
apt install -y nvidia-container-runtime cuda-drivers-fabricmanager-515 nvidia-headless-515-server -
Instala K3s, o reinícialo si ya está instalado.
-
Confirma que el entorno de ejecución de contenedor nvidia ha sido encontrado por k3s:
grep nvidia /var/lib/rancher/k3s/agent/etc/containerd/config.toml
Si se siguen correctamente estos pasos, K3s añadirá automáticamente los runtimes de NVIDIA a la configuración de containerd, dependiendo de qué ejecutables de runtime se encuentren.
K3s incluye definiciones de RuntimeClass de Kubernetes para todos los runtimes alternativos soportados. Puedes seleccionar uno de estos para reemplazar runc como el runtime predeterminado en un nodo configurando el valor de --default-runtime a través de la CLI de k3s o del archivo de configuración.
Si no has cambiado el runtime predeterminado en tus nodos GPU, debes solicitar explícitamente el runtime de NVIDIA configurando runtimeClassName: nvidia en la especificación del Pod:
apiVersion: v1
kind: Pod
metadata:
name: nbody-gpu-benchmark
namespace: default
spec:
restartPolicy: OnFailure
runtimeClassName: nvidia
containers:
- name: cuda-container
image: nvcr.io/nvidia/k8s/cuda-sample:nbody
args: ["nbody", "-gpu", "-benchmark"]
resources:
limits:
nvidia.com/gpu: 1
env:
- name: NVIDIA_VISIBLE_DEVICES
value: all
- name: NVIDIA_DRIVER_CAPABILITIES
value: all
Ten en cuenta que el NVIDIA Container Runtime también se utiliza frecuentemente con NVIDIA Device Plugin, con modificaciones para asegurar que las especificaciones de los pods incluyan runtimeClassName: nvidia, como se mencionó anteriormente.
Ejecutando Servidores Sin Agente (Experimental)
| Esta función es experimental. |
Cuando se inicia con la bandera --disable-agent, los servidores no ejecutan el kubelet, el entorno de ejecución de contenedor, ni CNI. No registran un recurso de Nodo en el clúster, y no aparecerán en la salida de kubectl get nodes.
Debido a que no alojan un kubelet, no pueden ejecutar pods ni ser gestionados por operadores que dependen de enumerar nodos del clúster, incluyendo el controlador etcd embebido y el controlador de actualización del sistema.
Ejecutar servidores sin agente puede ser ventajoso si deseas ocultar tus nodos de plano de control del descubrimiento por parte de agentes y cargas de trabajo, a costa de un aumento en la carga administrativa causada por la falta de soporte del operador del clúster.
Por defecto, el apiserver en servidores sin agente no podrá realizar conexiones salientes a webhooks de admisión o apiservices agregados que se ejecutan dentro del clúster. Para remediar esto, establece la bandera del servidor --egress-selector-mode a pod o cluster. Si estás cambiando esta bandera en un clúster existente, necesitarás reiniciar todos los nodos en el clúster para que la opción tenga efecto.
Ejecutando Servidores Sin Raíz (Experimental)
| Esta función es experimental. |
El modo sin raíz permite ejecutar servidores K3s como un usuario no privilegiado, para proteger el verdadero root en el host de posibles ataques de ruptura de contenedores.
Consulte https://rootlesscontaine.rs/ para aprender más sobre Kubernetes sin raíz.
Problemas conocidos con el modo sin raíz
-
Puertos
Al ejecutar sin raíz, se crea un nuevo espacio de nombres de red. Esto significa que la instancia de K3s se está ejecutando con una red bastante separada del host. La única forma de acceder a los servicios que se ejecutan en K3s desde el host es configurar reenvíos de puertos al espacio de nombres de red de K3s. K3s sin raíz incluye un controlador que automáticamente enlazará el puerto 6443 y los puertos de servicio por debajo de 1024 al host con un desplazamiento de 10000.
Por ejemplo, un servicio en el puerto 80 se convertirá en 10080 en el host, pero el 8080 se mantendrá como 8080 sin ningún desplazamiento. Actualmente, solo los servicios LoadBalancer se enlazan automáticamente.
-
Cgroups
Cgroup v1 y Hybrid v1/v2 no son compatibles; solo se admite Cgroup v2 puro. Si K3s no puede iniciarse debido a cgroups faltantes al ejecutarse sin raíz, es probable que su nodo esté en modo híbrido, y los cgroups "faltantes" aún están vinculados a un controlador v1.
-
Clúster multi-nodo/multi-proceso
Los clústeres sin raíz de múltiples nodos, o múltiples procesos k3s sin raíz en el mismo nodo, no son compatibles actualmente. Consulte #6488 para obtener más detalles.
Iniciando servidores sin raíz
-
Habilite la delegación de cgroup v2, consulte https://rootlesscontaine.rs/getting-started/common/cgroup2/. Este paso es necesario; el kubelet sin raíz no podrá iniciarse sin los cgroups delegados correctamente.
-
Descargue
k3s-rootless.servicedehttps://github.com/k3s-io/k3s/blob/<VERSION>/k3s-rootless.service. Asegúrese de utilizar la misma versión dek3s-rootless.serviceyk3s. -
Instala
k3s-rootless.serviceen~/.config/systemd/user/k3s-rootless.service. No se admite la instalación de este archivo como un servicio a nivel de sistema (/etc/systemd/…). Dependiendo de la ruta del binariok3s, es posible que necesites modificar la líneaExecStart=/usr/local/bin/k3s …del archivo. -
Ejecuta
systemctl --user daemon-reload -
Ejecuta
systemctl --user enable --now k3s-rootless -
Ejecuta
KUBECONFIG=~/.kube/k3s.yaml kubectl get pods -Ay asegúrate de que los pods estén en funcionamiento.
No intentes ejecutar k3s server --rootless en un terminal, ya que las sesiones de terminal no permiten la delegación de cgroup v2.
Si realmente necesitas probarlo en un terminal, utiliza systemd-run --user -p Delegate=yes --tty k3s server --rootless para envolverlo en un ámbito de systemd.
|
Configuración avanzada sin raíz
K3s sin raíz utiliza rootlesskit y slirp4netns para comunicarse entre los espacios de nombres de red del host y del usuario.
Algunas de las configuraciones utilizadas por rootlesskit y slirp4nets se pueden establecer mediante variables de entorno. La mejor manera de establecer estas es añadirlas al campo Environment de la unidad systemd k3s-rootless.
| Variable | Default | Descripción |
|---|---|---|
|
1.500 |
Establece el MTU para las interfaces virtuales de slirp4netns. |
|
10.41.0.0/16 |
Establece el CIDR utilizado por las interfaces virtuales de slirp4netns. |
|
autodetectado |
Habilita el soporte IPv6 de slirp4netns. Si no se especifica, se habilita automáticamente si K3s está configurado para operación de doble pila. |
|
incorporado |
Selecciona el controlador de puerto sin privilegios; ya sea |
|
true |
Controla si se habilita o no el acceso a la dirección de retrobucle del host a través de la interfaz de gateway. Se recomienda que esto no se cambie, por razones de seguridad. |
Solución de problemas sin raíz
-
Ejecuta
systemctl --user status k3s-rootlesspara comprobar el estado del daemon -
Ejecuta
journalctl --user -f -u k3s-rootlesspara ver el registro del daemon -
Consulta también https://rootlesscontaine.rs/
Etiquetas y taints de nodo
Los agentes de K3s se pueden configurar con las opciones --node-label y --node-taint, que añaden una etiqueta y un taint al kubelet. Las dos opciones solo añaden etiquetas y/o taints en el momento del registro, por lo que solo se pueden establecer cuando el nodo se une por primera vez al clúster.
Todas las versiones actuales de Kubernetes restringen a los nodos de registrarse con la mayoría de las etiquetas que tienen los prefijos kubernetes.io y k8s.io, incluyendo específicamente la etiqueta kubernetes.io/role. Si intentas iniciar un nodo con una etiqueta no permitida, K3s no podrá iniciarse. Como indican los autores de Kubernetes:
No se permite a los nodos afirmar sus propias etiquetas de rol. Los roles de nodo se utilizan típicamente para identificar tipos de nodos privilegiados o de plano de control, y permitir que los nodos se etiqueten a sí mismos en ese grupo permite que un nodo comprometido atraiga trivialmente cargas de trabajo (como los daemonsets del plano de control) que confieren acceso a credenciales de mayor privilegio.
Consulte SIG-Auth KEP 279 para más información.
Si desea cambiar las etiquetas y taints de los nodos después del registro del nodo, o añadir etiquetas reservadas, debe usar kubectl. Consulte la documentación oficial de Kubernetes para obtener detalles sobre cómo añadir taints y etiquetas de nodo.
Iniciando el servicio con el guion de instalación
El script de instalación detectará automáticamente si su sistema operativo está utilizando systemd o openrc y habilitará e iniciará el servicio como parte del proceso de instalación.
-
Al ejecutar con openrc, se crearán registros en
/var/log/k3s.log. -
Al ejecutar con systemd, los registros se crearán en
/var/log/syslogy se verán utilizandojournalctl -u k3s(ojournalctl -u k3s-agenten los agentes).
Un ejemplo de deshabilitar el inicio automático y la habilitación del servicio con el script de instalación:
curl -sfL https://get.k3s.io | INSTALL_K3S_ARTIFACT_URL=<PRIME-ARTIFACTS-URL>/k3s INSTALL_K3S_SKIP_START=true INSTALL_K3S_SKIP_ENABLE=true sh -
Ejecutando K3s en Docker
Hay varias formas de ejecutar K3s en Docker:
-
K3d
-
Docker
k3d es una utilidad diseñada para ejecutar fácilmente clústeres K3s de múltiples nodos en Docker.
k3d facilita mucho la creación de clústeres k3s de un solo nodo y de múltiples nodos en Docker, por ejemplo, para el desarrollo local en Kubernetes.
Consulta la documentación de Instalación para más información sobre cómo instalar y usar k3d.
Para usar Docker, las imágenes rancher/k3s también están disponibles para ejecutar el servidor y el agente K3s.
Usando el comando docker run:
sudo docker run \
--privileged \
--name k3s-server-1 \
--hostname k3s-server-1 \
-p 6443:6443 \
-d rancher/k3s:v1.24.10-k3s1 \
server
|
Debes especificar una versión válida de K3s como etiqueta; la etiqueta |
Una vez que K3s esté en funcionamiento, puedes copiar el kubeconfig de administrador fuera del contenedor de Docker para su uso:
sudo docker cp k3s-server-1:/etc/rancher/k3s/k3s.yaml ~/.kube/config
Soporte de SELinux
Si estás instalando K3s en un sistema donde SELinux está habilitado por defecto (como CentOS), debes asegurarte de que se hayan instalado las políticas de SELinux adecuadas.
-
Instalación automática
-
Instalación manual
El script de instalación instalará automáticamente el RPM de SELinux del repositorio RPM de Rancher si está en un sistema compatible y no se está realizando una instalación en un entorno aislado. La instalación automática se puede omitir configurando INSTALL_K3S_SKIP_SELINUX_RPM=true.
Las políticas necesarias se pueden instalar con los siguientes comandos:
yum install -y container-selinux selinux-policy-base
yum install -y https://rpm.rancher.io/k3s/latest/common/centos/9/noarch/k3s-selinux-1.6-1.el9.noarch.rpm
Para forzar al script de instalación a registrar una advertencia en lugar de fallar, puedes establecer la siguiente variable de entorno: INSTALL_K3S_SELINUX_WARN=true.
Habilitando el cumplimiento de SELinux
Para aprovechar SELinux, especifica la bandera --selinux al iniciar los servidores y agentes de K3s o al establecer la variable de entorno K3S_SELINUX=true.
Esta opción también se puede especificar en el archivo de configuración de K3s.
selinux: true
No se admite el uso de un --data-dir personalizado bajo SELinux. Para personalizarlo, lo más probable es que necesites escribir tu propia política personalizada. Para obtener orientación, puedes consultar el repositorio containers/container-selinux, que contiene los archivos de política SELinux para el entorno de ejecución de contenedor, y el repositorio k3s-io/k3s-selinux, que contiene la política SELinux para K3s.
Habilitando la carga perezosa de eStargz (Experimental)
¿Qué es la carga perezosa y eStargz?
La carga de imágenes es conocida como uno de los pasos que consumen más tiempo en el ciclo de vida de los contenedores. Según Harter, et al.,
la carga de paquetes representa el 76% del tiempo de inicio del contenedor, pero solo el 6.4% de esos datos se leen.
Para abordar este problema, k3s admite experimentalmente la carga perezosa de los contenidos de la imagen. Esto permite que k3s inicie un contenedor antes de que se haya descargado toda la imagen. En su lugar, los fragmentos necesarios de contenidos (por ejemplo, archivos individuales) se obtienen bajo demanda. Especialmente para imágenes grandes, esta técnica puede acortar la latencia de inicio del contenedor.
Para habilitar la carga perezosa, la imagen objetivo debe estar formateada como eStargz. Este es un formato de imagen alternativo a OCI pero 100% compatible con OCI para la carga perezosa. Debido a la compatibilidad, eStargz se puede subir a registros de contenedores estándar (por ejemplo, ghcr.io) y además todavía se puede ejecutar incluso en entornos de ejecución ajenos a eStargz.
eStargz se desarrolla basado en el formato stargz propuesto por el proyecto CRFS de Google pero viene con características prácticas que incluyen verificación de contenido y optimización del rendimiento. Para más detalles sobre la carga perezosa y eStargz, consulta el repositorio del proyecto Stargz Snapshotter project repository.
Configurar k3s para la carga perezosa de eStargz
Como se muestra a continuación, se necesita la opción --snapshotter=stargz para el servidor y el agente k3s.
k3s server --snapshotter=stargz
Con esta configuración, puedes realizar la carga perezosa para imágenes en formato eStargz.
El siguiente manifiesto de Pod de ejemplo utiliza la imagen en formato eStargz node:13.13.0 (ghcr.io/stargz-containers/node:13.13.0-esgz).
Cuando el snapshotter stargz está habilitado, K3s realiza la carga perezosa para esta imagen.
apiVersion: v1
kind: Pod
metadata:
name: nodejs
spec:
containers:
- name: nodejs-estargz
image: ghcr.io/stargz-containers/node:13.13.0-esgz
command: ["node"]
args:
- -e
- var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200);
res.end('Hello World!\n');
}).listen(80);
ports:
- containerPort: 80
Fuentes de registro adicionales
Registro de Rancher para K3s se puede instalar sin usar Rancher. Las siguientes instrucciones deben ejecutarse para hacerlo:
helm repo add rancher-charts https://charts.rancher.io
helm repo update
helm install --create-namespace -n cattle-logging-system rancher-logging-crd rancher-charts/rancher-logging-crd
helm install --create-namespace -n cattle-logging-system rancher-logging --set additionalLoggingSources.k3s.enabled=true rancher-charts/rancher-logging
Registro adicional de políticas de red
Los paquetes descartados por las políticas de red pueden ser registrados. El paquete se envía a la acción NFLOG de iptables, que muestra los detalles del paquete, incluida la política de red que lo bloqueó.
Si hay mucho tráfico, el número de mensajes de registro podría ser muy alto. Para controlar la tasa de registro por política, establece los parámetros limit y limit-burst de iptables añadiendo las siguientes anotaciones a la política de red en cuestión:
-
kube-router.io/netpol-nflog-limit=<LIMIT-VALUE> -
kube-router.io/netpol-nflog-limit-burst=<LIMIT-BURST-VALUE>
Los valores predeterminados son limit=10/minute y limit-burst=10. Consulta el manual de iptables para más información sobre el formato y los posibles valores para estos campos.
Para convertir paquetes NFLOG en entradas de registro, instala ulogd2 y configura [log1] para leer en group=100. Luego, reinicia el servicio ulogd2 para que la nueva configuración se aplique.
Cuando un paquete es bloqueado por las reglas de políticas de red, aparecerá un mensaje de registro en /var/log/ulog/syslogemu.log.
Los paquetes enviados al socket netlink NFLOG también pueden ser leídos utilizando herramientas shell como tcpdump o tshark:
tcpdump -ni nflog:100
Aunque está más fácilmente disponible, tcpdump no mostrará el nombre de la política de red que bloqueó el paquete. Utiliza el comando tshark de wireshark en su lugar para mostrar el encabezado completo del paquete NFLOG, incluido el campo nflog.prefix que contiene el nombre de la política.
El registro de políticas de red de paquetes descartados no admite políticas con un podSelector vacío. Si confías en el registro de paquetes descartados para fines de diagnóstico o auditoría, asegúrate de que tus políticas incluyan un selector de pod que coincida con los pods afectados.