概述
在推广 Kubernetes v1.30.4 版本的部署,由于监控团队计划使用的 agent 读取 kubelet 的 metrics/cadvisor 接口获取容器指标,当前遇到几个问题如下:
- kubelet不允许开放http端口访问(安全问题)
- agent在内网使用systemd部署二进制,无法分配serviceaccount
- 所有集群的smart-agent希望统一方式访问kubelet
- 不允许在Node上放置serviceaccount的证书
鉴于以上原因,以及 smart-agent 在公有云会使用 DaemonSet 部署,访问方式希望保持统一,因此计划通过 token-auth-file 配置静态 token 提供给监控 agent 使用。
操作
kube-apiserver 启动参数增加 –token-auth-file=/etc/kubernetes/pki/static-token-file.csv。
文件内容可以参考如下:
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
|
其他
其他还有几个技术点需要考虑:
- kubelet保证绑定127.0.0.1
- 经过测试serviceaccount和静态token可以同时配置使用
另外,这里也补充一下,如果是在 kubeadm 默认配置下搭建的集群,可以通过下面的,用 curl 命令查询 kubelet 的 /metrics 接口。
1
2
3
4
5
|
# 假设在control-plane节点上执行
curl -k --cacert /etc/kubernetes/pki/ca.crt \
--cert /etc/kubernetes/pki/apiserver-kubelet-client.crt \
--key /etc/kubernetes/pki/apiserver-kubelet-client.key \
https://localhost:10250/metrics/cadvisor
|
总结
如果从安全的角度来看,用同一个静态 token 肯定是不建议的,但每个公司都有不少这种脱裤子放屁的操作,并且从技术上看,又并不是不可以的,那就唯有调研一下这个方案了,欢迎大家针对这个方案讨论一下。
参考资料
- static-token-file
- kubelet认证/鉴权
注意
本文最后更新于 2024年10月10日,文中内容可能已过时,请谨慎参考。