Hashicorp Vault

HashiCorp Vault āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļˆāļąāļ”āļāļēāļĢāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāđāļĨāļ°āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļģāļ„āļąāļāđƒāļ™āļĢāļ°āļšāļšāđ„āļ­āļ—āļĩ āļĄāļąāļ™āļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļēāđ€āļžāļ·āđˆāļ­āļˆāļąāļ”āđ€āļāđ‡āļš āļˆāļąāļ”āļāļēāļĢ āđāļĨāļ°āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļąāļšāļ•āđˆāļēāļ‡ āđ† āđ€āļŠāđˆāļ™ āļĢāļŦāļąāļŠāļœāđˆāļēāļ™ āļ„āļĩāļĒāđŒ API āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāļĨāļąāļšāļ­āļ·āđˆāļ™ āđ† āđ‚āļ”āļĒāļĄāļĩāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āļąāļ‡āļ™āļĩāđ‰

  1. āļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļąāļš (Secrets Management): Vault āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļąāļšāļ•āđˆāļēāļ‡ āđ† āđƒāļ™āļ—āļĩāđˆāđ€āļ”āļĩāļĒāļ§ āđāļĨāļ°āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ­āļĒāđˆāļēāļ‡āđ€āļ‚āđ‰āļĄāļ‡āļ§āļ” āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ•āļēāļĄāļšāļ—āļšāļēāļ—āļŦāļĢāļ·āļ­āļāļēāļĢāļāļģāļŦāļ™āļ”āļ™āđ‚āļĒāļšāļēāļĒāđ€āļ‰āļžāļēāļ°

  2. Dynamic Secrets: Vault āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļąāļšāđāļšāļšāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāļ āļēāļĒāļ™āļ­āļ āđ€āļŠāđˆāļ™ āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āļšāļĢāļīāļāļēāļĢāļ­āļ·āđˆāļ™ āđ† āļ‹āļķāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļąāļšāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđƒāļŦāļĄāđˆāđƒāļ™āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­ āđāļĨāļ°āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđ€āļĄāļ·āđˆāļ­āđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™

  3. Encryption as a Service: Vault āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ API āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠāđāļĨāļ°āļ–āļ­āļ”āļĢāļŦāļąāļŠāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡ āđ† āđ‚āļ”āļĒāļ—āļĩāđˆāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļŦāļĢāļ·āļ­āļĢāļ°āļšāļšāļ•āđˆāļēāļ‡ āđ† āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ„āļĩāļĒāđŒāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠāđ€āļ­āļ‡

  4. āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒ (Access Control): Vault āļĄāļĩāļĢāļ°āļšāļšāļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĩāđˆāļĨāļ°āđ€āļ­āļĩāļĒāļ” āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ‰āļžāļēāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āļēāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ­āļ™āļļāļāļēāļ• āļ‹āļķāđˆāļ‡āļĨāļ”āļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ‡āļˆāļēāļāļāļēāļĢāđ€āļ›āļīāļ”āđ€āļœāļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™

  5. Audit Logging: Vault āļĄāļĩāļāļēāļĢāļšāļąāļ™āļ—āļķāļāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļąāļšāļ•āđˆāļēāļ‡ āđ† āļ—āļģāđƒāļŦāđ‰āļĄāļĩāļ„āļ§āļēāļĄāđ‚āļ›āļĢāđˆāļ‡āđƒāļŠāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļēāļĄāļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļĒāđ‰āļ­āļ™āļŦāļĨāļąāļ‡āđ„āļ”āđ‰

Consul āļ„āļ·āļ­āļ­āļ°āđ„āļĢ

Consul āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ service discovery āđāļĨāļ° distributed key-value store āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŠāđˆāļ™ āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ āļēāļ§āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđāļšāļšāļāļĢāļ°āļˆāļēāļĒāļ•āļąāļ§ (distributed systems) āđ‚āļ”āļĒ Consul āļĄāļĩāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļŦāļĨāļąāļ āđ† āļ”āļąāļ‡āļ™āļĩāđ‰

  1. High Availability: āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđƒāļ™āđ‚āļŦāļĄāļ”āļāļĢāļ°āļˆāļēāļĒāļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļŦāļĨāļēāļĒāđ‚āļŦāļ™āļ” (nodes) āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļ—āļ™āļ—āļēāļ™āļ•āđˆāļ­āļāļēāļĢāļĨāđ‰āļĄāđ€āļŦāļĨāļ§

  2. Replication: Consul āļˆāļ°āļ—āļģāļāļēāļĢ replicates āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļŦāļ™āļ”āļŦāļĨāļēāļĒāđ‚āļŦāļ™āļ” āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļ—āļ™āļ—āļēāļ™āļ•āđˆāļ­āļāļēāļĢāļŠāļđāļāđ€āļŠāļĩāļĒāļ‚āđ‰āļ­āļĄāļđāļĨ

  3. Service Discovery: āļĄāļĩāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļšāļĢāļīāļāļēāļĢāđāļĨāļ°āļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļŠāļļāļ‚āļ āļēāļž (health checking) āļ‚āļ­āļ‡āļšāļĢāļīāļāļēāļĢāđƒāļ™āļĢāļ°āļšāļš

