Add helm chart for observing secrets
This commit adds helm chart for observing changes to a kubernetes secret. This is done with a cron job. The cron job updates a configurable deployment annotation with a checksum of the secret. This way, when the secret changes, the pod in the deployment is automatically restarted to pick up the changes. Change-Id: I1a1a1b78ec1c6752747ea2a115ecea9caffdfb66 Story: 2007361 Task: 42932 Signed-off-by: Jerry Sun <jerry.sun@windriver.com>
This commit is contained in:
parent
4e77c25a20
commit
638dc8f924
@ -0,0 +1,10 @@
|
||||
#
|
||||
# Copyright (c) 2021 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
apiVersion: v1
|
||||
appVersion: "1.0"
|
||||
description: A Helm chart to update a deployment annotation if a secret changes
|
||||
name: secret-observer
|
||||
version: 0.1.0
|
@ -0,0 +1,23 @@
|
||||
{{/*
|
||||
#
|
||||
# Copyright (c) 2021 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
*/}}
|
||||
|
||||
{{- if .Values.clusterRole.create }}
|
||||
apiVersion: rbac.authorization.k8s.io/v1beta1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: secret-observer-cr
|
||||
labels:
|
||||
app: secret-observer
|
||||
release: "{{ .Release.Name }}"
|
||||
rules:
|
||||
- apiGroups: ["apps"]
|
||||
resources:
|
||||
- deployments
|
||||
verbs:
|
||||
- patch
|
||||
{{- end -}}
|
@ -0,0 +1,24 @@
|
||||
{{/*
|
||||
#
|
||||
# Copyright (c) 2021 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
*/}}
|
||||
|
||||
{{- if .Values.clusterRoleBinding.create }}
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
labels:
|
||||
release: "{{ .Release.Name }}"
|
||||
name: secret-observer-crb
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: secret-observer-cr
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: secret-observer
|
||||
namespace: {{ .Values.namespace }}
|
||||
{{- end -}}
|
@ -0,0 +1,27 @@
|
||||
{{/*
|
||||
#
|
||||
# Copyright (c) 2021 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
*/}}
|
||||
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: secret-observer-bin
|
||||
namespace: {{ .Values.namespace }}
|
||||
data:
|
||||
update-secret-sha.sh: |
|
||||
#!/bin/sh
|
||||
set -ex
|
||||
|
||||
KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
|
||||
SECRET_SHA=$(sha256sum /home/$1 | awk '{print $1}')
|
||||
|
||||
curl -sS -H "Authorization: Bearer $KUBE_TOKEN" \
|
||||
--cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
|
||||
--request PATCH -H "Accept: application/json" \
|
||||
-H "Content-Type: application/strategic-merge-patch+json" \
|
||||
https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/apis/apps/v1/namespaces/{{ .Values.namespace }}/deployments/$2 \
|
||||
--data '{"spec":{"template":{"metadata":{"annotations":{"'$3'": "'$SECRET_SHA'"}}}}}';
|
@ -0,0 +1,66 @@
|
||||
{{/*
|
||||
#
|
||||
# Copyright (c) 2021 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
*/}}
|
||||
|
||||
apiVersion: batch/v1beta1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: secret-observer-cron-job
|
||||
namespace: {{ .Values.namespace }}
|
||||
spec:
|
||||
schedule: "{{ .Values.cronSchedule }}"
|
||||
successfulJobsHistoryLimit: {{ .Values.jobs.successfulHistoryLimit }}
|
||||
failedJobsHistoryLimit: {{ .Values.jobs.failedHistoryLimit }}
|
||||
concurrencyPolicy: Forbid
|
||||
startingDeadlineSeconds: {{ .Values.jobs.startingDeadlineSeconds }}
|
||||
jobTemplate:
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
serviceAccountName: secret-observer
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: secret-observer-cron-container
|
||||
image: "{{ .Values.image }}:{{ .Values.imageTag }}"
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
{{- range .Values.observedSecrets }}
|
||||
/tmp/update-secret-sha.sh "{{ .secretName }}-{{ .deploymentToRestart }}/{{ .filename }}" {{ .deploymentToRestart }} "{{ .secretName }}sha"
|
||||
{{- end }}
|
||||
stdin: true
|
||||
tty: true
|
||||
volumeMounts:
|
||||
{{- range .Values.observedSecrets }}
|
||||
- mountPath: "/home/{{ .secretName }}-{{ .deploymentToRestart }}"
|
||||
name: mounted-{{ .secretName | replace "." "-" }}-{{ .deploymentToRestart | replace "." "-" }}-{{ .filename | replace "." "-" }}
|
||||
{{- end }}
|
||||
- name: pod-tmp
|
||||
mountPath: /tmp
|
||||
- name: secret-observer-bin
|
||||
mountPath: /tmp/update-secret-sha.sh
|
||||
subPath: update-secret-sha.sh
|
||||
readOnly: true
|
||||
restartPolicy: OnFailure
|
||||
imagePullSecrets:
|
||||
- name: default-registry-key
|
||||
volumes:
|
||||
{{- range .Values.observedSecrets }}
|
||||
- name: mounted-{{ .secretName | replace "." "-" }}-{{ .deploymentToRestart | replace "." "-" }}-{{ .filename | replace "." "-" }}
|
||||
secret:
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
- name: pod-tmp
|
||||
emptyDir: {}
|
||||
- name: secret-observer-bin
|
||||
configMap:
|
||||
name: secret-observer-bin
|
||||
defaultMode: 0555
|
@ -0,0 +1,18 @@
|
||||
{{/*
|
||||
#
|
||||
# Copyright (c) 2021 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
*/}}
|
||||
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
release: "{{ .Release.Name }}"
|
||||
name: secret-observer
|
||||
namespace: {{ .Values.namespace }}
|
||||
imagePullSecrets:
|
||||
- name: default-registry-key
|
||||
{{- end -}}
|
@ -0,0 +1,36 @@
|
||||
#
|
||||
# Copyright (c) 2021 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
image: docker.io/curlimages/curl
|
||||
imageTag: 7.77.0
|
||||
namespace: default
|
||||
|
||||
clusterRoleBinding:
|
||||
create: true
|
||||
|
||||
clusterRole:
|
||||
create: true
|
||||
|
||||
serviceAccount:
|
||||
create: true
|
||||
|
||||
cronSchedule: "0 1 * * *"
|
||||
|
||||
nodeSelector:
|
||||
node-role.kubernetes.io/master: ""
|
||||
|
||||
jobs:
|
||||
startingDeadlineSeconds: 200
|
||||
successfulHistoryLimit: 3
|
||||
failedHistoryLimit: 1
|
||||
|
||||
observedSecrets:
|
||||
# the name of the secret to observe
|
||||
# - secretName: "overrideMe"
|
||||
# the name of the file within the secret to observe
|
||||
# filename: "overrideMe"
|
||||
# the deployment to restart if a change in the secret is detected
|
||||
# deploymentToRestart: "overrideMe"
|
Loading…
Reference in New Issue
Block a user