文章目录

  • configmap
    • 示例
    • 更新
  • Secret
    • Pod 用使用 Secret三种方式
    • 使用 kubectl 创建 Secret
    • 手动创建 Secret
      • data
      • stringData
    • 从生成器创建 Secret
      • 从文件生成 Secret
      • 基于字符串值来创建 Secret
    • 解码 Secret
    • 编辑 Secret
    • 使用 Secret
      • 在 Pod 中使用存放在卷中的 Secret
      • 将 Secret 键名映射到特定路径
      • Secret 文件权限
    • 挂载的 Secret 会被自动更新
    • 以环境变量的形式使用 Secrets


这篇比较轻松,因为我这会儿的时间被称之为“碎片时间”。

configmap

ConfigMap是一个或多个key/value的形式保存在k8s中,内部可以管理变量也可以管理完整的配置文件内容。

示例

apiVersion: v1
kind: ConfigMap
metadata:name: configmapnamespace: dev
data:info: |username:adminpassword:123456
apiVersion: v1
kind: Pod
metadata:name: pod-configmapnamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1volumeMounts: # 将configmap挂载到目录- name: configmountPath: /configmap/configvolumes: # 引用configmap- name: configconfigMap:name: configmap

更新

kubectl edit cm cm-test01

这个我比较关心,因为这个是真的用得到。

通过kubectl describe cm cm-test01查看更新是否生效。

方式二:直接更改yaml文件里面的值,通过kubectl apply -f configmap-test01.yaml重新发布一遍进行更新。

不过目前我对二者细节还没把握到位。这个系列过去我会着手做一个社群,集思广益。


Secret

在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。

要使用 Secret,Pod 需要引用 Secret。

Pod 用使用 Secret三种方式

  • 作为挂载到一个或多个容器上的 卷 中的文件。
  • 作为容器的环境变量
  • 由 kubelet 在为 Pod 拉取镜像时使用

使用 kubectl 创建 Secret

# 创建本例中要使用的文件
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt#第一种
# kubectl create secret 命令将这些文件打包到一个 Secret 中并在 API server 中创建了一个对象。 Secret 对象的名称必须是合法的 DNS 子域名。
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#第三种
kubectl create secret generic dev-db-secret \--from-literal=username=devuser \--from-literal=password='S!B\*d$zDsb='kubectl get secrets
kubectl describe secrets/db-user-pass

特殊字符(例如 $、\、*、= 和 !)可能会被你的 Shell 解析,因此需要转义。 在大多数 Shell 中,对密码进行转义的最简单方式是使用单引号(’)将其扩起来。
您无需对文件中保存(–from-file)的密码中的特殊字符执行转义操作。


手动创建 Secret

data

$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm

编写一个yaml

apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm
kubectl apply -f ./secret.yaml

在某些情况下,你可能希望改用 stringData 字段。 此字段允许您将非 base64 编码的字符串直接放入 Secret 中, 并且在创建或更新 Secret 时将为您编码该字符串。

stringData

apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
stringData:config.yaml: |-apiUrl: "https://my.api.com/api/v1"username: {{username}}password: {{password}}
$ kubectl get secret mysecret -o yaml
apiVersion: v1
kind: Secret
metadata:creationTimestamp: 2018-11-15T20:40:59Zname: mysecretnamespace: defaultresourceVersion: "7225"uid: c280ad2e-e916-11e8-98f2-025000000001
type: Opaque
data:config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19

如果在 data 和 stringData 中都指定了某一字段,则使用 stringData 中的值:

data 和 stringData 的键必须由字母数字字符 ‘-’, ‘_’ 或者 ‘.’ 组成.


从生成器创建 Secret

Kubectl 从 1.14 版本开始支持使用 Kustomize 管理对象。 Kustomize 提供资源生成器创建 Secret 和 ConfigMaps。 Kustomize 生成器要在当前目录内的 kustomization.yaml 中指定。 生成 Secret 之后,使用 kubectl apply 在 API 服务器上创建对象。

从文件生成 Secret

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: db-user-passfiles:- username.txt- password.txt
EOF

应用包含 kustomization.yaml 目录以创建 Secret 对象。

kubectl apply -k .
kubectl get secrets

输出类似于:

NAME                             TYPE                                  DATA      AGE
db-user-pass-96mffmfh4k          Opaque                                2         51s
$ kubectl describe secrets/db-user-pass-96mffmfh4k
Name:            db-user-pass
Namespace:       default
Labels:          <none>
Annotations:     <none>Type:            OpaqueData
====
password.txt:    12 bytes
username.txt:    5 bytes

