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 是一个性能备用集群成员时才有意义,否则它将被设置为 fasletrue 代表该 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。

results matching ""

    No results matching ""