secret和configmap
secret
Secret 类似于 ConfigMap 但专门用于保存机密数据。每个 Secret 的尺寸最多为 1MiB,不可以在静态 Pod 中使用 ConfigMap 或 Secret。
类型
Kubernetes 提供若干种内置的类型,用于一些常见的使用场景。 针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。
内置类型 | 用法 |
---|---|
Opaque |
用户定义的任意数据 |
kubernetes.io/service-account-token |
服务账号令牌 |
kubernetes.io/dockercfg |
~/.dockercfg 文件的序列化形式 |
kubernetes.io/dockerconfigjson |
~/.docker/config.json 文件的序列化形式 |
kubernetes.io/basic-auth |
用于基本身份认证的凭据 |
kubernetes.io/ssh-auth |
用于 SSH 身份认证的凭据 |
kubernetes.io/tls |
用于 TLS 客户端或者服务器端的数据 |
bootstrap.kubernetes.io/token |
启动引导令牌数据 |
dockerconfigjson
创建方式一:
kubectl create secret docker-registry my-secret --from-file=.dockerconfigjson=/root/.docker/config.json --dry-run=client -oyaml
创建方式二:
kubectl create secret docker-registry mydocker-registry --docker-server=http://192.168.122.100:5000 --docker-username=admin --docker-password=123 --dry-run=client -oyaml
Opaque
创建方式一:
#从目录生成
kubectl create secret generic mysecret --from-file=./dir1 --dry-run=client -oyaml
创建方式二:
#从文件生成
kubectl create secret generic mysecret --from-file=./dir1/1.sh --from-file=./dir1/2.sh --dry-run=client -oyaml
创建方式三:
#从文件生成,指定key名称
kubectl create secret generic mysecret --from-file=k1=./dir1/1.sh --from-file=k2=./dir1/2.sh --dry-run=client -oyaml
创建方式四:
#从字面输入生成
kubectl create secret generic mysecret --from-literal=user=admin --from-literal=pass='!@#$' --dry-run=client -oyaml
创建方式五:
echo k1=1 >env
echo k2=2 >>env
echo k3=3 >>env
#从k==>v文件中生成
kubectl create secret generic mysecret --from-env-file=./env --dry-run=client -oyaml
tls
创建方式一:
kubectl create secret tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.key
service-account-token
说明:
k8s v1.22版本之前都会自动为
serviceAccount
创建secret在最近版本中,包括k8s v1.25中,不在自动创建secret。被 TokenRequest取代, 你可以使用
kubectl create token
命令调用 API 获得令牌。
应该先创建 ServiceAccount 对象。kubernetes.io/service-account-name
apiVersion: v1
kind: Secret
metadata:
name: secret-sa-sample
annotations:
kubernetes.io/service-account.name: "sa-name"
type: kubernetes.io/service-account-token
data:
# 你可以像 Opaque Secret 一样在这里添加额外的键/值偶对
extra: YmFyCg==
使用secret
-
作为容器变量
- name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret #configMap的名字 key: username
-
存储卷方式挂载
volumes: - name: cert secret: name: mysecret items: - key: ca.crt path: ca.crt mode: 600 defaultMode: 644 - name: cert1 secret: name: mysecret1 defaultMode: 644
-
imagePullSecret
kind: Pod ... spec: imagePullSecrets: name: mydocker-registry
configMap
ConfigMap 中保存的数据不可超过 1 MiB
data
字段设计用来保存 UTF-8 字符串,而binaryData
则被设计用来保存二进制数据作为 base64 编码的字串。
从 v1.19 开始,添加一个immutable
字段到 ConfigMap 定义中。定义configmap是否可以修改.系统会关闭对已标记为不可变更的 ConfigMap 的监视操作。
静态pod不能引用configMap
当卷中使用的 ConfigMap 被更新时,所投射的键最终也会被更新
以环境变量方式使用的 ConfigMap 数据不会被自动更新
创建方法
1. 从目录生成
#从目录生成
kubectl create configmap myconfigmap --from-file=./dir1 --dry-run=client -oyaml
2. 从文件生成
#从文件生成
kubectl create configmap myconfigmap --from-file=./dir1/1.sh --from-file=./dir1/2.sh --dry-run=client -oyaml
3. 从文件生成指定key
#从文件生成指定key
kubectl create configmap myconfigmap --from-file=k1=./dir1/1.sh --from-file=k2=./dir1/2.sh --dry-run=client -oyaml
4. 字面生成
#字面生成
kubectl create configmap myconfigmap --from-literal=k1=v1 --from-literal=k2=v2 --dry-run=client -oyaml
5. 从变量文件生成
echo k1=1 >env
echo k2=2 >>env
echo k3=3 >>env
#从k==>v文件中生成
kubectl create configmap myconfigmap --from-env-file=./env --dry-run=client -oyaml
使用configMap
- 作为容器变量
pod.spec.containers[0].env
env:
- name: user
value: root
- name: myconf
valueFrom:
configMapKeyRef:
name: myconfigmap #configMap的名字
key: myconf #configMap.data中的key
optional: false #必须存在configmap或configmap.data中的key
- 存储卷方式挂载
volumes:
- name: myconf
configMap:
name: myconfigmap
items:
- key: myconf
path: my.conf
mode: 600
defaultMode: 644
optional: false #必须存在configmap或configmap.data中的key
volumes:
- name: myconf
configMap:
name: myconfigmap
defaultMode: 644
optional: false #必须存在configmap或configmap.data中的key