基于字符串值来创建 Secret

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: db-user-passliterals:- username=admin- password=secret
EOF

应用包含 kustomization.yaml 目录以创建 Secret 对象。

kubectl apply -k .
kubectl get secret mysecret -o yaml

解码 Secret

输出类似于:

apiVersion: v1
kind: Secret
metadata:creationTimestamp: 2016-01-22T18:41:56Zname: mysecretnamespace: defaultresourceVersion: "164619"uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm

解码 password 字段:

echo 'MWYyZDFlMmU2N2Rm' | base64 --decode

输出类似于:

1f2d1e2e67df

编辑 Secret

kubectl edit secrets mysecret

使用 Secret

在 Pod 中使用存放在卷中的 Secret

  • 创建一个 Secret 或者使用已有的 Secret。多个 Pod 可以引用同一个 Secret。
  • 修改你的 Pod 定义,在 spec.volumes[] 下增加一个卷。可以给这个卷随意命名, 它的spec.volumes[].secret.secretName 必须是 Secret 对象的名字。
  • 将 spec.containers[].volumeMounts[] 加到需要用到该 Secret 的容器中。 指定 spec.containers[].volumeMounts[].readOnly = true 和spec.containers[].volumeMounts[].mountPath 为你想要该 Secret 出现的尚未使用的目录。
  • 修改你的镜像并且/或者命令行,让程序从该目录下寻找文件。 Secret 的 data 映射中的每一个键都对应 mountPath 下的一个文件名。
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: foosecret:secretName: mysecret

将 Secret 键名映射到特定路径

你可以使用 spec.volumes[].secret.items 字段修改每个键对应的目标路径:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: foosecret:secretName: mysecretitems:- key: usernamepath: my-group/my-username

将会发生什么呢:

username Secret 存储在 /etc/foo/my-group/my-username 文件中而不是
/etc/foo/username 中。
password Secret 没有被映射

Secret 文件权限

你还可以指定 Secret 将拥有的权限模式位。如果不指定,默认使用 0644
示例:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"volumes:- name: foosecret:secretName: mysecretdefaultMode: 256

之后,Secret 将被挂载到 /etc/foo 目录,而所有通过该 Secret 卷挂载 所创建的文件的权限都是 0400。

你还可以使用映射,如上一个示例,并为不同的文件指定不同的权限,如下所示:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"volumes:- name: foosecret:secretName: mysecretitems:- key: usernamepath: my-group/my-usernamemode: 511

在这里,位于 /etc/foo/my-group/my-username 的文件的权限值为 0777。 由于 JSON 限制,必须以十进制格式指定模式,即 511。


挂载的 Secret 会被自动更新

当已经存储于卷中被使用的 Secret 被更新时,被映射的键也将终将被更新。 组件 kubelet 在周期性同步时检查被挂载的 Secret 是不是最新的。 但是,它会使用其本地缓存的数值作为 Secret 的当前值。

通过将 Secret 标记为不可变来关闭 kube-apiserver 对其的监视,从而显著降低 kube-apiserver 的负载,提升集群性能。
使用这个特性需要启用 ImmutableEmphemeralVolumes 特性开关 并将 Secret 或 ConfigMap 的 immutable 字段设置为 true. 例如:

apiVersion: v1
kind: Secret
metadata:...
data:...
immutable: true

说明: 一旦一个 Secret 或 ConfigMap 被标记为不可变,撤销此操作或者更改 data 字段的内容都是 不可能的。 只能删除并重新创建这个 Secret。现有的 Pod 将维持对已删除 Secret 的挂载点 - 建议重新创建这些 Pod。


以环境变量的形式使用 Secrets

将 Secret 作为 Pod 中的环境变量使用:

  • 创建一个 Secret 或者使用一个已存在的 Secret。多个 Pod 可以引用同一个 Secret。
  • 修改 Pod 定义,为每个要使用 Secret 的容器添加对应 Secret 键的环境变量。 使用 Secret 键的环境变量应在 env[x].valueFrom.secretKeyRef 中指定 要包含的 Secret 名称和键名。
  • 更改镜像并/或者命令行,以便程序在指定的环境变量中查找值。
 apiVersion: v1
kind: Pod
metadata:name: secret-env-pod
spec:containers:- name: mycontainerimage: redisenv:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: passwordrestartPolicy: Never
echo $SECRET_USERNAME

输出类似于:

admin
echo $SECRET_PASSWORD

输出类似于:

1f2d1e2e67df

