Hello DevOps | DevSecOps teams, we are running into the new generation of microservices inside Pods where we need to focus on how we can protect them. And here this post is going with the Security rules imposing on the Kubernetes Cluster with Secret Objects which are specially designed to store the sensitive data in them to refer inside the Pod Containers. But they have limitation that they can hold up to 1MB size of data only.
Why Secret objects?
- We can store Password, keys, tokens, certificates etc
- Secrets will reduce the risk of exposing sensitive data
- Access secrets using volumes and environment variables
- Secrets object will be created outside pod/containers
- When it is created there is NO clues where it will be injected
- All secrets resides in ETCD database on the K8s master
This Kubernetes Secret Objects are similar to ConfigMaps Objects
Kubernetes Secret objects Using Volume, ENVIRONMENT variables |
Pre-check first we will check the Kubernetes Cluster is up and running.
kubectl get nodesAll the Kubernetes master and slave nodes are in Ready status.
- Using Environment variables
- Assign to Path inside Pod
Creating Kubernetes Generic Secrets
We are talking about Secrets, Let's create a text that can be converted to encrypted format, if we want we can decode that into plain text. In Linux CLI we have base64 command that will be used to do this encode or decode text from file or from standard input to display on standard output that is on our terminal.
Secrets can be created in Kubernetes following ways:
- from file or directory
- from literals
- Using YAML Declarative approace
echo "admin" | base64 > username.txt cat username.txt cat username.txt | base64 -d # Now password echo "abhiteja" |base64 > password.txt cat password.txt | base64 -d # Create secret from file kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt kubectl get secrets kubectl describe secrets db-user-pass
Validate
Kubernetes secret creation with username, password |
The Pod with Redis image will be using the secrets as environment variables
FileName: secretenv-pod.yml
apiVersion: v1 kind: Pod metadata: name: secret-env-pod spec: containers: - name: mycontainer image: redis env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: db-user-pass key: username.txt - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: db-user-pass key: password.txt restartPolicy: NeverYou can create the Pod using the following command:
kubectl create -f secretenv-pod.yml kubectl get pods
Secret environment variables in Redis Pod |
kubectl exec -it secret-env-pod -- bash env | grep SECRET
Secret as environment variables inside Pod Container |
From the literal
k create secret generic mysqldb-secret \ --from-literal=DB_Host=mysql01.vybhava.com \ --from-literal=DB_User=root \ --from-literal=DB_Password=Welcome123 k describe secret mysqldb-secret k get secret -o yamlExecution output as follows:
Kubernetes Secret creation from literal example |
Pod implementation the secret object you can see in the first option we have already discussed.
Creating the Secret declarative way
apiVersion: v1 data: username: a3ViZWFkbQo= password: a3ViZXBhc3MK kind: Secret metadata: name: mysecretLet's create the secret object with kubectl command
kubectl create -f mysecret.yaml kubectl get secrets kubectl describe secrets mysecret
Creating secret object in Kubernetes using kubectl |
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: redis volumeMounts: - name: redis-db mountPath: "/etc/redis-db" readOnly: true volumes: - name: redis-db secret: secretName: mysecretCreating the mypod defined as Pod and that using the volume defined with the secret section with mysecret which will referred to the above secret that we have created earlier.
Create Pod that uses secrets as volume |
apt-get install etcd-client # Validate installation etcdctl
Kubernetes ETCD DB Client installation on Ubuntu |
No comments:
Post a Comment