spire-k8s-workload-registar
weight: 49
title: SPIRE Kubernetes 工作负载注册器
date: “2022-06-08T16:00:00+08:00”
type: book
summary: 本文介绍了如何在Kubernetes 中使用SPIRE 工作负载注册器,包括工作负载注册器部署的方式,注册模式等。
ValidatingAdmissionWebhook
,便于在
配置
命令行配置
注册器有以下命令行选项:
标志 | 描述 | 默认值 |
---|---|---|
-config |
磁盘上 |
k8s-workload-registrar.conf |
HCL 配置
配置文件是注册器所必需的。它包含 HCL 编码的配置项。
键 | 类型 | 必需的? | 描述 | 默认 |
---|---|---|---|---|
log_level |
string | 必需的 | 日志级别(panic 、 fatal 、 error 、 warn 、 warning 、 info 、 debug 、trace 之一) |
info |
log_path |
string | 可选的 | 写入日志的磁盘路径 | |
trust_domain |
string | 必需的 | ||
agent_socket_path |
string | 可选的 | server_address 不是 |
|
server_address |
string | 必需的 | unix:///path/to/socket 指定本地套接字。这与代理套接字不同。 |
|
server_socket_path |
string | 可选的 | unix:// 前缀的 server_address |
|
cluster |
string | 必需的 | 用于在其下注册节点 |
|
pod_label |
string | 可选的 | ||
pod_annotation |
string | 可选的 | ||
mode |
string | 可选的 | 如何使用 webhook 、 reconcile 或运行注册器 crd 。 |
webhook |
disabled_namespaces |
[]string | 可选的 | 逗号分隔的命名空间列表,用于禁用自动 |
kube-system 、 kube-public |
以下配置指令是针对 webhook
模式的:
键 | 类型 | 必需的? | 描述 | 默认 |
---|---|---|---|---|
addr |
string | 必需的 | 将 |
:8443 |
cert_path |
string | 必需的 | cert.pem |
|
key_path |
string | 必需的 | key.pem |
|
cacert_path |
string | 必需的 | 用于验证客户端(即 |
cacert.pem |
insecure_skip_client_verification |
boolean | 必需的 | 如果为cacert_path 被忽略 |
false |
以下配置是针对 reconcile
模式的:
键 | 类型 | 必需的? | 描述 | 默认 |
---|---|---|---|---|
leader_election |
bool | 可选的 | 启用 |
false |
leader_election_resource_lock |
string | 可选的 | 配置用于领导选举锁的资源类型 | configmaps |
metrics_addr |
string | 可选的 | 公开指标的地址,0 用于禁用 |
:8080 |
controller_name |
string | 可选的 | 构成用于父 |
spire-k8s-registrar |
add_pod_dns_names |
bool | 可选的 | 启用 |
错误的 |
cluster_dns_zone |
string | 可选的 | cluster.local |
关于
示例
log_level = "debug"
trust_domain = "domain.test"
server_socket_path = "/tmp/spire-server/private/api.sock"
cluster = "production"
工作负载注册
当在pod_controller=true
的条目将被自动创建为
注册模式 | pod_label | pod_annotation | identity_template | 基于服务账户 |
---|---|---|---|---|
webhook |
由 |
由 |
不可用 | 服务账户 |
reconcile |
由 |
由 |
不可用 | 服务账户 |
crd |
由 |
由 |
由 |
不可用 |
如果对 基于服务账户的webhook
使用和 reconcile
模式,请不要指定 pod_label
或 pod_annotation
。如果你使用基于标签的pod_label
。如果你使用基于注解的pod_annotation
对于 crd
模式,如果既不选择 pod_label
也不选择 pod_annotation
工作负载注册模式, identity_template
则作为默认配置: ns/{{.Pod.Namespace}}/sa/{{.Pod.ServiceAccount}}
新创建的
联合条目注册
spiffe.io/federatesWith
可用于创建与其他信任域联合的
要指定多个信任域,请用逗号分隔它们。
例子:
apiVersion: v1
kind: Pod
metadata:
annotations:
spiffe.io/federatesWith: example.com,example.io,example.ai
name: test
spec:
containers:
...
基于服务账户的工作负载注册
授予工作负载的
- 服务账户
- 可配置的
pod 标签 - 可配置的
pod 注解
服务账户派生的工作负载注册将服务账户映射到表单的spiffe://<TRUSTDOMAIN>/ns/<NAMESPACE>/sa/<SERVICEACCOUNT>
。例如,如果一个blog
进入 production
,则将创建以下注册条目:
Entry ID : 200d8b19-8334-443d-9494-f65d0ad64eb5
SPIFFE ID : spiffe://example.org/ns/production/sa/blog
Parent ID : ...
TTL : default
Selector : k8s:ns:production
Selector : k8s:pod-name:example-workload-98b6b79fd-jnv5m
基于标签的工作负载注册
基于标签的工作负载注册将spiffe://<TRUSTDOMAIN>/<LABELVALUE>
。例如,如果注册器配置了 spire-workload
标签,并且spire-workload=example-workload
,则将创建以下注册条目:
Entry ID : 200d8b19-8334-443d-9494-f65d0ad64eb5
SPIFFE ID : spiffe://example.org/example-workload
Parent ID : ...
TTL : default
Selector : k8s:ns:production
Selector : k8s:pod-name:example-workload-98b6b79fd-jnv5m
不包含
基于注解的工作负载注册
基于注解的工作负载注册将spiffe://<TRUSTDOMAIN>/<ANNOTATIONVALUE>
。通过使用该模式,可以自由设置spiffe.io/spiffe-id
注解并且spiffe.io/spiffe-id: production/example-workload
,则将创建以下注册条目:
Entry ID : 200d8b19-8334-443d-9494-f65d0ad64eb5
SPIFFE ID : spiffe://example.org/production/example-workload
Parent ID : ...
TTL : default
Selector : k8s:ns:production
Selector : k8s:pod-name:example-workload-98b6b79fd-jnv5m
不包含
基于身份模板的工作负载注册
这是特定于 crd
模式的。请参阅 crd
模式文档中的基于身份模板的工作负载注册。
部署
注册器既可以作为独立
如果它被部署为
协调模式配置
要使用协调模式(Reconcile Mode
CRD 模式配置
请参阅
Webhook 模式配置
注册器将需要访问其服务器密钥对和用于验证客户端的
设置验证准入控制器需要以下
Service
指向spire-server 容器中的注册端口ValidatingWebhookConfiguration
将注册器配置为验证准入控制器
此外,除非你禁用客户端身份验证insecure_skip_client_verification
Config
注册器服务客户端的用户条目包含API 服务器应用于向注册器进行身份验证的客户端证书/ 密钥。AdmissionConfiguration
描述API 服务器可以在哪里找到包含Config
。该文件通过--admission-control-config-file
标志传递给API 服务器。
Webhook 模式安全注意事项
注册器默认对客户端进行身份验证。这是注册器整体安全性的一个非常重要的方面,因为注册器可用于提供对insecure_skip_client_verification
配置
从webhook 迁移
需要移除ValidatingWebhookConfiguration
,否则
kubectl validatingwebhookconfiguration delete k8s-workload-registrar-webhook
DNS 名称
reconcile
和 crd
模式都提供了将reconcile
添加可用于访问crd
模式限制为 <service>.<namespace>.svc
。该功能默认为关闭 reconcile
模式和打开 crd
模式。
注意
模式之间的差异
webhook
模式使用验证准入
StatefulSet 的add 和delete 之间的竞争条件会经常导致StatefulSet 没有条目;Webhook 的不可用要么必须完全阻止准入,要么你最终会得到没有条目的pod ;SPIRE 服务器错误必须完全阻止准入,否则你最终会得到没有条目的pod ;- 当
webhook/spire-server
不可用时,它不会清理删除的pod 的遗留条目; - 条目不是单个节点的父节点,所有
SVID 都被泛洪到集群中的所有代理,这严重限制了可扩展性。因此,强烈建议不要使用webhook
模式,但出于向后兼容的原因,它仍然是默认设置。
reconcile
模式和 crd
模式都使用协调控制器而不是reconcile
模式和启用了 pod_controller
的 crd
模式具有与reconcile
创建新条目可能比 crd
模式稍快,并且需要较少的配置。
crd
模式还提供了一个命名空间的crd
模式的
平台支持
该工具仅支持