Secrets and ConfigMaps
There are three main ways to mount Secrets and ConfigMaps in Kubernetes:
- Environment Variables: ConfigMap and Secret values can be exposed as environment variables to a container. 2. Volume Mounts: ConfigMap and Secret data can be mounted as a file in a volume to a container. 3. Command Line Arguments: The values from a ConfigMap and Secret can be passed as command-line arguments to a container.
Secrets
Secrets are used to store sensitive information such as passwords, tokens, and encryption keys. Secrets are stored as base64-encoded data, and they can be used in a variety of ways in your deployment, such as environment variables, command-line arguments, and volume mounts.
Here's an example of how to create a secret in YAML:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: cGFzc3dvcmQ= # this is the base64 encoded representation of "password"
token: dG9rZW4= # this is the base64 encoded representation of "token"
In this example, we're creating a Secret called "mysecret" with two key-value pairs: "password" and "token". The values are base64-encoded.
In Kubernetes, you can mount Secrets as a volume in a Pod to make the data accessible to the containers running in the Pod. This is useful when you need to use sensitive information, such as passwords or tokens, in your application.
As a volume mount
You can mount a Secret as a volume in a Pod, making the data accessible to the containers running in the Pod. The contents of the Secret can be read from a specified path in the file system.
Here's an example of how to mount a Secret as a volume in a Pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
volumeMounts:
- name: mysecret-volume
mountPath: /etc/secrets
volumes:
- name: mysecret-volume
secret:
secretName: mysecret
In this example, we're creating a Pod called "mypod" with a single container called "mycontainer". The Secret called "mysecret" is being mounted as a volume in the Pod and is accessible at the path "/etc/secrets". The containers running in the Pod can read the contents of the Secret from this path.
Here's an example of how to use a Secret as an environment variable in a Pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: MY_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
In this example, the Secret called "mysecret" is being referenced as an environment variable in the container with the name "MY_PASSWORD". The value of the environment variable is being set to the "password" key in the Secret.
Here's an example of how to use a Secret as a command-line argument in a Pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
command:
- myapp
args:
- --password=$(MY_PASSWORD)
env:
- name: MY_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
ConfigMaps
ConfigMaps, on the other hand, are used to store non-sensitive configuration data. This data can be used in a variety of ways, such as environment variables, command-line arguments, and volume mounts.
Here's an example of how to create a ConfigMap in YAML:
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfigmap
data:
app.setting: production # this could be a setting value for your app
app.port: "8080" # this could be the port that your app runs on
In this example, we're creating a ConfigMap called "myconfigmap" with two key-value pairs: "app.setting" and "app.port".
- Environment Variables:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo
spec:
containers:
- name: demo
image: <image-name>
env:
- name: <ENV_VAR_NAME>
valueFrom:
configMapKeyRef:
name: <configmap-name>
key: <key-name>
- Volumes:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo
spec:
containers:
- name: demo
image: <image-name>
volumeMounts:
- name: config-volume
mountPath: <mount-path>
readOnly: true
volumes:
- name: config-volume
configMap:
name: <configmap-name>
items:
- key: <key-name>
path: <file-name>
- Command Line Arguments:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo
spec:
containers:
- name: demo
image: <image-name>
command: [ "sh", "-c"]
args:
- |
echo <configmap-value>
env:
- name: <ENV_VAR_NAME>
valueFrom:
configMapKeyRef:
name: <configmap-name>
key: <key-name>
In summary, Secrets are used to store sensitive information, and ConfigMaps are used to store non-sensitive configuration data. Both can be used in a variety of ways to configure your applications in Kubernetes.
Vault
Vault is a tool for securely storing and accessing secrets. It can be used to manage secrets such as API keys, passwords, and certificates, and can provide secure access to these secrets from apps and services. Vault provides a centralized way to manage and control access to secrets, and has features such as encryption, dynamic secrets, and audit logging. Vault can be used with various environments and infrastructure, including Kubernetes.
Vault can be used in various ways, including:
- Secrets Management: Store, manage, and control access to secrets such as API keys, passwords, and certificates. 2. Data Encryption: Encrypt data in transit and at rest using industry standard algorithms. 3. Dynamic Secrets: Generate dynamic secrets on-demand, and revoke access to secrets when needed. 4. Identity Management: Manage authentication and authorization for users, apps, and services. 5. Audit Logging: Track and monitor access to secrets and sensitive data.
To deploy Vault on Kubernetes, there are several options available:
- Manually deploy and configure Vault on a Kubernetes cluster. 2. Use a Helm chart to deploy and configure Vault on a Kubernetes cluster. 3. Use the Vault operator to manage the deployment and operation of Vault on a Kubernetes cluster.
Regardless of the deployment method, it is important to properly secure Vault and follow best practices for managing secrets in production environments.
Comments
Questions, corrections, war stories — all welcome. Sign in with GitHub to join the discussion.