Descripción general
En este documento, se muestra cómo implementar 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 versiones posteriores, el puerto de solo lectura de kubelet está inhabilitado de forma predeterminada.
Requisitos
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 aplicar parches a los clústeres de administrador y de usuario de la versión 1.16 y versiones posteriores.
Crea un archivo DaemonSet
Crea y guarda un archivo DaemonSet llamado patch.yaml en tu 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"
Actualiza el número de puerto de solo lectura
Para cambiar el número de puerto, edita manualmente la variable de entorno
KUBELET_READONLY_PORT
en el YAML de DaemonSet.El puerto de solo lectura predeterminado es
10255
. No debes elegir10250
, ya que entrará en conflicto con el puerto seguro predefinido.
Aplica parches al clúster de administrador
kubectl apply -f patch.yaml \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
Aplica parches al clúster de usuario
kubectl apply -f patch.yaml \ --kubeconfig USER_CLUSTER_KUBECONFIG
Restablecer
Para inhabilitar el puerto de solo lectura, edita de forma manual la variable de entorno
KUBELET_READONLY_PORT
en el archivo YAML de DaemonSet.Después de guardar los cambios, se volverá a ejecutar el DaemonSet para modificar el kubelet según corresponda.
Advertencias
Este parche tiene el mismo ciclo de vida que tus apps de terceros instaladas. Puedes ejecutarlo en cualquier momento como una operación del día 2. Sin embargo, es posible que no persista después de que vuelvas a crear el clúster. Para que este cambio sea persistente, implementa este DaemonSet como un paso en la acción posterior a la inicialización de Google Distributed Cloud.
Después de ejecutarlo una vez, se debe modificar y volver a cargar el archivo de configuración de kubelet. Puedes ejecutar
kubectl delete -f patch.yaml
de forma segura para limpiar los recursos de DaemonSet.Google Distributed Cloud que se ejecuta en Windows no es compatible con este parche.
Kubernetes no realiza ninguna verificación de autenticación ni de 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 entrega el mismo extremo en el puerto10250
autenticado y más seguro. Considera migrar a ese puerto seguro.