Stand up vault

This commit is contained in:
Astra Logical 2026-04-07 13:14:18 -04:00
parent b696349b02
commit 8638f906cf
5 changed files with 91 additions and 14 deletions

View file

@ -13,6 +13,7 @@ spec:
labels: labels:
app: vault-keykeeper app: vault-keykeeper
spec: spec:
serviceAccountName: vault # Allows k8s auth for autounsealing
nodeSelector: nodeSelector:
app: keykeeper # Should be Robin/some non-server node with a /keykeeper local dir app: keykeeper # Should be Robin/some non-server node with a /keykeeper local dir
containers: containers:
@ -22,6 +23,7 @@ spec:
env: env:
- name: VAULT_LOCAL_CONFIG - name: VAULT_LOCAL_CONFIG
value: | value: |
ui = true
storage "file" { storage "file" {
path = "/vault/file" path = "/vault/file"
} }
@ -31,13 +33,11 @@ spec:
} }
disable_mlock = true disable_mlock = true
- name: VAULT_API_ADDR - name: VAULT_API_ADDR
value: "http://$(HOSTNAME).vault-internal:8200" value: "http://vault-keykeeper.vault.svc.cluster.local:8200"
- name: SKIP_SETCAP - name: SKIP_SETCAP
value: "true" value: "true"
- name: VAULT_ADDR - name: VAULT_ADDR
value: "http://127.0.0.1:8200" value: "http://127.0.0.1:8200"
- name: VAULT_CLUSTER_ADDR
value: "http://$(HOSTNAME).vault-internal:8201"
- name: VAULT_K8S_NAMESPACE - name: VAULT_K8S_NAMESPACE
valueFrom: valueFrom:
fieldRef: fieldRef:
@ -48,7 +48,7 @@ spec:
fieldPath: metadata.name fieldPath: metadata.name
ports: ports:
- containerPort: 8200 - containerPort: 8200
name: vault-ui name: web-ui
volumeMounts: volumeMounts:
- name: vault-data - name: vault-data
mountPath: /vault/file mountPath: /vault/file

View file

@ -7,7 +7,7 @@ spec:
type: ClusterIP type: ClusterIP
ports: ports:
- name: http-web - name: http-web
port: 8200 port: 80
targetPort: vault-ui targetPort: web-ui
selector: selector:
app: vault-keykeeper app: vault-keykeeper

View file

@ -17,14 +17,23 @@ data:
storage "raft" { storage "raft" {
path = "/vault/data" path = "/vault/data"
retry_join { retry_join {
leader_api_addr = "http://vault-0.vault-internal:8200" leader_api_addr = "http://vault-0.vault-internal.vault.svc.cluster.local:8200"
} }
retry_join { retry_join {
leader_api_addr = "http://vault-1.vault-internal:8200" leader_api_addr = "http://vault-1.vault-internal.vault.svc.cluster.local:8200"
} }
retry_join { retry_join {
leader_api_addr = "http://vault-2.vault-internal:8200" leader_api_addr = "http://vault-2.vault-internal.vault.svc.cluster.local:8200"
} }
} }
service_registration "kubernetes" {} service_registration "kubernetes" {}
seal "transit" {
# Use the internal K8s service name for the Keykeeper
address = "http://vault-keykeeper.vault.svc.cluster.local:80"
disable_renewal = false
key_name = "nest-unseal-key"
mount_path = "transit/"
token = "REPLACE_WITH_TOKEN"
}

View file

@ -21,3 +21,27 @@ subjects:
- kind: ServiceAccount - kind: ServiceAccount
name: vault name: vault
namespace: vault namespace: vault
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: vault-service-registration
namespace: vault
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: vault-service-registration-binding
namespace: vault
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: vault-service-registration
subjects:
- kind: ServiceAccount
name: vault
namespace: vault

View file

@ -14,7 +14,7 @@ spec:
labels: labels:
app.kubernetes.io/name: vault app.kubernetes.io/name: vault
spec: spec:
serviceAccountName: vault serviceAccountName: vault # Allows k8s auth for autounsealing
terminationGracePeriodSeconds: 10 terminationGracePeriodSeconds: 10
# Force pods onto different physical server nodes # Force pods onto different physical server nodes
affinity: affinity:
@ -40,21 +40,46 @@ spec:
securityContext: securityContext:
runAsUser: 0 runAsUser: 0
privileged: true privileged: true
- name: fetch-transit-token
image: hashicorp/vault:latest
command: ["sh", "-c"]
args:
- |
K8S_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
TRANSIT_TOKEN=$(vault write -field=token auth/kubernetes/login \
role=vault-unsealer \
jwt=$K8S_TOKEN \
address=http://vault-keykeeper.vault.svc.cluster.local:80)
sed "s/REPLACE_WITH_TOKEN/$TRANSIT_TOKEN/" /etc/vault/extraconfig-from-values.hcl > /vault/runtime/vault.hcl
env:
- name: VAULT_ADDR
value: "http://vault-keykeeper.vault.svc.cluster.local:80"
volumeMounts:
- name: config
mountPath: /etc/vault
- name: config-runtime
mountPath: /vault/runtime
containers: containers:
- name: vault - name: vault
image: hashicorp/vault:latest image: hashicorp/vault:latest
args: ["server", "-config=/etc/vault/extraconfig-from-values.hcl"] args: ["server", "-config=/vault/runtime/vault.hcl"]
securityContext: securityContext:
allowPrivilegeEscalation: false allowPrivilegeEscalation: false
env: env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: VAULT_API_ADDR - name: VAULT_API_ADDR
value: "http://$(HOSTNAME).vault-internal:8200" value: "http://$(POD_NAME).vault-internal.vault.svc.cluster.local:8200"
- name: VAULT_CLUSTER_ADDR
value: "https://$(POD_NAME).vault-internal.vault.svc.cluster.local:8201"
- name: SKIP_SETCAP - name: SKIP_SETCAP
value: "true" value: "true"
- name: VAULT_ADDR - name: VAULT_ADDR
value: "http://127.0.0.1:8200" value: "http://127.0.0.1:8200"
- name: VAULT_CLUSTER_ADDR
value: "http://$(HOSTNAME).vault-internal:8201"
- name: VAULT_K8S_NAMESPACE - name: VAULT_K8S_NAMESPACE
valueFrom: valueFrom:
fieldRef: fieldRef:
@ -73,10 +98,29 @@ spec:
mountPath: /etc/vault mountPath: /etc/vault
- name: data - name: data
mountPath: /vault/data mountPath: /vault/data
- name: config-runtime
mountPath: /vault/runtime
livenessProbe:
httpGet:
path: /v1/sys/health?standbyok=true&sealedok=true
port: 8200
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /v1/sys/health?standbyok=true
port: 8200
initialDelaySeconds: 10
periodSeconds: 5
volumes: volumes:
- name: config - name: config
configMap: configMap:
name: vault-config name: vault-config
- name: config-runtime
emptyDir: {}
volumeClaimTemplates: volumeClaimTemplates:
- metadata: - metadata:
name: data name: data