āļāļēāļĢāđƒāļŠāđ‰ Consul āđ€āļ›āđ‡āļ™ backend āļŠāļģāļŦāļĢāļąāļš HashiCorp Vault āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļŦāđ‰ Vault āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāļģāļ„āļąāļāđāļĨāļ°āļĄāļĩāļ„āļ§āļēāļĄāļ—āļ™āļ—āļēāļ™āđƒāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ‚āļ”āļĒ Consul āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Storage Backend āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡ āđ† āļ—āļĩāđˆ Vault āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļāđ‡āļš āđ€āļŠāđˆāļ™ Secret, Tokens, āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļ­āļ·āđˆāļ™ āđ† āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē Consul āđ€āļ›āđ‡āļ™ backend āļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāđƒāļ™āļ”āđ‰āļēāļ™āļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļšāļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāđāļĨāļ°āļāļēāļĢāļāļĢāļ°āļˆāļēāļĒāđ‚āļŦāļĨāļ”āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Vault āđƒāļ™ production environment

āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Hashicorp Vault

āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Consul

āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰ āļˆāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡ consul āļšāļ™ Kubernetes cluster āļœāđˆāļēāļ™ Helm Chart āļ‚āļ­āļ‡ Hashicorp

Architecture

āļ•āļēāļĄ recommend āļ‚āļ­āļ‡ Hashicorp āļāļģāļŦāļ™āļ”āļ§āđˆāļē consul server āļ„āļ§āļĢāļĄāļĩāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 5 node āđāļĨāļ°āļāļĢāļ°āļˆāļēāļĒāļāļąāļ™āļ­āļĒāļđāđˆāđƒāļ™ 3 AZ āđāļ•āđˆāđ‚āļ”āļĒāļŠāđˆāļ§āļ™āļĄāļēāļāļŠāļģāļŦāļĢāļąāļš small production site āđƒāļŠāđ‰ 3 node āļāđ‡āđ€āļžāļĩāļĒāļ‡āļžāļ­ āđ€āļŠāđˆāļ™āļāļąāļ™

consul for production

Hardware Requirement

Size
CPU
Memory
Disk Capacity
Disk IO
Disk Throughput

Small

2-4 core

8-16 GB

100+ GB

3000+ IOPS

75+ MB/s

Large

8-16 core

32-64 GB

200+ GB

7500+ IOPS

250+ MB/s

Network Latency Requirement

round trip time (RTT) āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡ agent āļ•āđ‰āļ­āļ‡āđ„āļĄāđˆāđ€āļāļīāļ™ āļ”āļąāļ‡āļ™āļĩāđ‰

  • RTT āļ‚āļ­āļ‡āļ—āļļāļ traffic āđ‚āļ”āļĒāđ€āļ‰āļĨāļĩāđˆāļĒ āļ•āđ‰āļ­āļ‡āđ„āļĄāđˆāđ€āļāļīāļ™ 50ms

  • RTT āļ—āļĩāđˆ percentile 99 āļ•āđ‰āļ­āļ‡āđ„āļĄāđˆāđ€āļāļīāļ™ 100ms

Firewall rule

Name
Port / Protocol
Source
Destination
Description

RPC

8300 / TCP

All agents (client & server)

Server agents

Used by servers to handle incoming requests from other agents.

Serf LAN

8301 / TCP & UDP

All agents (client & server)

All agents (client & server)

Used to handle gossip in the LAN. Required by all agents.

Serf WAN

8302 / TCP & UDP

Server agents

Server agents

Used by server agents to gossip over the WAN to other server agents. Only used in multi-cluster environments.

HTTP/HTTPS

8500 & 8501 TCP

Localhost of client or server agent

Localhost of client or server agent

Used by clients to talk to the HTTP API. HTTPS is disabled by default.

DNS

8600 TCP & UDP

Localhost of client or server agent

Localhost of client or server agent

Used to resolve DNS queries.

gRPC (Optional)

8502 TCP

Envoy proxy

Client agent or server agent that manages the sidecar proxies service registration

Used to expose the xDS API to Envoy proxies. Disabled by default.

Sidecar Proxy (Optional)

21000 - 21255 TCP

