目录

静态token访问kubelet的cadvisor接口

概述

在推广 Kubernetes v1.30.4 版本的部署,由于监控团队计划使用的 agent 读取 kubelet 的 metrics/cadvisor 接口获取容器指标,当前遇到几个问题如下:

  1. kubelet不允许开放http端口访问(安全问题)
  2. agent在内网使用systemd部署二进制,无法分配serviceaccount
  3. 所有集群的smart-agent希望统一方式访问kubelet
  4. 不允许在Node上放置serviceaccount的证书

鉴于以上原因,以及 smart-agent 在公有云会使用 DaemonSet 部署,访问方式希望保持统一,因此计划通过 token-auth-file 配置静态 token 提供给监控 agent 使用。

操作

kube-apiserver 启动参数增加 –token-auth-file=/etc/kubernetes/pki/static-token-file.csv。

/%E9%9D%99%E6%80%81token%E8%AE%BF%E9%97%AEkubelet%E7%9A%84cadvisor%E6%8E%A5%E5%8F%A3/img.png

文件内容可以参考如下:

1
2
3
cat > /etc/kubernetes/pki/static-token-file.csv <<EOF
31ada4fd-adec-460c-809a-9e56ceb75269,smart-agent,1000,smart-agent
EOF

部署 smart-agent 之前需要把 clusterrole 和 clusterrolebinding 配置好。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: smart-agent-reader
rules:
  - apiGroups: [""]
    resources: ["nodes/metrics"]
    verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: smart-agent-reader-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: smart-agent-reader
subjects:
  - kind: User
    name: smart-agent
    apiGroup: rbac.authorization.k8s.io

最后可以通过下面的方式测试,smart-agent 可以使用这个统一的 token 访问所有集群的 cadvisor 指标:

1
2
3
curl -k -H "Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269" https://127.0.0.1:10250/metrics/cadvisor
curl -k -H "Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269" https://127.0.0.1:10250/metrics
curl -k -H "Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269" https://127.0.0.1:6443/api/v1/nodes

其他

其他还有几个技术点需要考虑:

  1. kubelet保证绑定127.0.0.1
  2. 经过测试serviceaccount和静态token可以同时配置使用

总结

如果从安全的角度来看,用同一个静态 token 肯定是不建议的,但每个公司都有不少这种脱裤子放屁的操作,并且从技术上看,又并不是不可以的,那就唯有调研一下这个方案了,欢迎大家针对这个方案讨论一下。

参考资料

  1. static-token-file