k8s-node-collector 是一个开源收集器,用于从 Kubernetes 节点收集节点信息(文件系统和进程数据)并以 JSON 格式输出。
git clone git@github.com:aquasecurity/k8s-node-collector.git
cd k8s-node-collector/cmd/node-collector
GOOS=linux GOARCH=arm64 go build -o node-collector main.go
用法:
node-collector [标志]
node-collector [命令]
示例:
node-collector k8s [标志]
可用命令:
completion 为指定的 shell 生成自动补全脚本
help 关于任何命令的帮助
k8s k8s-node-collector 从集群节点提取文件系统信息
标志:
-c, --cluster-version string cluser 版本。例如 1.23.0
-h, --help node-collector 的帮助信息
--kubelet-config string 通过 API /api/v1/nodes/<>/proxy/configz 获取的 kubelet 配置,以 base64 编码
-n, --node string 节点名称
-o, --output string 输出格式。可选 table|json(默认 "json")
-s, --spec-name string 规范名称。例如:k8s-cis
-v, --spec-version string 规范版本。例如 1.23.0
./node-collector k8s
node-collector 执行收集器规范,例如 k8s-cis-1.23.0。每个规范必须包含:
name:- version:它所代表的 cis-benchmark 版本(例如:1.23.0)
version:它所代表的 cis-benchmark 版本(例如:1.23.0)
version:要执行特定规范,需要传递 --spec-name k8s-cis 和 --spec-version 1.23.0 标志
--spec-name k8s-cis --spec-version 1.23.0如果未指定收集器规范,node-collector 将尝试根据 version_mapping 数据中定义的平台类型和版本自动检测匹配的规范,例如:
k8s:
- op: "="
cluster_version: "1.21"
spec: k8s-cis-1.21.0
- op: ">"
cluster_version: "1.21"
spec: k8s-cis-1.23.0
如果您不知道集群支持哪个 cis 规范,可以使用 cluster-version 标志。此选项必须与 spec-name 标志一起使用,匹配的规范版本将被自动检测,例如:| --spec-name k8s-cis --cluster-version 1.23.1
cluster-version spec-name --spec-name k8s-cis --cluster-version 1.23.1在提供的示例中,有两条规则;第一个匹配的规则将获取相应的规范。任何版本等于 1.21 的原生 k8s cluser 将获取 k8s-cis-1.21.0 收集器规范,如果未找到匹配项,任何版本 grather to 1.21 的原生 k8s cluser 将获取 k8s-cis-1.23.0
k8s-cis-1.21.0 k8s-cis-1.23.0## 添加新的收集器规范
要添加新规范,请将新的 yaml 文件放在以下路径:.pkg/collector/config/specs/,并遵循以下文件命名 convesion 示例:gke-cis-1.24.0
.pkg/collector/config/specs/ platform cis spec_version gke-cis-1.24.0每个收集器规范审计包含以下字段
---
version: "1.23.0"
name: aks-cis
title: Node Specification for AKS info collector
collectors:
- key:
title:
nodeType:
audit:
name - 规范的名称(例如:aks-cis)
name aks-cisversion - 规范的版本(例如:1.23.0)
version 1.23.0title - 整个规范的简短描述
title## 特定审计数据
key - 用于保存审计 shell 命令输出的参数名称
keytitle - 审计 shell 命令的标题
titlenodeType - 定义应执行 shell 命令的节点类型(master | worker)
nodeTypeaudit - 用于收集信息并返回结果的 shell 命令(必须抑制错误)
audit## 配置文件
k8s-node-collector 使用配置文件,帮助根据不同平台(rancher、原生 k8s 等)获取二进制文件和配置文件路径,例如:
kubelet:
bins:
- kubelet
- hyperkube kubelet
confs:
- /etc/kubernetes/kubelet-config.yaml
- /var/lib/kubelet/config.yaml
节点收集器将根据其运行的平台获取 kubelet 二进制名称和配置文件路径。编写审计 shell 命令时,可以通过配置参数使用配置文件中的参数来收集适当的数据,例如,收集 kubelet config.yaml 配置文件的所有权:
audit
stat -c %U:%G $kubelet.confs
kubectl apply -f job.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
node-collector-ng2z7 0/1 Completed 0 6m13s
kubectl logs node-collector-ng2z7
{
"apiVersion": "v1",
"kind": "NodeInfo",
"metadata":{
"creationTimestamp":"2023-01-04T11:37:11+02:00"
},
"type": "master",
"info": {
"adminConfFileOwnership": {
"values": [
"root:root"
]
},
"adminConfFilePermissions": {
"values": [
600
]
},
"certificateAuthoritiesFileOwnership": {
"values": [
"root:root"
]
},
"certificateAuthoritiesFilePermissions": {
"values": [
644
]
},
"containerNetworkInterfaceFileOwnership": {
"values": [
"root:root",
"root:root"
]
},
"containerNetworkInterfaceFilePermissions": {
"values": [
700,
775
]
},
"controllerManagerConfFileOwnership": {
"values": [
"root:root"
]
},
"controllerManagerConfFilePermissions": {
"values": [
600
]
},
"etcdDataDirectoryOwnership": {
"values": [
"root:root"
]
},
"etcdDataDirectoryPermissions": {
"values": [
700
]
},
"kubeAPIServerSpecFileOwnership": {
"values": [
"root:root"
]
},
"kubeAPIServerSpecFilePermission": {
"values": [
600
]
},
"kubeControllerManagerSpecFileOwnership": {
"values": [
"root:root"
]
},
"kubeControllerManagerSpecFilePermission": {
"values": [
600
]
},
"kubeEtcdSpecFileOwnership": {
"values": [
"root:root"
]
},
"kubeEtcdSpecFilePermission": {
"values": [
600
]
},
"kubePKIDirectoryFileOwnership": {
"values": [
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root"
]
},
"kubePKIKeyFilePermissions": {
"values": [
600,
600,
600,
600,
600,
600,
600,
600,
600,
600,
600
]
},
"kubeSchedulerSpecFileOwnership": {
"values": [
"root:root"
]
},
"kubeSchedulerSpecFilePermission": {
"values": [
600
]
},
"kubeconfigFileExistsOwnership": {
"values": [
]
},
"kubeconfigFileExistsPermissions": {
"values": [
]
},
"kubeletAnonymousAuthArgumentSet": {
"values": [
## 执行收集器规范
node-collector 执行收集器规范,例如 [k8s-cis-1.23.0](./pkg/collector/config/specs/k8s-cis-1.23.0.yaml)。每个规范必须包含:
- `name:` 所用的其他平台,例如(k8s-cis、aks-cis、gke-cis 等)
- `version:` 其代表的 CIS 基准版本(例如:1.23.0)
要执行特定规范,需传递 `--spec-name k8s-cis` 和 `--spec-version 1.23.0` 标志。
如果未指定收集器规范,node-collector 将尝试根据平台类型和版本自动检测匹配的规范,如 [版本映射数据](./pkg/collector/config/config.yaml) 中所定义。例如:
```yaml
k8s:
- op: "="
cluster_version: "1.21"
spec: k8s-cis-1.21.0
- op: ">"
cluster_version: "1.21"
spec: k8s-cis-1.23.0
如果您不知道集群支持哪个 CIS 规范,可以使用 cluster-version 标志。此选项必须与 spec-name 标志结合使用,匹配的规范版本将被自动检测。例如:
--spec-name k8s-cis --cluster-version 1.23.1
在提供的示例中,有两条规则;第一条匹配规则将获取相应的规范。任何版本等于 1.21 的原生 Kubernetes 集群将获取 k8s-cis-1.21.0 收集器规范;如果未找到匹配项,任何版本大于 1.21 的原生 Kubernetes 集群将获取 k8s-cis-1.23.0。
{
"apiVersion": "v1",
"kind": "NodeInfo",
"metadata":{
"creationTimestamp":"2023-01-04T11:37:11+02:00"
},
"type": "master",
"info": {
"adminConfFileOwnership": {
"values": [
"root:root"
]
},
"adminConfFilePermissions": {
"values": [
600
]
},
"certificateAuthoritiesFileOwnership": {
"values": [
"root:root"
]
},
"certificateAuthoritiesFilePermissions": {
"values": [
644
]
},
"containerNetworkInterfaceFileOwnership": {
"values": [
"root:root",
"root:root"
]
},
"containerNetworkInterfaceFilePermissions": {
"values": [
700,
775
]
},
"controllerManagerConfFileOwnership": {
"values": [
"root:root"
]
},
"controllerManagerConfFilePermissions": {
"values": [
600
]
},
"etcdDataDirectoryOwnership": {
"values": [
"root:root"
]
},
"etcdDataDirectoryPermissions": {
"values": [
700
]
},
"kubeAPIServerSpecFileOwnership": {
"values": [
"root:root"
]
},
"kubeAPIServerSpecFilePermission": {
"values": [
600
]
},
"kubeControllerManagerSpecFileOwnership": {
"values": [
"root:root"
]
},
"kubeControllerManagerSpecFilePermission": {
"values": [
600
]
},
"kubeEtcdSpecFileOwnership": {
"values": [
"root:root"
]
},
"kubeEtcdSpecFilePermission": {
"values": [
600
]
},
"kubePKIDirectoryFileOwnership": {
"values": [
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root",
"root:root"
]
},
"kubePKIKeyFilePermissions": {
"values": [
600,
600,
600,
600,
600,
600,
600,
600,
600,
600,
600
]
},
"kubeSchedulerSpecFileOwnership": {
"values": [
"root:root"
]
},
"kubeSchedulerSpecFilePermission": {
"values": [
600
]
},
"kubeconfigFileExistsOwnership": {
"values": [
]
},
"kubeconfigFileExistsPermissions": {
"values": [
]
},
"kubeletAnonymousAuthArgumentSet": {
"values": [
]
},
"kubeletAuthorizationModeArgumentSet": {
"values": [
"Node",
"RBAC"
]
},
"kubeletClientCaFileArgumentSet": {
"values": [
"/etc/kubernetes/pki/ca.crt"
]
},
"kubeletConfFileOwnership": {
"values": [
"root:root"
]
},
"kubeletConfFilePermissions": {
"values": [
600
]
},
"kubeletConfigYamlConfigurationFileOwnership": {
"values": [
"root:root"
]
},
"kubeletConfigYamlConfigurationFilePermission": {
"values": [
644
]
},
"kubeletEventQpsArgumentSet": {
"values": [
]
},
"kubeletHostnameOverrideArgumentSet": {
"values": [
]
},
"kubeletMakeIptablesUtilChainsArgumentSet": {
"values": [
]
},
"kubeletOnlyUseStrong***graphic": {
"values": [
]
},
"kubeletProtectKernelDefaultsArgumentSet": {
"values": [
]
},
"kubeletReadOnlyPortArgumentSet": {
"values": [
]
},
"kubeletRotateCertificatesArgumentSet": {
"values": [
]
},
"kubeletRotateKubeletServerCertificateArgumentSet": {
"values": [
]
},
"kubeletServiceFileOwnership": {
"values": [
"root:root"
]
},
"kubeletServiceFilePermissions": {
"values": [
644
]
},
"kubeletStreamingConnectionIdleTimeoutArgumentSet": {
"values": [
]
},
"kubeletTlsCertFileTlsArgumentSet": {
"values": [
"/etc/kubernetes/pki/apiserver.crt"
]
},
"kubeletTlsPrivateKeyFileArgumentSet": {
"values": [
"/etc/kubernetes/pki/apiserver.key"
]
},
"kubernetesPKICertificateFilePermissions": {
"values": [
644,
644,
644,
644,
644,
644,
644,
644,
644,
644
]
},
"schedulerConfFileOwnership": {
"values": [
"root:root"
]
},
"schedulerConfFilePermissions": {
"values": [
600
]
}
}
}
kubectl delete -f job.yaml
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
不支持 push
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务