业务需求要将vault集群部署在consul上,所以consul也是集群模式的

一、Consul部署

1.1、准备vaules文件

consul-values.yaml

global:
  name: consul

datacenter: dc1

ui:
  enabled: true
  service:
    type: ClusterIP

server:
  replicas: 3
  bootstrapExpect: 3
  disruptionBudget:
    enabled: true
    maxUnavailable: 0


client:
  enabled: true

connectInject:
  enabled: true

controller:
  enabled: true

修改默认存储大小

# 默认pvc是10Gi,如果需要修改,在server字段下增加,修改存储类型和大小必须重新安装
  dataStorage:
    enabled: true
    size: 20Gi

使用EFS存储

server:
  dataStorage:
    enabled: true
    size: 50Gi
    storageClass: "efs-sc"

Consul参数解释

参数 (Parameter)设置 (Setting)解释 (Description)
global.nameconsul设置 Consul 部署的全局名称。
datacenterdc1指定 Consul 所在的数据中心名称。
ui.enabledtrue是否启用 Consul 的 Web 用户界面。
ui.service.typeClusterIP指定 UI 服务的 Kubernetes 服务类型。ClusterIP 表示只能在集群内部访问。
server.replicas3设置 Consul 服务器节点的副本数。
server.bootstrapExpect3配置启动时期望的服务器节点数,用于集群的初始选举。
server.disruptionBudget.enabledtrue是否启用 Pod Disruption Budget 以管理维护和故障时的 Pod 可用性。
server.disruptionBudget.maxUnavailable0在维护期间或故障时,最多有多少个服务器 Pod 可以不可用。
client.enabledtrue是否启用 Consul 客户端节点。
connectInject.enabledtrue是否启用 Consul Connect 的自动注入功能。
controller.enabledtrue是否启用 Consul 控制器组件,用于服务同步等功能。

1.2、helm添加HashiCorp仓库

helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update

1.3、 安装 Consul

因为没有指定存储类型,会部署在EKS的gp2/3 storageclass

helm install consul hashicorp/consul -f consul-values.yaml --namespace consul --create-namespace

二、vault部署

2.1、准备values文件

custom-values.yaml

server:
  dataStorage:
    enabled: true
  ha:
    enabled: true
    replicas: 3
    raft:
      enabled: false
  config: |
    ui = true

    listener "tcp" {
      address     = "[::]:8200"
      tls_disable = 1
    }

    storage "consul" {
      address = "consul-server.consul:8500"
      path    = "vault/"
    }
ui:
  enabled: true

Vault 配置参数解释

参数 (Parameter)设置 (Setting)解释 (Description)
server.dataStorage.enabledtrue启用或禁用服务器的数据存储。
server.ha.enabledtrue启用或禁用高可用性 (HA) 配置。
server.ha.replicas3设置高可用性模式下的副本数。
server.ha.raft.enabledfalse启用或禁用 Raft 协议用于高可用性的状态复制。
server.config-详细的服务器配置,配置为多行字符串。包括 UI, 监听器和存储配置。
ui.enabledtrue启用或禁用 Vault 的用户界面。
listener“tcp”
listener.address“[::]:8200”监听所有 IPv6 地址的 8200 端口,vault服务端口。
listener.tls_disable1禁用 TLS,不使用 SSL/TLS 加密通信。
storage.consul配置使用 Consul 作为存储后端。
storage. address“consul-server.consul:8500”设置 Consul 服务的地址和端口,用于数据存储。
storage.path“vault/”在 Consul 存储中为 Vault 数据指定的基础路径。

2.2、安装vault

上面已经添加了hashicorp的仓库

helm install vault hashicorp/vault -f custom-values.yaml --namespace=vault

consul做为后端时不需要像raft一样加入集群,只需要每个节点解禁

2.3、使用Raft协议实现高可用

helm install vault hashicorp/vault   --set='server.ha.enabled=true'   --set='server.ha.raft.enabled=true' --set='config.ui=true' -n vault

其他两个节点需要解禁后加入集群

kubectl exec -ti vault-1  -n vault -- vault operator raft join http://vault-0.vault-internal:8200 
kubectl exec -ti vault-1 -n vault -- vault operator unseal 
需要输入三个key

三、创建ingress资源暴露UI

新版本的ingress-nginx指定ClassName需要在spec下,之前是annotions
这里如果没有ui服务就使用consul-server

3.1、创建consul ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: vault-consul-ui
  namespace: consul
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: $domain
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: consul-ui
            port:
              number: 80

3.2、创建vault ingress

vault的ingress创建以后还不能使用,需要初始化集群

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: vault-ui
  namespace: vault
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: $domain
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: vault-ui
            port:
              number: 80

更多推荐