Secret和ConfigMap
Secret的k8s官方文档:
https://kubernetes.io/zh/docs/concepts/configuration/secret/
- Secret :加密数据并存放在Etcd中,让Pod容器以挂载Volume方式访问,Pod使用secret的两种方式:
- 变量注入
- 挂载
使用kubectl创建本地创建Secret
echo -n ‘admin‘ > ./username.txt
echo -n ‘1f2d1e2e67df‘ > ./password.txt
kubectl create secret 命令将这些文件打包到一个 Secret 中并在 API server 中创建了一个对象。
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
默认的键名是文件名。你也可以使用 [--from-file=[key=]source] 参数来设置键名。(我采用的这种方法详细说明)
kubectl create secret generic db-user-pass --from-file=username=./username.txt --from-file=password=./password.txt
查看secret的描述
[root@master1 secret]# kubectl get secrets
NAME TYPE DATA AGE
blog-ljy-com kubernetes.io/tls 2 2d
db-user-pass Opaque 2 97s
default-token-nsxx5 kubernetes.io/service-account-token 3 9d
[root@master1 secret]# kubectl describe secrets/db-user-pass
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
[root@master1 secret]#
使用secret
Secret 可以作为数据卷被挂载,或作为环境变量 暴露出来以供 Pod 中的容器使用。它们也可以被系统的其他部分使用,而不直接暴露在 Pod 内;
- 使用挂载卷的方法
[root@master1 secret]# vim secret.yaml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: db-user-pass [root@master1 secret]# kubectl apply -f secret.yaml pod/mypod created [root@master1 secret]# kubectl get pods NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 3s nginx-deployment-9cdc9bd5c-pzzst 1/1 Running 1 3d14h web-nginx-dep2-66ccfd7fb7-z2x84 1/1 Running 1 8d #查看mypod中挂载/etc/foo目录是否正常,并查看其内容 [root@master1 secret]# kubectl exec -it mypod /bin/bash root@mypod:/# df -h Filesystem Size Used Avail Use% Mounted on overlay 39G 5.9G 33G 16% / tmpfs 64M 0 64M 0% /dev tmpfs 910M 0 910M 0% /sys/fs/cgroup tmpfs 910M 8.0K 910M 1% /etc/foo /dev/mapper/centos-root 39G 5.9G 33G 16% /etc/hosts shm 64M 0 64M 0% /dev/shm tmpfs 910M 12K 910M 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 910M 0 910M 0% /proc/acpi tmpfs 910M 0 910M 0% /proc/scsi tmpfs 910M 0 910M 0% /sys/firmware root@mypod:/# cat /etc/foo/username.txt adminroot@mypod:/# cat /etc/foo/password.txt 1f2d1e2e67dfroot@mypod:/#
- 以环境变量的形式使用 Secrets
一般情况下多个Pod用来引用同一个
Secret
[root@master1 secret]# vim secret-env-pod.yaml
[root@master1 secret]# cat secret-env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: nginx:1.8
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: db-user-pass
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: db-user-pass
key: password
restartPolicy: Never
[root@master1 secret]# kubectl apply -f secret-env-pod.yaml
[root@master1 secret]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-9cdc9bd5c-pzzst 1/1 Running 1 3d14h
secret-env-pod 1/1 Running 0 13m
web-nginx-dep2-66ccfd7fb7-z2x84 1/1 Running 1 8d
#在一个以环境变量形式使用 Secret 的容器中,Secret 键表现为常规的环境变量,其中包含 Secret 数据的 base-64 解码值。这是从上面的示例在容器内执行的命令的结果:
[root@master1 secret]# kubectl exec -it secret-env-pod /bin/bash
root@secret-env-pod:/# echo $SECRET_USERNAME
admin
root@secret-env-pod:/# echo $SECRET_PASSWORD
1f2d1e2e67df