apiVersion: v1 kind: ServiceAccount metadata: name: certs-creator --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: secret-creator rules: - apiGroups: [ "" ] resources: [ "secrets" ] verbs: [ "create", "patch" ] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: certs-creator subjects: - kind: ServiceAccount name: certs-creator roleRef: kind: Role name: secret-creator apiGroup: rbac.authorization.k8s.io --- apiVersion: batch/v1 kind: Job metadata: name: create-certs spec: template: spec: restartPolicy: OnFailure serviceAccountName: certs-creator initContainers: - command: - /bin/ash - -c - | function createKey() { USER=$1 openssl genrsa -out ${USER}.key 2048 echo "created ${USER}.key" } function createSigningRequest() { USER=$1 openssl req -new -key ${USER}.key -extensions 'v3_req' -out ${USER}.csr -config <(generateServerConfig) echo "created ${USER}.csr" } function generateServerConfig() { cat<> ${USER}-cert.json } cd /secret # Create a CA key and cert for signing other certs createKey ca openssl req -x509 -new -nodes -key ca.key -days 365 -out ca.crt -subj "/CN=My Custom CA" createKey postgres createSigningRequest postgres signCertificate postgres.csr postgres.crt ca.crt ca.key createCertSecret postgres createKey zitadel createSigningRequest zitadel signCertificate zitadel.csr zitadel.crt ca.crt ca.key createCertSecret zitadel image: alpine/openssl imagePullPolicy: IfNotPresent name: create-certs volumeMounts: - mountPath: /secret name: secret containers: - image: alpine/curl name: apply-certs imagePullPolicy: IfNotPresent command: - /bin/ash - -c - | export APISERVER=https://kubernetes.default.svc SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace) TOKEN=$(cat ${SERVICEACCOUNT}/token) CACERT=${SERVICEACCOUNT}/ca.crt function uploadSecret { USER=$1 curl \ --cacert ${CACERT} \ --header "Authorization: Bearer ${TOKEN}" \ --header "Content-Type: application/json" \ -X POST ${APISERVER}/api/v1/namespaces/${NAMESPACE}/secrets \ --data "$(tr -d '\n' < /secret/${USER}-cert.json)" \ > /dev/null || echo "error uploading ${USER} secret: $?" } uploadSecret postgres uploadSecret zitadel volumeMounts: - mountPath: /secret name: secret volumes: - name: secret emptyDir: medium: Memory