本文为 SPIRE 官方文档 plugin_server_nodeattestor_k8s_psat.md 的中文译本,以英文原文为准。 🔗 穿越源码分析:K8S Agent 详解 · k8s_psat
Server 插件:NodeAttestor "k8s_psat"
必须与 Agent 侧 k8s_psat 插件配合使用
k8s_psat 插件用于对运行在 Kubernetes 内部的节点进行认证。server 会校验 agent 提供的、经签名的投射服务账号令牌(projected service account token)。该校验通过 Kubernetes Token Review API 完成。除校验之外,该 API 还会提供其他有用信息(namespace、service account 名称以及 pod 名称),SPIRE server 用它们来构建 selector。此外,还会查询 Kubernetes API server 以获取诸如 node UID 之类的额外数据,用于生成如下格式的 SPIFFE ID:
spiffe://<trust_domain>/spire/agent/k8s_psat/<cluster>/<node UID>server 本身无需运行在 Kubernetes 中即可执行节点认证。实际上,该插件可以配置为对运行在多个集群中的节点进行认证。
主配置接受以下取值:
| Configuration | Description | Default |
|---|---|---|
clusters | 一个集群映射(map),以任意 ID 为键,列出被授权进行认证的集群。 |
WARNING
当 clusters 为空时,没有任何集群被授权进行认证。
主配置中的每个集群都需要以下配置:
| Configuration | Description | Default |
|---|---|---|
service_account_allow_list | 一组带 namespace 限定的 service account 名称(例如 "default:blog" 或 "production:web"),用于允许其进行节点认证。对于绑定了不在允许列表中的 service account 的令牌,认证将被拒绝。 | |
audience | 用于令牌校验的受众(audience)。如果设置为空数组([]),则使用 Kubernetes API server 的受众。 | ["spire-server"] |
kube_config_file | 用于 API Server 认证的 k8s 配置文件路径。如果 SPIRE server 运行在 k8s 集群之外,则必须指定一个 kubernetes 配置文件。如果留空,则假定 SPIRE server 运行在集群内部,并使用集群内(in-cluster)配置。 | "" |
allowed_node_label_keys | 参与构建 selector 的 node 标签键(label key) | |
allowed_pod_label_keys | 参与构建 selector 的 pod 标签键 |
SPIRE server 运行在 Kubernetes 集群内部时的示例配置:
NodeAttestor "k8s_psat" {
plugin_data {
clusters = {
"MyCluster" = {
service_account_allow_list = ["production:spire-agent"]
}
}
}SPIRE server 运行在 Kubernetes 集群外部时的示例配置:
NodeAttestor "k8s_psat" {
plugin_data {
clusters = {
"MyCluster" = {
service_account_allow_list = ["production:spire-agent"]
kube_config_file = "path/to/kubeconfig/file"
}
}
}在 kube config 文件中定义的 Kubernetes 用户需要拥有 ClusterRoleBindings,并绑定到至少包含以下权限的 ClusterRoles:
- apiGroups: [""]
resources: ["pods", "nodes"]
verbs: ["get"]
- apiGroups: ["authentication.k8s.io"]
resources: ["tokenreviews"]
verbs: ["create"]本插件生成以下 selector:
| Selector | Example | Description |
|---|---|---|
k8s_psat:cluster | k8s_psat:cluster:MyCluster | 用于校验令牌签名的集群名称(来自插件配置) |
k8s_psat:agent_ns | k8s_psat:agent_ns:production | agent 运行所在的 namespace |
k8s_psat:agent_sa | k8s_psat:agent_sa:spire-agent | agent 运行所使用的 Service Account |
k8s_psat:agent_pod_name | k8s_psat:agent_pod_name:spire-agent-v5wgr | agent 所在 pod 的名称 |
k8s_psat:agent_pod_uid | k8s_psat:agent_pod_uid:79261129-6b60-11e9-9054-0800277ac80f | agent 所在 pod 的 UID |
k8s_psat:agent_pod_label | k8s_psat:agent_pod_label:key:value | Pod 标签 |
k8s_psat:agent_node_ip | k8s_psat:agent_node_ip:172.16.10.1 | agent 所在节点的 IP 地址 |
k8s_psat:agent_node_name | k8s_psat:agent_node_name:minikube | agent 所在节点的名称 |
k8s_psat:agent_node_uid | k8s_psat:agent_node_uid:5dbb7b21-65fe-11e9-b1b0-0800277ac80f | agent 所在节点的 UID |
k8s_psat:agent_node_label | k8s_psat:agent_node_label:key:value | Node 标签 |
只有在 allowed_node_label_keys 和 allowed_pod_label_keys 配置项中列出的标签键,才会生成对应的 node 和 pod selector。
该认证器的完整示例见 SPIRE examples 仓库。