如何保护 Google Kubernetes Engine (GKE) 中的只读端口 10255?

How to secure the read-only port 10255 in Google Kubernetes Engine (GKE)?

我使用以下命令创建了一个 GKE 私有集群(版本:1.13.6-gke.13):

gcloud container clusters create a-cluster-with-user-pass \
 --network vpc-name \
 --subnetwork subnet-name    \
 --enable-master-authorized-networks \
 --username random \
 --password averylongpassword \
 --enable-ip-alias \
 --enable-private-nodes \
 --enable-private-endpoint \
 --master-ipv4-cidr xxx.xx.xx.xx/28 \
 --cluster-version 1.13.6-gke.13 \
 --num-nodes 2 \
 --zone asia-south1-a

我可以看到在上述集群中创建的两个节点(或者我们可以说是 GCP 计算实例)中都打开了端口 (10255)。

如果我创建一个简单的 GCP 计算实例(所以我总共有 3 个 VM 实例)并尝试从此 VM 访问 10255 端口上的 GKE 节点的内部 IP,我无需任何身份验证即可访问它或授权。 以下是用于创建 GCP 计算实例的命令:

gcloud compute instances create vm-name \
 --network vpc-name \
 --subnetwork subnet-name    \
 --zone asia-south1-a

如果我发送一个简单的 CURL GET 请求到 (xxx.xx.xx.xx:10255/pods) 我获取有关 pods 和应用程序的大量信息。 正如我在 Kubernetes here 的文档中看到的那样,提到:

--read-only-port int32
     The read-only port for the Kubelet to serve on with no authentication/authorization (set to 0 to disable) (default 10255)

我尝试通过执行 ssh 并重新启动 kubelet 来编辑节点中的 kube-config.yaml 文件来禁用端口,我成功了。但这是一个好方法吗?我相信当禁用 xxx.xx.xx.xx:10255/metrics 时可能会出现多个问题。有没有办法保护端口?而不是禁用它?

我看到这个 github issue 并且我确信有办法保护这个端口。我不确定该怎么做。

我看到 Kubernetes 文档大体上为我们提供了多种方式来保护端口。如何在 Google Kubernetes Engine 中做到这一点?

Kubelet 正在使用此端口公开收集的节点指标。未能在那里公开这些指标可能会导致意外行为,因为系统基本上会盲目飞行。

由于 GKE 是一个托管系统,您真的不应该调整 kubelet 标志,因为当重新创建节点时设置将被重置(节点基于 GCE 模板,不包括您自己的配置)。

至于安全性,我认为保留该端口是安全的,因为您使用的是私有集群,这意味着只允许同一 VPC 中的资源到达节点。

正如 Yahir Hernández 在他的回答中所建议的那样,此端口用于公开与确保平稳运行的系统相关的指标。禁用此端口可能不是一个好主意。

我们需要做的是防止VPC外访问这个端口

因为您在 GCP 上使用 GKE。如果您使用的是 VPC,则可以将防火墙规则添加到端口 (10255),以仅允许来自 VPC 资源的传入流量。禁止从互联网访问此端口。

根据 CIS Google Kubernetes Engine (GKE) Benchmark v1.0.0 第 196 和 197 页,“建议”>“Kubelet”:

  • 建议(广泛适用,应该适用于几乎所有环境)关闭read-only端口10255
  • 您可以通过编辑 kubelet 配置文件将 readOnlyPort 设置为 0 然后重新启动 kubelet 服务来完成此操作

同时,Google mentions(第 4.2.4 点)端口默认未禁用,因为:

Some GKE monitoring components use the kubelet read-only port to obtain metrics.


CIS 基准的建议是 tone-deaf,几乎一文不值。

  • GKE 的重点是不必自己管理 kubelet。
  • 尚不清楚该建议对 GKE 对您集群的监控有何影响。
  • 如何在 auto-scaling 集群中保持设​​置的永久性并不明显。 (守护进程 运行 作为 privileged,其唯一目的是覆盖 GKE 的 kubelet 配置?)

在我看来,您可以采取的最佳缓解措施是:

  1. 确保端口只能从 VPC 内部访问。
  2. 为您的 pods 设置良好的出口网络策略。 (或者在其他一些 方式管理您的出口流量。)避免允许 pods 允许所有端口上的所有出口。