k8s 配置存储之 Configmap secret相关推荐

  1. @kubernetes(k8s) 应用配置管理(ConfigMap、subPath、Secret)

    k8s 应用配置管理 ConfigMap 文章目录 k8s 应用配置管理 ConfigMap 一. ConfigMap 1.configmap的介绍 2.congfigmap的创建方式(四种) [指定 ...

  2. k8s 配置 Secret 集成Harbor

    本篇主要 记录一下 在 k8s 中如果想要 从 harbor拉取镜像 该怎么操作,以及介绍了一下 k8s 中 Secret 是什么 1.Secret 是什么 1.1 Secret 概述 Secret ...

  3. Kubernetes 存储(Configmap、Secret、Volume、PV-PVC)

    Kubernetes 存储 一.ConfigMap 1.ConfigMap描述信息 2.ConfigMap的创建 3.Pod中使用ConfigMap 4.ConfigMap的热更新 二.Secret ...

  4. Kubernetes K8S之存储Secret详解

    Kubernetes K8S之存储Secret详解 Secret概述 Secret类型 Service Account Opaque Secret 创建secret 将Secret挂载到Volume中 ...

  5. 从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    作者 | 至天 阿里巴巴高级研发工程师 一.Volumes 介绍 Pod Volumes 首先来看一下 Pod Volumes 的使用场景: 场景一:如果 pod 中的某一个容器在运行时异常退出,被 ...

  6. k8s使用volume将ConfigMap作为文件或目录直接挂载_从零开始入门 K8s | 如何实现应用配置管理?...

    作者 | 何淋波(新胜) 阿里云容器服务技术专家 需求来源 背景问题 首先一起来看一下需求来源.大家应该都有过这样的经验,就是用一个容器镜像来启动一个 container.要启动这个容器,其实有很多需 ...

  7. 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

     写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 可能很多新手都会遇到同样的问题:我要我的Asp.net ...

  8. k8s使用volume将ConfigMap作为文件或目录直接挂载_Kubernetes in Action 06. 卷:将磁盘挂载到容器...

    简介 P161 pod 中的每个容器都有自己独立的文件系统,因为文件系统来自容器镜像. P161 Kubernetes 中的卷是 pod 的一部分,并和 pod 共享相同的生命周期.这意味着 pod ...

  9. k8s使用volume将ConfigMap作为文件或目录直接挂载_从应用开发角度认识 K8S

    简介:刘晨 Lorraine 坐标Fintech,精通持续集成与发布,曾具有全平台100+应用持续部署持续发布实战经验,现在立志于成为K8S玩家. 云原生应用 我们正经历从单体应用转向分布式微服务架构 ...

最新文章

  1. [综合面试] 计算机面试书籍与求职网站推荐
  2. 堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_WhatsApp缓冲区漏洞曝光 攻击者可通过MP4文件执行远程代码...
  3. AD,proteus操作
  4. 业务安全通用解决方案——WAF数据风控
  5. C语言程序练习-L1-017 到底有多二 (15分)
  6. 电子设计竞赛电源题(2)-检波与采样
  7. [网络开发]服务器开发
  8. maven 本地包依赖包打进jar
  9. 连续整数的和(51Nod-1138)
  10. Ethercat解析(一)之获取、编译、安装(Ubuntu14.04)
  11. bzoj3130 [SDOI2013]费用流 结论+二分答案+网络流检验
  12. Divergent series
  13. 机器学习之支持向量机算法(二)
  14. 目标检测(十三)--MultiPathNet
  15. C语言程序设计:图书管理系统(附代码)
  16. 【关于我】一个专注于嵌入式物联网架构设计的攻城狮
  17. 局部图像运动复原matlab,运动模糊图像复原算法实现及应用.docx
  18. 这才是打开风变编程的正确操作方式
  19. Java用jxl对表格的数值进行比对
  20. 这三个方法让你实现手写字扫描成电子版

热门文章

  1. 安装计算机的显卡出现问题,电脑显卡驱动安装失败如何解决
  2. 扡扫机器人_评测:不会满场乱飞奔 这台Anker扫拖机器人指哪儿扫哪儿
  3. C++ modbus TCP 协议跟PLC通信
  4. linux 单网卡绑定两个ip
  5. 解决问题就像剥洋葱,解决的关键是基础知识
  6. idea中整合redis中出现 Error creating bean with name ‘com.sxt.redis.RedisApplicationTests‘:
  7. php model module,Yii2用Gii自动生成Module+Model+CRUD
  8. 如何在html定位一张图片,css图片怎么定位?
  9. 他向导师下跪,仍被强制退学!5年博士白读,双方各执一词,同门师兄也有回应……...
  10. Frangi2D滤波详解