Ative a porta só de leitura do kubelet

Vista geral

Este documento mostra como implementar um DaemonSet privilegiado em cada nó do Google Distributed Cloud para modificar os parâmetros do kubelet de modo a ativar as portas só de leitura. Na versão 1.16 e posteriores, a porta só de leitura do kubelet está desativada por predefinição.

Pré-requisito

Certifique-se de que o Google Distributed Cloud está em bom estado antes de executar o seguinte script de patch. Pode usar esta solução para aplicar patches a clusters de administrador e clusters de utilizadores 1.16 e posteriores.

Crie um ficheiro DaemonSet

Crie e guarde um ficheiro DaemonSet denominado 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"

Atualize o número da porta só de leitura

  • Para alterar o número da porta, edite manualmente a variável de ambiente KUBELET_READONLY_PORT no YAML do DaemonSet.

  • A porta só de leitura predefinida é 10255. Não deve escolher 10250, uma vez que entra em conflito com a porta segura predefinida.

Aplique patches ao cluster de administrador

   kubectl apply -f patch.yaml \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG

Aplique uma correção ao cluster de utilizadores

   kubectl apply -f patch.yaml \
    --kubeconfig USER_CLUSTER_KUBECONFIG

Restaurar

  • Para desativar a porta só de leitura, edite manualmente a variável de ambiente KUBELET_READONLY_PORT no YAML do DaemonSet.

  • Depois de guardar as alterações, o DaemonSet é executado novamente para modificar o kubelet em conformidade.

Advertências

  • Este patch tem o mesmo ciclo de vida que as suas apps de terceiros instaladas. Pode executá-lo em qualquer altura como uma operação do dia 2. No entanto, pode não persistir depois de recriar o cluster. Para tornar esta alteração persistente, implemente este DaemonSet como um passo na ação de pós-inicialização do Google Distributed Cloud.

  • Após a execução única, o ficheiro de configuração do kubelet deve ser modificado e recarregado. Pode executar kubectl delete -f patch.yaml com segurança para limpar os recursos DaemonSet.

  • O Google Distributed Cloud em execução no Windows não suporta esta correção.

  • O Kubernetes não realiza verificações de autenticação nem de autorização nesta porta não segura 10255. A ativação desta opção deixa os dados do kubelet desprotegidos e expostos a utilizadores não autorizados. O kubelet serve o mesmo ponto final na porta 10250 autenticada e mais segura. Considere migrar para essa porta segura.