Recently I had an interesting problem. The product I was working on needed to create a secret from a file. Now on one hand this is an easy thing as you can just have a job run within an image
kubectl create secret generic mysecret --from-file=./file.txt
Ah… However Kubernetes command line client is only compatible within one minor version of the Kubernetes api server. So if you want to support all major version for Redhat Openshift currently supported you have to support Kubernetes 1.11 to 1.21. So to get around this problem you have to curl against the kubapi server directly. Here is a sample script I created to demonstrate this method.
apiVersion: batch/v1
kind: Job
metadata:
name: readfiletosecret
description: "Example of reading a file to a kubernetes secret."
spec:
template:
spec:
serviceAccountName: account-with-secret-create-priv
volumes:
- name: local
emptyDir: {}
initContainers:
- name: get-file
image: registry.access.redhat.com/ubi8/ubi-minimal:latest
command:
- "/bin/sh"
- "-c"
env:
- name: UPLOAD_FILE_PATH
value: "/root/buildinfo/content_manifests/ubi8-minimal-container*.json"
args:
- |
cat $UPLOAD_FILE_PATH
cp -vf $UPLOAD_FILE_PATH /work/
volumeMounts:
- name: local
mountPath: /work
containers:
- name: create-secret
image: registry.access.redhat.com/ubi8/ubi-minimal:latest
command:
- "/bin/sh"
- "-c"
args:
- |
ls /work/
i#
export CONTENT=$(cat /work/* | base64 )
echo $CONTENT
#Set auth info
export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
export TOKEN=$(cat ${SERVICEACCOUNT}/token)
export CACERT=${SERVICEACCOUNT}/ca.crt
export APISERVER="https://kubernetes.default.svc"
# Explore the API with TOKEN
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d @- ${APISERVER}/api/v1/namespaces/$NAMESPACE/secrets <<EOF
{
"kind": "Secret",
"apiVersion": "v1",
"metadata": {
"name": "example"
},
"data": {
"file": "$CONTENT"
}
}
EOF
rm /work/*
volumeMounts:
- name: local
mountPath: /work
restartPolicy: Never
backoffLimit: 4