Kubernetes 服务注册
Kubernetes 服务注册将 Vault pod 的当前状态更新到它们的 tag 上以便 selector 可以用来筛选。Vault 只有以高可用模式运行时才可以使用服务注册。
- HashiCorp 官方支持 —— Kubernetes 服务注册由 HashiCorp 提供官方支持。
配置
service_registration "kubernetes" {
namespace = "my-namespace"
pod_name = "my-pod-name"
}
另外,namespace 和 pod name 也可以通过环境变量设置:
VAULT_K8S_NAMESPACE
VAULT_K8S_POD_NAME
我们可以该机制通过 Downward API 设置这些参数。
如果只使用环境变量,那么仍然需要声明服务注册配置节以表明我们的意图:
service_registration "kubernetes" {}
要成功使用服务注册,Vault 必须能够在 Kubernetes 中相关 Pod 上应用标签(label)。Vault pod 需要以下 RBAC 规则来获取更新自身定义(specification)的 service account 权限:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: mynamespace
name: vault-service-account
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "update"]
例子
经过正确配置后,启用服务注册会导致 Kubernetes 的 pod 被应用以下标签:
apiVersion: v1
kind: Pod
metadata:
name: vault
labels:
vault-active: "false"
vault-initialized: "true"
vault-perf-standby: "false"
vault-sealed: "false"
vault-version: 1.3.0
集群关闭后,Vault 的 pod 会被打上以下标签:
apiVersion: v1
kind: Pod
metadata:
name: vault
labels:
vault-active: "false"
vault-initialized: "false"
vault-perf-standby: "false"
vault-sealed: "true"
vault-version: 1.3.0
标签定义
vault-active
(string: "true"/"false")
– 该标签状态在 Vault 集群主从关系发生变化时会动态更新。true
代表该 pod 为集群领导者。false
代表该 pod 当前为从节点。vault-initialized
(string: "true"/"false")
– 该标签状态在 Vault 的初始化状态发生变化时会动态更新。true
代表 Vault 已经初始化。false
代表 Vault 目前未经初始化。vault-perf-standby
(string: "true"/"false")
– 该标签状态在 Vault 的性能备用集群的 领导者/从节点 状态发生变化时会动态更新。该标签只有在 pod 是一个性能备用集群成员时才有意义,否则它将被设置为fasle
。true
代表该 pod 目前是性能备用集群从节点。false
代表该 pod 目前是性能备用集群主节点。vault-sealed
(string: "true"/"false")
– 该标签状态在 Vault 的封印状态发生变化时会动态更新。true
代表 Vault 目前处于封印状态。false
代表 Vault 已经解封。vault-version
(string: "1.3.0")
– 该标签显示了 Vault 版本,在 pod 的生命周期内不会变化。
使用 Vault 的服务发现标签
服务的例子
通过将标签应用于 pod,创建服务时可以使用选择器来过滤具有特定 Vault 高可用角色的 pod,从而使得可以通过服务与 Vault pod 的子集进行直接通信。注意下面例子中的 vault-active: "true"
:
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/instance: vault
app.kubernetes.io/name: vault
helm.sh/chart: vault-0.1.2
name: vault-active-us-east
namespace: default
spec:
clusterIP: 10.7.254.51
ports:
- name: http
port: 8200
protocol: TCP
targetPort: 8200
- name: internal
port: 8201
protocol: TCP
targetPort: 8201
publishNotReadyAddresses: false
selector:
app.kubernetes.io/instance: vault
app.kubernetes.io/name: vault
component: server
vault-active: "true"
type: ClusterIP
同样,通过设置 publishNotReadyAddresses: false
,宕机的 pod 会被从服务中移除。
通过设置指向主节点的服务,我们始终可以通过特定端点访问到集群主节点。在设置 Vault 复制时,这将会是一个非常有用的主地址:
$ vault write -f sys/replication/performance/primary/enable \
primary_cluster_addr='https://vault-active-us-east:8201'
更新的例子
结合 pod 标签以及 OnDelete
更新策略,更新将变得更加容易编排:
$ helm upgrade vault --set='server.image.tag=1.4.0'
$ kubectl delete pod --selector=vault-active=false \
--selector=vault-version=1.2.3
$ kubectl delete pod --selector=vault-active=true \
--selector=vault-version=1.2.3
删除特定 pod 实例时,定义了集群所需状态的 Statefulset
将使用最新镜像重新调度已删除的 Pod。