启用 kubelet 只读端口

概览

本文档介绍如何在 GKE on VMware 的每个节点中部署特权 DaemonSet,以修改 kubelet 参数以启用只读端口。在 1.16 版及更高版本中,kubelet 只读端口默认处于停用状态。

前提条件

在运行以下补丁脚本之前,请确保您的 GKE on VMware 运行状况良好。您可以使用此解决方案修补 1.16 及更高版本的管理员集群和用户集群。

创建 DaemonSet 文件

在当前目录中创建名为 patch.yaml 的 DaemonSet 文件,其中包含以下内容:

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"

更新只读端口号

  • 如需更改端口号,请在 DaemonSet YAML 中手动修改环境变量 KUBELET_READONLY_PORT

  • 默认的只读端口为 10255,您不应选择 10250,因为它会与预定义的安全端口冲突。

修补管理员集群

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

修补用户集群

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

恢复

  • 如需停用只读端口,请在 DaemonSet YAML 中手动修改环境变量 KUBELET_READONLY_PORT

  • 保存更改后,系统将重新运行 DaemonSet 以相应地修改 kubelet。

注意事项

  • 此补丁的生命周期与已安装的第三方应用的生命周期相同。您可以随时将它作为投产后运维运行。但在重新创建集群后,它可能不会保留。如需让此更改永久生效,请在 GKE on VMware 初始化后操作中将此 DaemonSet 作为一个步骤进行部署。

  • 运行一次后,kubelet 配置文件应修改并重新加载。您可以安全地运行 kubectl delete -f patch.yaml 以清理 DaemonSet 资源。

  • 在 Windows 上运行的 GKE on VMware 不支持此补丁。

  • Kubernetes 不会对此不安全的端口 10255 执行任何身份验证或授权检查。启用此功能将使 kubelet 数据不受保护,并向未经授权的用户公开。kubelet 在更安全、经过身份验证的端口 10250 上提供相同的端点,请考虑迁移到该安全端口。