Use a Secret to secure the connection to Postgres
-
In a secret-db.yaml file, add the specification for a Secret containing the key password with the associated value dbpass.
-
Modify the db Deployment to reference this Secret key (instead of specifying the password in plain text).
-
Add the POSTGRES_PASSWORD environment variable in the containers of the worker and result Deployments, ensuring that the value of this variable references the key of the Secret created earlier.
-
Deploy the application defined in this specification and verify that you have access to both the voting and result interfaces.
-
Delete the application.
Solution
- The password we want to store in the Secret is dbpass.
First, we encode this password in base64:
$ echo "dbpass" | base64
ZGJwYXNzCg==
Next, we create the following file defining a Secret:
apiVersion: v1
kind: Secret
metadata:
name: db
data:
password: ZGJwYXNzCg==
- We modify the db Deployment specification to reference the contents of the Secret key password instead of using the password in plain text:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: db
name: db
spec:
replicas: 1
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- image: postgres:15.1-alpine3.17
name: postgres
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: db
key: password
ports:
- containerPort: 5432
name: postgres
- We modify the worker and result Deployments (the two microservices connecting to db) to add the POSTGRES_PASSWORD environment variable, which retrieves its value from the db Secret.
The new worker Deployment specification:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: worker
name: worker
spec:
replicas: 1
selector:
matchLabels:
app: worker
template:
metadata:
labels:
app: worker
spec:
containers:
- image: voting/worker:latest
name: worker
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: db
key: password
The new result Deployment specification:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: result
name: result
spec:
replicas: 1
selector:
matchLabels:
app: result
template:
metadata:
labels:
app: result
spec:
containers:
- image: voting/result:latest
name: result
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: db
key: password
- We deploy the application with the following command from the manifests directory:
kubectl apply -f .
As before, using the IP address of one of the cluster nodes, we can access the voting and result interfaces via ports 31000 and 31001, respectively.
- We delete the application with the following command from the manifests directory:
kubectl delete -f .