Información general
En este documento se muestra cómo desplegar un DaemonSet con privilegios en cada nodo de Google Distributed Cloud para modificar los parámetros de kubelet y habilitar los puertos de solo lectura. En la versión 1.16 y posteriores, el puerto de solo lectura de kubelet está inhabilitado de forma predeterminada.
Requisitos previos
Asegúrate de que tu Google Distributed Cloud esté en buen estado antes de ejecutar la siguiente secuencia de comandos de parche. Puedes usar esta solución para parchear clústeres de administrador y de usuario de la versión 1.16 y posteriores.
Crear un archivo DaemonSet
Crea y guarda un archivo DaemonSet llamado patch.yaml en el directorio actual con el siguiente contenido:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: onprem-node-patcher
namespace: kube-system
spec:
selector:
matchLabels:
name: onprem-node-patcher
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
name: onprem-node-patcher
spec:
tolerations:
- operator: Exists
volumes:
- name: host
hostPath:
path: /
hostPID: true
initContainers:
- name: read-only-patcher
image: "ubuntu"
env:
- name: KUBELET_READONLY_PORT
value: "10255"
# Number of 1G hugepages. Update the value as desired.
command:
- /bin/bash
- -c
- |
set -xeuo pipefail
configfile="/host/var/lib/kubelet/config.yaml"
kubeletservice="/host/etc/systemd/system/kubelet.service"
# $1: The read-only port for the kubelet to serve on with no
# authentication/authorization (set to 0 to disable)
function set-readonly-port-in-config() {
[[ "$#" -eq 1 ]] || return
local readonlyport; readonlyport="$1"
local actual; actual="$(grep readOnlyPort "${configfile}")"
if [[ "${actual}" == "" ]]; then
echo "readOnlyPort: ${readonlyport}" >> "${configfile}"
else
sed -E -i 's/readOnlyPort: [0-9]+/readOnlyPort: '"${readonlyport}"'/g' ${configfile}
fi
echo "Successfully append readOnlyPort: ${readonlyport} to ${configfile}"
}
sed -E -i 's/--read-only-port=[0-9]+/--read-only-port='"${KUBELET_READONLY_PORT}"'/g' ${kubeletservice}
[[ -f ${configfile} ]] && set-readonly-port-in-config "${KUBELET_READONLY_PORT}"
echo "Restarting kubelet..."
chroot /host nsenter -a -t1 -- systemctl daemon-reload
chroot /host nsenter -a -t1 -- systemctl restart kubelet.service
echo "Success!"
volumeMounts:
- name: host
mountPath: /host
resources:
requests:
memory: 5Mi
cpu: 5m
securityContext:
privileged: true
containers:
- image: gcr.io/google-containers/pause:3.2
name: pause
# Ensures that the pods will only run on the nodes having the correct
# label.
nodeSelector:
"kubernetes.io/os": "linux"
Actualizar el número de puerto de solo lectura
Para cambiar el número de puerto, edita manualmente la variable de entorno
KUBELET_READONLY_PORTen el archivo YAML de DaemonSet.El puerto de solo lectura predeterminado es
10255, por lo que no debes elegir10250, ya que entrará en conflicto con el puerto seguro predefinido.
Aplicar un parche al clúster de administrador
kubectl apply -f patch.yaml \
--kubeconfig ADMIN_CLUSTER_KUBECONFIG
Aplicar un parche al clúster de usuarios
kubectl apply -f patch.yaml \
--kubeconfig USER_CLUSTER_KUBECONFIG
Restaurar
Para inhabilitar el puerto de solo lectura, edita manualmente la variable de entorno
KUBELET_READONLY_PORTen el archivo YAML de DaemonSet.Después de guardar los cambios, el DaemonSet se volverá a ejecutar para modificar el kubelet en consecuencia.
Advertencias
Este parche tiene el mismo ciclo de vida que las aplicaciones de terceros instaladas. Puedes ejecutarlo en cualquier momento como operación del día 2. Sin embargo, es posible que no se conserve después de volver a crear el clúster. Para que este cambio sea permanente, implementa este DaemonSet como un paso en la acción posterior a la inicialización de Google Distributed Cloud.
Una vez que se haya ejecutado, el archivo de configuración de kubelet se debe modificar y volver a cargar. Puedes ejecutar
kubectl delete -f patch.yamlde forma segura para limpiar los recursos de DaemonSet.Google Distributed Cloud en Windows no admite este parche.
Kubernetes no realiza ninguna comprobación de autenticación ni autorización en este puerto no seguro
10255. Si lo habilitas, los datos de kubelet quedarán desprotegidos y expuestos a usuarios no autorizados. Kubelet ofrece el mismo endpoint en el puerto10250, que es más seguro y autenticado. Te recomendamos que migres a ese puerto seguro.