ConfigMaps werden dazu verwendet, die Konfiguration für eine Applikation vom Image zu trennen und bei Laufzeit dem Pod zur Verfügung zu stellen, ähnlich dem Setzen von Umgebungsvariablen. Dies erlaubt es, Applikationen innerhalb von Containern möglichst portabel zu halten.
In diesem Lab lernen Sie, wie man ConfigMaps erstellt und entsprechend verwendet.
Um eine ConfigMap in einem Projekt anzulegen kann folgender Befehl verwendet werden:
oc create configmap [Name der ConfigMap] [Options]
Ein klassisches Beispiel für ConfigMaps sind Property Files bei Java Applikationen, welche in erster Linie nicht via Umgebungsvariablen konfiguriert werden können.
Für dieses Beispiel verwenden wir das Spring Boot Beispiel aus Lab 4, [USERNAME]-dockerimage
.
Tipp
oc project [USERNAME]-dockerimageMit dem folgenden Befehl legen wir nun die erste ConfigMap auf Basis eines lokalen Files an:
oc create configmap javaconfiguration --from-file=additional-labs/resources/properties.properties
Mit folgendem Befehl kann nun verifiziert werden, ob die ConfigMap erfolgreich angelegt wurde:
oc get configmaps
NAME DATA AGE
javaconfiguration 1 7s
Wir können uns auch den Inhalt der ConfigMap ansehen:
oc get configmaps javaconfiguration -o json
Als nächstes wollen wir die ConfigMap im Pod verfügbar machen.
Grundsätzlich gibt es dafür die folgenden Möglichkeiten:
- ConfigMap Properties als Umgebungsvariablen im Deployment
- Commandline Arguments via Umgebungsvariablen
- als Volumes in den Container gemountet
Im Beispiel hier wollen wir, dass die ConfigMap als File auf einem Volume liegt.
Hierfür müssen wir entweder den Pod oder in unserem Fall die DeploymentConfig mit oc edit dc example-spring-boot
bearbeiten.
Zu beachten gilt es dabei den volumeMounts- (spec.template.spec.containers.volumeMounts
: wie wird das Volume in den Container gemountet) sowie den volumes-Teil (spec.template.spec.volumes
: welches Volume in unserem Fall die ConfigMap wird in den Container gemountet).
apiVersion: v1
kind: DeploymentConfig
metadata:
annotations:
openshift.io/generated-by: OpenShiftNewApp
creationTimestamp: 2018-12-05T08:24:06Z
generation: 2
labels:
app: example-spring-boot
name: example-spring-boot
namespace: [namespace]
resourceVersion: "149323448"
selfLink: /oapi/v1/namespaces/[namespace]/deploymentconfigs/example-spring-boot
uid: 21f6578b-f867-11e8-b72f-001a4a026f33
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
app: example-spring-boot
deploymentconfig: example-spring-boot
strategy:
activeDeadlineSeconds: 21600
resources: {}
rollingParams:
intervalSeconds: 1
maxSurge: 25%
maxUnavailable: 25%
timeoutSeconds: 600
updatePeriodSeconds: 1
type: Rolling
template:
metadata:
annotations:
openshift.io/generated-by: OpenShiftNewApp
creationTimestamp: null
labels:
app: example-spring-boot
deploymentconfig: example-spring-boot
spec:
containers:
- env:
- name: SPRING_DATASOURCE_USERNAME
value: appuio
- name: SPRING_DATASOURCE_PASSWORD
value: appuio
- name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
value: com.mysql.cj.jdbc.Driver
- name: SPRING_DATASOURCE_URL
value: jdbc:mysql://mysql/appuio?autoReconnect=true
image: appuio/example-spring-boot
imagePullPolicy: Always
name: example-spring-boot
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/config
name: config-volume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- configMap:
defaultMode: 420
name: javaconfiguration
name: config-volume
Anschliessend kann im Container im File /etc/config/properties.properties
auf die Werte zugegriffen werden.
oc exec [POD] -- cat /etc/config/properties.properties
key=appuio
key2=openshift
Diese Properties Files können nun so von der Java Applikation im Container gelesen und verwendet werden. Das Image bleibt dabei umgebungsneutral.
Erstellen Sie jeweils eine ConfigMap und verwenden Sie dafür die verschiedenen Arten von Data Sources.
Machen Sie die Werte innerhalb von Pods auf die unterschiedlichen Arten verfügbar.
Ende Lab ConfigMaps