Skip to content

本文为 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:

xml
spiffe://<trust_domain>/spire/agent/k8s_psat/<cluster>/<node UID>

server 本身无需运行在 Kubernetes 中即可执行节点认证。实际上,该插件可以配置为对运行在多个集群中的节点进行认证。

主配置接受以下取值:

ConfigurationDescriptionDefault
clusters一个集群映射(map),以任意 ID 为键,列出被授权进行认证的集群。

WARNING

clusters 为空时,没有任何集群被授权进行认证。

主配置中的每个集群都需要以下配置:

ConfigurationDescriptionDefault
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 集群内部时的示例配置:

hcl
    NodeAttestor "k8s_psat" {
        plugin_data {
            clusters = {
                "MyCluster" = {
                    service_account_allow_list = ["production:spire-agent"]
                }
        }
    }

SPIRE server 运行在 Kubernetes 集群外部时的示例配置:

hcl
    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:

yaml
- apiGroups: [""]
  resources: ["pods", "nodes"]
  verbs: ["get"]
- apiGroups: ["authentication.k8s.io"]
  resources: ["tokenreviews"]
  verbs: ["create"]

本插件生成以下 selector:

SelectorExampleDescription
k8s_psat:clusterk8s_psat:cluster:MyCluster用于校验令牌签名的集群名称(来自插件配置)
k8s_psat:agent_nsk8s_psat:agent_ns:productionagent 运行所在的 namespace
k8s_psat:agent_sak8s_psat:agent_sa:spire-agentagent 运行所使用的 Service Account
k8s_psat:agent_pod_namek8s_psat:agent_pod_name:spire-agent-v5wgragent 所在 pod 的名称
k8s_psat:agent_pod_uidk8s_psat:agent_pod_uid:79261129-6b60-11e9-9054-0800277ac80fagent 所在 pod 的 UID
k8s_psat:agent_pod_labelk8s_psat:agent_pod_label:key:valuePod 标签
k8s_psat:agent_node_ipk8s_psat:agent_node_ip:172.16.10.1agent 所在节点的 IP 地址
k8s_psat:agent_node_namek8s_psat:agent_node_name:minikubeagent 所在节点的名称
k8s_psat:agent_node_uidk8s_psat:agent_node_uid:5dbb7b21-65fe-11e9-b1b0-0800277ac80fagent 所在节点的 UID
k8s_psat:agent_node_labelk8s_psat:agent_node_label:key:valueNode 标签

只有在 allowed_node_label_keysallowed_pod_label_keys 配置项中列出的标签键,才会生成对应的 node 和 pod selector。

该认证器的完整示例见 SPIRE examples 仓库