Panoramica
Questo documento mostra come eseguire il deployment di un DaemonSet con privilegi in ogni nodo di Google Distributed Cloud per modificare i parametri kubelet in modo da abilitare le porte di sola lettura. Nella versione 1.16 e successive, la porta di sola lettura kubelet è disabilitata per impostazione predefinita.
Prerequisito
Prima di eseguire lo script di patch seguente, assicurati che Google Distributed Cloud sia integro. Puoi utilizzare questa soluzione per applicare patch ai cluster di amministrazione e ai cluster utente 1.16 e versioni successive.
Crea un file DaemonSet
Crea e salva un file DaemonSet denominato patch.yaml nella directory corrente con i seguenti contenuti:
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"
Aggiorna il numero di porta di sola lettura
Per modificare il numero di porta, modifica manualmente la variabile di ambiente
KUBELET_READONLY_PORTnel file YAML di DaemonSet.La porta di sola lettura predefinita è
10255. Non devi scegliere10250perché è in conflitto con la porta sicura predefinita.
Applica patch al cluster di amministrazione
kubectl apply -f patch.yaml \
--kubeconfig ADMIN_CLUSTER_KUBECONFIG
Applica patch al cluster utente
kubectl apply -f patch.yaml \
--kubeconfig USER_CLUSTER_KUBECONFIG
Ripristina
Per disabilitare la porta di sola lettura, modifica manualmente la variabile di ambiente
KUBELET_READONLY_PORTnel file YAML di DaemonSet.Dopo aver salvato le modifiche, il DaemonSet verrà eseguito di nuovo per modificare kubelet di conseguenza.
Precisazioni
Questa patch ha lo stesso ciclo di vita delle app di terze parti installate. Puoi eseguirla in qualsiasi momento come operazione del giorno 2. Tuttavia, potrebbe non essere persistente dopo aver ricreato il cluster. Per rendere permanente questa modifica, esegui il deployment di questo DaemonSet come passaggio nell'azione di post-inizializzazione di Google Distributed Cloud.
Dopo l'esecuzione, il file di configurazione kubelet deve essere modificato e ricaricato. Puoi eseguire in sicurezza
kubectl delete -f patch.yamlper liberare spazio dalle risorse DaemonSet.Google Distributed Cloud in esecuzione su Windows non supporta questa patch.
Kubernetes non esegue controlli di autenticazione o autorizzazione su questa porta non sicura
10255. Se la abiliti, i dati kubelet non saranno protetti ed esposti a utenti non autorizzati. kubelet gestisce lo stesso endpoint sulla porta autenticata e più sicura10250. Valuta la possibilità di eseguire la migrazione a questa porta sicura.