1. What is a secret in Kubernetes?
A Secret in Kubernetes is a
Kubernetes object used to store and
manage sensitive information, such as:
i) Database passwords.
ii) TLS certificates.
iii) ssh keys.
iv) API keys.
2.Key Features of Kubernetes Secrets.
- Encapsulated
Sensitive Data: Stores credentials, tokens, and certificates securely.
- Base64
Encoding: Secret data is stored in a Base64-encoded format (not encrypted
by default).
- Pod
Access: Pods can consume secrets as environment variables or mounted
volumes.
- Automatic
Injection: Kubernetes automatically injects secrets into pods when
configured.
- RBAC
Control: Kubernetes Role-Based Access Control (RBAC) can restrict who can
read/write secrets.
- Encrypted
Storage (Optional): Kubernetes allows encrypting secrets at rest using
encryption providers.
7.
Stored inside ETCD database on Kubernetes
master.
8. ETCD does not store more than 1 MB.
9. Secrets are NOT encrypted but base64 encoded in the etcd. You can decode them with a simple echo '<your-encoded-value>' | base64 –decode;
3. Types of Secrets.
Kubernetes
supports different types of Secrets:
i)Generic.
ii)Docker-Registry.
iii)TLS.
Type |
Description |
Opaque (default) |
Stores arbitrary key-value pairs. |
kubernetes.io/dockerconfigjson |
Stores Docker registry credentials for pulling
images. |
kubernetes.io/tls |
Stores TLS certificate (tls.crt) and private key (tls.key). |
kubernetes.io/service-account-token |
Stores service account tokens for API
authentication. |
Custom Secrets |
Users can define custom types for specific use cases. |
4. How to create a secret in Kubernetes?
There are
two ways to create secrets.
i)
Imperative
way.
ii) Declarative way.
i)Imperative
way.
Using
kubectl (from literal values).
# kubectl
create secret generic <my-secret>
--from-literal=<username>=<admin>
--from-literal=<password>=<secret123>
# kubectl create secret generic <my-secret> --from-file=<path-to-file>
# kubectl create secret generic <my-secret-ssh> --from-file=ssh-privatekey=path/to/id_rsa --from-file=ssh-publickey=path/to/id_rsa.pub
ii)Declarative
way.
Using a YAML Manifest.
# vim secret.yaml
apiVersion: v1
kind:
Secret
metadata:
name: my-secret
type:
Opaque
data:
username: YWRtaW4= # Base64 encoded 'admin'
password: c2VjcmV0MTIz # Base64 encoded 'secret123'
i)Imperative
way.
How to create a (Generic Secret) and uset it in yaml file.
# kubectl
create secret generic my-secret
--from-literal=username=admin
--from-literal=password=secret123
# kubectl get secrets
# kubectl
describe secrets my-secret
# vim
secret-1.yaml
apiVersion:
v1
kind: Pod
metadata:
name: secret-demo-1
spec:
containers:
- name: demo-container
image: nginx
env:
- name: Username
valueFrom:
secretKeyRef:
name: my-secret
key: username
# kubectl
apply -f secret-1.yaml
# kubectl
exec -it secret-demo-1 -- printenv
How to create a from-file
(Generic Secret) and use it in yaml file.
# echo -n "mypassword" > password.txt
# kubectl create secret generic my-secret --from-file=password=password.txt
# kubectl get secret
# kubectl
exec -it my-pod -- bash
How to create a Docker-registry Secret and use it in yaml file.
# kubectl
create secret docker-registry docker-secret --docker-email=example@gmail.com
--docker-username=dev --docker-password=pass1234
--docker-server=my-registry.example:5000
# kubectl
get secrets
# vim secret-1.yaml
apiVersion:
v1
kind: Pod
metadata:
name: secret-demo-2
spec:
containers:
- name: demo-container
image: nginx
envFrom:
- secretRef:
name: docker-secret
# kubectl
apply -f secret-1.yaml
# kubectl
get pods
# kubectl
exec -it secret-demo-2 -- printenv
How to create a TLS
Secret and use it in yaml file:
# kubectl
create secret tls my-tls-secret
--key=/root/data/selfsigned.key --cert=/root/data/selfsigned.pem
# kubectl
get secret
# kubectl
describe secret my-tls-secret
# vim secret-1.yaml
apiVersion:
v1
kind: Pod
metadata:
name: secret-demo-3
spec:
containers:
- name: demo-container
image: nginx
volumeMounts:
- name: data
mountPath: /etc/cert-data
volumes:
- name: data
secret:
secretName: my-tls-secret
# kubectl
exec -it secret-demo-3 -- bash
Delete :-
# kubectl delete secret my-secret
Decode
Secret Value:
# kubectl
get secret my-secret
-o jsonpath="{.data.password}"
| base64 --decode
No comments:
Post a Comment