create helm charts for snapshot and unseal jobs
This commit is contained in:
@@ -16,5 +16,13 @@ dependencies:
|
|||||||
- name: vault
|
- name: vault
|
||||||
version: 0.28.0
|
version: 0.28.0
|
||||||
repository: https://helm.releases.hashicorp.com
|
repository: https://helm.releases.hashicorp.com
|
||||||
|
- name: app-template
|
||||||
|
alias: snapshot
|
||||||
|
repository: https://bjw-s.github.io/helm-charts/
|
||||||
|
version: 3.2.1
|
||||||
|
- name: app-template
|
||||||
|
alias: vault-unseal
|
||||||
|
repository: https://bjw-s.github.io/helm-charts/
|
||||||
|
version: 3.2.1
|
||||||
icon: https://raw.githubusercontent.com/walkxcode/dashboard-icons/main/png/vault.png
|
icon: https://raw.githubusercontent.com/walkxcode/dashboard-icons/main/png/vault.png
|
||||||
appVersion: 1.17.0
|
appVersion: 1.17.0
|
||||||
|
@@ -1,64 +0,0 @@
|
|||||||
apiVersion: batch/v1
|
|
||||||
kind: CronJob
|
|
||||||
metadata:
|
|
||||||
name: vault-snapshot-cronjob
|
|
||||||
namespace: {{ .Release.Namespace }}
|
|
||||||
labels:
|
|
||||||
app.kubernetes.io/name: vault-snapshot-cronjob
|
|
||||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
||||||
app.kubernetes.io/version: {{ .Chart.AppVersion }}
|
|
||||||
app.kubernetes.io/component: storage
|
|
||||||
app.kubernetes.io/part-of: {{ .Release.Name }}
|
|
||||||
spec:
|
|
||||||
schedule: "@every 24h"
|
|
||||||
successfulJobsHistoryLimit: 3
|
|
||||||
failedJobsHistoryLimit: 3
|
|
||||||
jobTemplate:
|
|
||||||
spec:
|
|
||||||
template:
|
|
||||||
spec:
|
|
||||||
restartPolicy: OnFailure
|
|
||||||
containers:
|
|
||||||
- name: snapshot
|
|
||||||
image: hashicorp/vault:1.16.2
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
command:
|
|
||||||
- /bin/ash
|
|
||||||
args:
|
|
||||||
- -ec
|
|
||||||
- |
|
|
||||||
apk add --no-cache jq;
|
|
||||||
export VAULT_TOKEN=$(vault write auth/approle/login role_id=$VAULT_APPROLE_ROLE_ID secret_id=$VAULT_APPROLE_SECRET_ID -format=json | jq -r .auth.client_token);
|
|
||||||
vault operator raft snapshot save /opt/backup/vault-snapshot-latest.snap;
|
|
||||||
cp /opt/backup/vault-snapshot-latest.snap /opt/backup/vault-snapshot-$(date +"%Y%m%d-%H-%M").snap;
|
|
||||||
cp /opt/backup/vault-snapshot-latest.snap /opt/backup/vault-snapshot-s3.snap;
|
|
||||||
envFrom:
|
|
||||||
- secretRef:
|
|
||||||
name: vault-snapshot-agent-token
|
|
||||||
env:
|
|
||||||
- name: VAULT_ADDR
|
|
||||||
value: http://vault-active.vault.svc.cluster.local:8200
|
|
||||||
volumeMounts:
|
|
||||||
- mountPath: /opt/backup
|
|
||||||
name: backup
|
|
||||||
- name: upload
|
|
||||||
image: amazon/aws-cli:2.15.42
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
command:
|
|
||||||
- /bin/sh
|
|
||||||
args:
|
|
||||||
- -ec
|
|
||||||
- |
|
|
||||||
until [ -f /opt/backup/vault-snapshot-s3.snap ]; do sleep 5; done;
|
|
||||||
aws s3 cp /opt/backup/vault-snapshot-s3.snap s3://cl01tl-vault-snapshots/vault-snapshot-$(date +"%Y%m%d-%H-%M").snap;
|
|
||||||
rm /opt/backup/vault-snapshot-s3.snap;
|
|
||||||
envFrom:
|
|
||||||
- secretRef:
|
|
||||||
name: vault-snapshot-s3
|
|
||||||
volumeMounts:
|
|
||||||
- mountPath: /opt/backup
|
|
||||||
name: backup
|
|
||||||
volumes:
|
|
||||||
- name: backup
|
|
||||||
persistentVolumeClaim:
|
|
||||||
claimName: vault-nfs-storage-backup
|
|
243
clusters/cl01tl/platform/vault/templates/external-secret.yaml
Normal file
243
clusters/cl01tl/platform/vault/templates/external-secret.yaml
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: vault-snapshot-agent-token
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: vault-snapshot-agent-token
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/component: snapshot
|
||||||
|
app.kubernetes.io/part-of: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
secretStoreRef:
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
name: vault
|
||||||
|
data:
|
||||||
|
- secretKey: VAULT_APPROLE_ROLE_ID
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/snapshot/approle
|
||||||
|
metadataPolicy: None
|
||||||
|
property: role-id
|
||||||
|
- secretKey: VAULT_APPROLE_SECRET_ID
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/snapshot/approle
|
||||||
|
metadataPolicy: None
|
||||||
|
property: secret-id
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: vault-snapshot-s3
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: vault-snapshot-s3
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/component: snapshot
|
||||||
|
app.kubernetes.io/part-of: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
secretStoreRef:
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
name: vault
|
||||||
|
data:
|
||||||
|
- secretKey: AWS_ACCESS_KEY_ID
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/approle/job
|
||||||
|
metadataPolicy: None
|
||||||
|
property: AWS_ACCESS_KEY_ID
|
||||||
|
- secretKey: AWS_DEFAULT_REGION
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/approle/job
|
||||||
|
metadataPolicy: None
|
||||||
|
property: AWS_DEFAULT_REGION
|
||||||
|
- secretKey: AWS_ENDPOINT_URL
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/approle/job
|
||||||
|
metadataPolicy: None
|
||||||
|
property: AWS_ENDPOINT_URL
|
||||||
|
- secretKey: AWS_SECRET_ACCESS_KEY
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/approle/job
|
||||||
|
metadataPolicy: None
|
||||||
|
property: AWS_SECRET_ACCESS_KEY
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: vault-unseal-agent-token
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: vault-unseal-agent-token
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/component: unseal
|
||||||
|
app.kubernetes.io/part-of: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
secretStoreRef:
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
name: vault
|
||||||
|
data:
|
||||||
|
- secretKey: VAULT_APPROLE_ROLE_ID
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/unseal/approle
|
||||||
|
metadataPolicy: None
|
||||||
|
property: role-id
|
||||||
|
- secretKey: VAULT_APPROLE_SECRET_ID
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/unseal/approle
|
||||||
|
metadataPolicy: None
|
||||||
|
property: secret-id
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: vault-unseal-config-1
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: vault-unseal-key-1
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/component: unseal
|
||||||
|
app.kubernetes.io/part-of: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
secretStoreRef:
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
name: vault
|
||||||
|
data:
|
||||||
|
- secretKey: vault-unseal.yaml
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/unseal/config
|
||||||
|
metadataPolicy: None
|
||||||
|
property: vault-unseal.yaml-1
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: vault-unseal-config-2
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: vault-unseal-key-2
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/component: unseal
|
||||||
|
app.kubernetes.io/part-of: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
secretStoreRef:
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
name: vault
|
||||||
|
data:
|
||||||
|
- secretKey: vault-unseal.yaml
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/unseal/config
|
||||||
|
metadataPolicy: None
|
||||||
|
property: vault-unseal.yaml-2
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: vault-unseal-config-3
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: vault-unseal-config-3
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/component: unseal
|
||||||
|
app.kubernetes.io/part-of: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
secretStoreRef:
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
name: vault
|
||||||
|
data:
|
||||||
|
- secretKey: vault-unseal.yaml
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/unseal/config
|
||||||
|
metadataPolicy: None
|
||||||
|
property: vault-unseal.yaml-3
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: vault-token
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: vault-token
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/component: token
|
||||||
|
app.kubernetes.io/part-of: {{ .Release.Name }}
|
||||||
|
spec:
|
||||||
|
secretStoreRef:
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
name: vault
|
||||||
|
data:
|
||||||
|
- secretKey: token
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/token
|
||||||
|
metadataPolicy: None
|
||||||
|
property: token
|
||||||
|
- secretKey: unseal_key_1
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/token
|
||||||
|
metadataPolicy: None
|
||||||
|
property: unseal_key_1
|
||||||
|
- secretKey: unseal_key_2
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/token
|
||||||
|
metadataPolicy: None
|
||||||
|
property: unseal_key_2
|
||||||
|
- secretKey: unseal_key_3
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/token
|
||||||
|
metadataPolicy: None
|
||||||
|
property: unseal_key_3
|
||||||
|
- secretKey: unseal_key_4
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/token
|
||||||
|
metadataPolicy: None
|
||||||
|
property: unseal_key_4
|
||||||
|
- secretKey: unseal_key_5
|
||||||
|
remoteRef:
|
||||||
|
conversionStrategy: Default
|
||||||
|
decodingStrategy: None
|
||||||
|
key: /cl01tl/vault/token
|
||||||
|
metadataPolicy: None
|
||||||
|
property: unseal_key_5
|
@@ -18,7 +18,7 @@ vault:
|
|||||||
logFormat: standard
|
logFormat: standard
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
cpu: 100m
|
cpu: 100m
|
||||||
memory: 256Mi
|
memory: 256Mi
|
||||||
ingress:
|
ingress:
|
||||||
enabled: true
|
enabled: true
|
||||||
@@ -165,3 +165,154 @@ vault:
|
|||||||
for: 5m
|
for: 5m
|
||||||
labels:
|
labels:
|
||||||
severity: critical
|
severity: critical
|
||||||
|
snapshot:
|
||||||
|
controllers:
|
||||||
|
main:
|
||||||
|
type: cronjob
|
||||||
|
cronjob:
|
||||||
|
suspend: false
|
||||||
|
concurrencyPolicy: Forbid
|
||||||
|
timeZone: US/Central
|
||||||
|
schedule: "@every 24h"
|
||||||
|
startingDeadlineSeconds: 90
|
||||||
|
successfulJobsHistory: 3
|
||||||
|
failedJobsHistory: 3
|
||||||
|
backoffLimit: 3
|
||||||
|
parallelism: 1
|
||||||
|
containers:
|
||||||
|
snapshot:
|
||||||
|
image:
|
||||||
|
repository: hashicorp/vault
|
||||||
|
tag: 1.16.2
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
command:
|
||||||
|
- /bin/ash
|
||||||
|
args:
|
||||||
|
- -ec
|
||||||
|
- |
|
||||||
|
apk add --no-cache jq;
|
||||||
|
export VAULT_TOKEN=$(vault write auth/approle/login role_id=$VAULT_APPROLE_ROLE_ID secret_id=$VAULT_APPROLE_SECRET_ID -format=json | jq -r .auth.client_token);
|
||||||
|
vault operator raft snapshot save /opt/backup/vault-snapshot-latest.snap;
|
||||||
|
cp /opt/backup/vault-snapshot-latest.snap /opt/backup/vault-snapshot-$(date +"%Y%m%d-%H-%M").snap;
|
||||||
|
cp /opt/backup/vault-snapshot-latest.snap /opt/backup/vault-snapshot-s3.snap;
|
||||||
|
envFrom:
|
||||||
|
- secretRef:
|
||||||
|
name: vault-snapshot-agent-token
|
||||||
|
env:
|
||||||
|
- name: VAULT_ADDR
|
||||||
|
value: http://vault-active.vault.svc.cluster.local:8200
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 128Mi
|
||||||
|
backup:
|
||||||
|
image:
|
||||||
|
repository: amazon/aws-cli
|
||||||
|
tag: 2.15.42
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
args:
|
||||||
|
- -ec
|
||||||
|
- |
|
||||||
|
until [ -f /opt/backup/vault-snapshot-s3.snap ]; do sleep 5; done;
|
||||||
|
aws s3 cp /opt/backup/vault-snapshot-s3.snap s3://cl01tl-vault-snapshots/vault-snapshot-$(date +"%Y%m%d-%H-%M").snap;
|
||||||
|
rm /opt/backup/vault-snapshot-s3.snap;
|
||||||
|
envFrom:
|
||||||
|
- secretRef:
|
||||||
|
name: vault-snapshot-s3
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 128Mi
|
||||||
|
serviceAccount:
|
||||||
|
create: true
|
||||||
|
persistence:
|
||||||
|
config:
|
||||||
|
existingClaim: vault-nfs-storage-backup
|
||||||
|
advancedMounts:
|
||||||
|
main:
|
||||||
|
snapshot:
|
||||||
|
- path: /opt/backup
|
||||||
|
readOnly: false
|
||||||
|
backup:
|
||||||
|
- path: /opt/backup
|
||||||
|
readOnly: false
|
||||||
|
vault-unseal:
|
||||||
|
controllers:
|
||||||
|
main:
|
||||||
|
type: cronjob
|
||||||
|
cronjob:
|
||||||
|
suspend: false
|
||||||
|
concurrencyPolicy: Allow
|
||||||
|
timeZone: US/Central
|
||||||
|
schedule: "0 * * * *"
|
||||||
|
startingDeadlineSeconds: 90
|
||||||
|
successfulJobsHistory: 3
|
||||||
|
failedJobsHistory: 3
|
||||||
|
backoffLimit: 3
|
||||||
|
parallelism: 3
|
||||||
|
containers:
|
||||||
|
unseal-1:
|
||||||
|
image:
|
||||||
|
repository: ghcr.io/lrstanley/vault-unseal
|
||||||
|
tag: 0.5.1
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 128Mi
|
||||||
|
unseal-2:
|
||||||
|
image:
|
||||||
|
repository: ghcr.io/lrstanley/vault-unseal
|
||||||
|
tag: 0.5.1
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 128Mi
|
||||||
|
unseal-3:
|
||||||
|
image:
|
||||||
|
repository: ghcr.io/lrstanley/vault-unseal
|
||||||
|
tag: 0.5.1
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 128Mi
|
||||||
|
serviceAccount:
|
||||||
|
create: true
|
||||||
|
persistence:
|
||||||
|
config-1:
|
||||||
|
enabled: true
|
||||||
|
type: configMap
|
||||||
|
name: vault-unseal-config-1
|
||||||
|
advancedMounts:
|
||||||
|
main:
|
||||||
|
unseal-1:
|
||||||
|
- path: /etc/vault-unseal.yaml
|
||||||
|
readOnly: true
|
||||||
|
mountPropagation: None
|
||||||
|
subPath: vault-unseal.yaml
|
||||||
|
config-2:
|
||||||
|
enabled: true
|
||||||
|
type: configMap
|
||||||
|
name: vault-unseal-config-2
|
||||||
|
advancedMounts:
|
||||||
|
main:
|
||||||
|
unseal-2:
|
||||||
|
- path: /etc/vault-unseal.yaml
|
||||||
|
readOnly: true
|
||||||
|
mountPropagation: None
|
||||||
|
subPath: vault-unseal.yaml
|
||||||
|
config-3:
|
||||||
|
enabled: true
|
||||||
|
type: configMap
|
||||||
|
name: vault-unseal-config-3
|
||||||
|
advancedMounts:
|
||||||
|
main:
|
||||||
|
unseal-3:
|
||||||
|
- path: /etc/vault-unseal.yaml
|
||||||
|
readOnly: true
|
||||||
|
mountPropagation: None
|
||||||
|
subPath: vault-unseal.yaml
|
||||||
|
Reference in New Issue
Block a user