All agents (client & server)

Client agent or server agent that manages the sidecar proxies service registration

Port range used for automatically assigned sidecar service registrations.

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ value file

āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ consul.values.yaml

global:
  name: consul
  datacenter: dc1
  gossipEncryption:
    autoGenerate: true
server:
  replicas: 3
  storage: 10Gi
  resources:
    requests:
      memory: '1Gi'
      cpu: '1'
    limits:
      memory: '1Gi'
      cpu: null # override existing cpu limit value
  topologySpreadConstraints: |
    - maxSkew: 1
      topologyKey: topology.kubernetes.io/zone
      whenUnsatisfiable: DoNotSchedule
      labelSelector:
        matchLabels:
          app: {{ template "consul.name" . }}
          release: "{{ .Release.Name }}"
          component: server
client:
  enabled: true
  resources:
    requests:
      memory: '512Mi'
      cpu: '500m'
    limits:
      memory: '512Mi'
      cpu: null # override existing cpu limit value
ui:
  enabled: true
  service:
    type: ClusterIP

āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰

helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
helm upgrade --install consul hashicorp/consul --values consul.values.yaml --create-namespace --namespace vault

āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Vault

āđ€āļ•āļĢāļĩāļĒāļĄ YAML file āļŠāļ·āđˆāļ­ vault.values.yaml āļ”āļąāļ‡āļ™āļĩāđ‰

server:
  ha:
    enabled: true
    replicas: 3
  auditStorage:
    enabled: true
    size: 10Gi
  resources:
    requests:
      memory: "1Gi"
      cpu: "250m"
    limits:
      memory: "1Gi"
  topologySpreadConstraints: |
    - maxSkew: 1
      topologyKey: topology.kubernetes.io/zone
      whenUnsatisfiable: DoNotSchedule
      labelSelector:
        matchLabels:
          app.kubernetes.io/name: {{ include "vault.name" . }}
          app.kubernetes.io/instance: {{ .Release.Name }}
          component: server
ui:
  enabled: true

āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰

helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
helm upgrade --install vault hashicorp/vault --values vault.values.yaml --create-namespace --namespace vault

āļŦāļĨāļąāļ‡āļˆāļēāļāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļŠāļĢāđ‡āļˆ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ° vault

kubectl exec vault-0 -n vault -- vault status

āļˆāļ°āļ‚āļķāđ‰āļ™āļœāļĨāļĨāļąāļžāļ˜āđŒāļ§āđˆāļēāļ–āļđāļ seal āđ„āļ§āđ‰āļ­āļĒāļđāđˆ

Key                Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true
Total Shares       0
Threshold          0
Unseal Progress    0/0
Unseal Nonce       n/a
Version            1.17.2
Build Date         2024-07-05T15:19:12Z
Storage Type       consul
HA Enabled         true

āđƒāļŠāđ‰ command āļ”āļąāļ‡āļ™āļĩāđ‰āđ€āļžāļ·āđˆāļ­ generate root key āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ bootstrap cluster āļ„āļĢāļąāđ‰āļ‡āđāļĢāļāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™

kubectl exec vault-0 -n vault -- vault operator init -key-shares=1 -key-threshold=1 -format=json > cluster-keys.json

āļ—āļģāļāļēāļĢ unseal vault server

VAULT_UNSEAL_KEY=$(cat cluster-keys.json | jq -r ".unseal_keys_b64[]")
kubectl exec vault-0 -n vault -- vault operator unseal $VAULT_UNSEAL_KEY

āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ™āļĩāđ‰

Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    1
Threshold       1
Version         1.17.2
Build Date      2024-07-05T15:19:12Z
Storage Type    consul
Cluster Name    vault-cluster-7e64d0dc
Cluster ID      05f0b39c-2def-5ce6-5597-71863db4864e
HA Enabled      true
HA Cluster      https://vault-0.vault-internal:8201
HA Mode         active
Active Since    2024-10-11T10:15:00.540042962Z

āļ—āļģ port-forward āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāđƒāļŠāđ‰āļ‡āļēāļ™ Vault

kubectl port-forward svc/vault-ui -n vault 8200:8200

āđ€āļ‚āđ‰āļē web browser āļœāđˆāļēāļ™ http://localhost:8200

āļ—āļ”āļŠāļ­āļš login āļœāđˆāļēāļ™ UI āļ”āđ‰āļ§āļĒ token āļ‚āļ­āļ‡ root

root token āđ„āļ”āđ‰āļĄāļēāļˆāļēāļāļ•āļ­āļ™ bootstrap cluster āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ vault operator init

āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļŦāļēāđ„āļ”āđ‰āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡

cat cluster-keys.json |jq '.root_token'

Last updated

Was this helpful?