Visão geral
Neste documento, mostramos como implantar um DaemonSet com privilégios em cada nó do Google Distributed Cloud para modificar os parâmetros do kubelet a fim de ativar portas somente leitura. Na versão 1.16 e posteriores, a porta somente leitura do kubelet está desativada por padrão.
Pré-requisito
Verifique se o Google Distributed Cloud está íntegro antes de executar o script de patch a seguir. É possível usar essa solução para corrigir clusters de administrador e clusters de usuário a partir da versão 1.16.
Criar um arquivo DaemonSet
Crie e salve um arquivo DaemonSet chamado patch.yaml no diretório atual, com o seguinte conteúdo:
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"
Atualizar o número da porta somente leitura
Para alterar o número da porta, edite manualmente a variável de ambiente
KUBELET_READONLY_PORTno YAML do DaemonSet.A porta somente leitura padrão é
10255. Não escolha10250porque ela vai entrar em conflito com a porta segura predefinida.
Aplicar patch ao cluster de administrador
kubectl apply -f patch.yaml \
--kubeconfig ADMIN_CLUSTER_KUBECONFIG
Aplicar patch ao cluster de usuário
kubectl apply -f patch.yaml \
--kubeconfig USER_CLUSTER_KUBECONFIG
Restaurar
Para desativar a porta somente leitura, edite manualmente a variável de ambiente
KUBELET_READONLY_PORTno YAML de DaemonSet.Depois de salvar as alterações, o DaemonSet será executado novamente para modificar o kubelet de acordo.
Advertências
Esse patch tem o mesmo ciclo de vida dos apps de terceiros instalados. É possível executá-lo a qualquer momento como uma operação de segundo dia. No entanto, talvez ele não persista depois que você recriar o cluster. Para tornar essa alteração persistente, implante esse DaemonSet como uma etapa na ação pós-inicialização do Google Distributed Cloud.
Depois de executado uma vez, o arquivo de configuração do kubelet deve ser modificado e recarregado. É possível executar
kubectl delete -f patch.yamlcom segurança para limpar recursos do DaemonSet.O Google Distributed Cloud em execução no Windows não dá suporte a esse patch.
O Kubernetes não executa nenhuma verificação de autenticação ou autorização nessa porta não segura
10255. Se ela for ativada, os dados do kubelet ficarão desprotegidos e expostos a usuários não autorizados. O kubelet disponibiliza o mesmo endpoint na porta mais segura e autenticada10250. Considere migrar para essa porta segura.