K8存储之ConfigMap、Secret
ConfigMap
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap供容器使用的典型用法如下:
- 生成为容器内的环境变量
- 设置容器启动命令的启动参数(需设置为环境变量)
- 以volume的形式挂载为容器内部的文件或者目录
configmap创建:
基于字面值用命令行创建:
# 命令格式
kubectl create configmap <映射名称> <数据源>
# <映射名称> 是为指定的ConfigMap 名称,<数据源> 是要从中提取数据的目录、 文件或者字面值。
比如我们创建一个configmap,里面有两个变量值,一个是nginx_port=80,一个是nginx_server_ip=192.168.248.130
[root@master ~]# kubectl create configmap nginx-env --from-literal=nginx_port=80 --from-literal=nginx_server=192.168.248.130
configmap/nginx-env created
查看configmap
[root@master ~]# kubectl get configmap
NAME DATA AGE
kube-root-ca.crt 1 81d
nginx-env 2 82s
[root@master ~]# kubectl describe configmap nginx-env
Name: nginx-env
Namespace: default
Labels: <none>
Annotations: <none> Data
====
nginx_port:
----
80
nginx_server:
----
192.168.248.130
Events: <none>
此时名为nginx-env的configmap已经被创建,查看详细信息发现定义的变量值已经被写入。
同时也可以通过yaml文件被创建
#vim configmap_nginx.yaml
piVersion: v1
kind: ConfigMap
metadata:
name: nginx-env2
namespace: default
data:
nginx_port: "80"
nginx_server: 192.168.248.130
[root@master ~]# kubectl apply -f configmap_nginx.yaml
configmap/nginx-env2 created
[root@master ~]# kubectl get configmap
NAME DATA AGE
kube-root-ca.crt 1 81d
nginx-env 2 16m
nginx-env2 2 16s
[root@master ~]# kubectl describe configmap nginx-env2
Name: nginx-env2
Namespace: default
Labels: <none>
Annotations: <none> Data
====
nginx_port:
----
80
nginx_server:
----
192.168.248.130
Events: <none>
基于文件创建ConfigMap
当configmap中需要被定义多个变量时,我们可以将变量写入到文件中,然后基于文件来创建configmap。用--from-file=<文件路径> 来指定,可以使用多次来指定不同的配置文件。文件在configmap中以键值对的形式被创建,键的名字就是文件名,值就是文件内容。
[root@master env]# cat /root/env/nginx-env #查看变量文件
nginx_port=80
nginx_server=192.168.248.130
[root@master env]# kubectl create configmap nginx-config --from-file=/root/env/nginx-env
configmap/nginx-config created
[root@master env]# kubectl get configmap nginx-config
NAME DATA AGE
nginx-config 1 58s
[root@master env]# kubectl describe configmap nginx-config
Name: nginx-config
Namespace: default
Labels: <none>
Annotations: <none> Data
====
nginx-env: #文件名
----
nginx_port=80 #文件中内容
nginx_server=192.168.248.130 #文件内容 Events: <none>
基于目录创建ConfigMap
跟基于文件创建ConfigMap一样,只是把文件路径换为目录路径
[root@master env]# ll /root/env/
总用量 12
-rw-r--r--. 1 root root 158 7月 30 14:48 game.properties
-rw-r--r--. 1 root root 46 7月 30 14:50 nginx-env
-rw-r--r--. 1 root root 317 7月 30 14:44 ui.properties
[root@master env]# kubectl create configmap config-env --from-file=/root/env/
configmap/config-env created
[root@master env]# kubectl describe configmap config-env
Name: config-env
Namespace: default
Labels: <none>
Annotations: <none> Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30 nginx-env:
----
nginx_port=80
nginx_server=192.168.248.130 ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
Events: <none>
使用ConfigMap
环境变量方式
ConfigMap一定要先于pod创建,再创建一个pod,并挂载ConfigMap。
我们就用上面创建的名为nginx-env的ConfigMap来实验。先创建一个pod
[root@master ~]# cat test.yaml
apiVersion: v1
kind: Service
metadata:
name: service-nginx
namespace: default
spec:
type: NodePort
selector:
app: nginx
ports:
- name: nginx
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: web
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21.4
ports:
- name: nginx
containerPort: 80
volumeMounts:
- name: html
mountPath: /user/share/nginx/html/
env:
- name: TEST_PORT
valueFrom:
configMapKeyRef:
name: nginx-env
key: nginx_port
- name: TEST_HOST
valueFrom:
configMapKeyRef:
name: nginx-env
key: nginx_server
volumes:
- name: html
emptyDir: {}
创建pod并查看
[root@master ~]# kubectl apply -f test.yaml
service/service-nginx created
deployment.apps/mydeploy created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydeploy-7bfd9b98c7-jwlcs 1/1 Running 0 5s
[root@master ~]# kubectl exec mydeploy-7bfd9b98c7-jwlcs -it -- /bin/bash
root@mydeploy-7bfd9b98c7-jwlcs:/# printenv
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=mydeploy-7bfd9b98c7-jwlcs
SERVICE_NGINX_SERVICE_PORT_NGINX=80
PWD=/
SERVICE_NGINX_SERVICE_HOST=10.110.104.68
SERVICE_NGINX_PORT=tcp://10.110.104.68:80
SERVICE_NGINX_PORT_80_TCP_PORT=80
SERVICE_NGINX_PORT_80_TCP_PROTO=tcp
TEST_PORT=80
PKG_RELEASE=1~bullseye
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
TEST_HOST=192.168.248.130
SERVICE_NGINX_PORT_80_TCP=tcp://10.110.104.68:80
NJS_VERSION=0.7.0
TERM=xterm
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.21.4
SERVICE_NGINX_SERVICE_PORT=80
SERVICE_NGINX_PORT_80_TCP_ADDR=10.110.104.68
_=/usr/bin/printenv
root@mydeploy-7bfd9b98c7-jwlcs:/#
可以发现configMap当中的环境变量已经注入到了pod容器当中
注意:用这种环境变量的注入方式,pod启动后,如果在去修改configMap当中的变量,对于pod是无效的,如果是以卷的方式挂载,是可的实时更新的。
以存储卷的形式挂载到pod中
[root@master ~]# cat test1.yaml
apiVersion: v1
kind: Service
metadata:
name: service-nginx
namespace: default
spec:
type: NodePort
selector:
app: nginx
ports:
- name: nginx
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeploy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
name: web
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21.4
ports:
- name: nginx
containerPort: 80
volumeMounts:
- name: nginx-config
mountPath: /nginx/vars/
readOnly: true
volumes:
- name: nginx-config
configMap:
name: nginx-env
创建pod并进入查看/nginx/vars/下的变量文件
[root@master ~]# kubectl apply -f test1.yaml
service/service-nginx created
deployment.apps/mydeploy created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydeploy-6dc957dc5-9lj4j 1/1 Running 0 2s
[root@master ~]# kubectl exec mydeploy-6dc957dc5-9lj4j -it -- /bin/bash
root@mydeploy-6dc957dc5-9lj4j:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt nginx opt proc root run sbin srv sys tmp usr var
root@mydeploy-6dc957dc5-9lj4j:/# cd nginx/vars/
root@mydeploy-6dc957dc5-9lj4j:/nginx/vars# ls
nginx_port nginx_server
root@mydeploy-6dc957dc5-9lj4j:/nginx/vars# cat nginx_port
80
root@mydeploy-6dc957dc5-9lj4j:/nginx/vars#
我们查看到 nginx/vars/nginx_port中内容为80 ,修改nginx-env中的nginx_port值为8080
[root@master ~]# kubectl edit configmap nginx-env
"/tmp/kubectl-edit-vz3zm.yaml" 15L, 463C written
deployment.apps/mydeploy configured
[root@master ~]# kubectl get pod
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
nginx_port: "8080"
nginx_server: 192.168.248.130
kind: ConfigMap
metadata:
creationTimestamp: "2022-07-30T08:20:11Z"
name: nginx-env
namespace: default
resourceVersion: "411597"
uid: 0b42384e-03d5-499d-9527-e546e3477d2e
我们再进入容器查看nginx/vars/nginx_port的值,此时已经变成8080
[root@master ~]# kubectl exec mydeploy-6dc957dc5-9lj4j -it -- /bin/bash
root@mydeploy-6dc957dc5-9lj4j:/# cat nginx/vars/nginx_port
8080
root@mydeploy-6dc957dc5-9lj4j:/#
Secret
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。
- Service Account:用来访问Kubernetes API,有Kubernetes自动创建并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
- Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
- kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证信息。
Secret的创建方式跟ConfigMap相似,只不过时把变量通过base64进行了转码
手动创建base64加密
[root@master ~]# echo -n 'admin' | base64
YWRtaW4=
[root@master ~]# echo -n 'qwe123QAZ' | base64
cXdlMTIzUUFa
手动解密
[root@master ~]# echo -n 'YWRtaW4=' | base64 -d
admin
[root@master ~]# echo -n 'cXdlMTIzUUFa' | base64 -d
qwe123QAZ
创建Secret
一、通过命令行创建
[root@master ~]# kubectl create secret test-secret --help
Create a secret using specified subcommand. Available Commands:
docker-registry 创建一个给 Docker registry 使用的 secret
generic 从本地 file, directory 或者 literal value 创建一个 secret
tls 创建一个 TLS secret Usage:
kubectl create secret [flags] [options] Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
[root@master ~]# kubectl create secret generic test-user --from-literal=user=admin
secret/test-user created
[root@master ~]# kubectl create secret generic test-passwd --from-literal=passwd=qwe123QAZ
secret/test-passwd created
[root@master ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-mkcn2 kubernetes.io/service-account-token 3 82d
test-passwd Opaque 1 21s
test-user Opaque 1 46s
[root@master ~]#
我们通过查看secret发现刚刚创建的类型为Opaque
二、通过yaml创建
[root@master ~]# cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: test-secret
type: Opaque #注意类型为Opaque
data:
test-user: YWRtaW4= #值为base64编码后的
test-passwd: cXdlMTIzUUFa #值为编码后的
secret使用
一、通过变量注入
[root@master ~]# cat secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: default
spec:
containers:
- name: nginx
image: nginx:1.21.4
imagePullPolicy: IfNotPresent
env:
- name: nginx-user
valueFrom:
secretKeyRef:
name: test-secret
key: test-user
- name: nginx-passwd
valueFrom:
secretKeyRef:
name: test-secret
key: test-passwd
创建pod并查看
[root@master ~]# kubectl apply -f secret-pod.yaml
pod/mypod created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydeploy-6dc957dc5-9lj4j 1/1 Running 0 4h42m
mypod 1/1 Running 0 18s
进入pod查看
[root@master ~]# kubectl exec mypod -it -- /bin/bash
root@mypod:/# printenv
nginx-user=admin
nginx-passwd=qwe123QAZ
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=mypod
SERVICE_NGINX_SERVICE_PORT_NGINX=80
PWD=/
SERVICE_NGINX_SERVICE_HOST=10.111.70.83
SERVICE_NGINX_PORT=tcp://10.111.70.83:80
SERVICE_NGINX_PORT_80_TCP_PORT=80
SERVICE_NGINX_PORT_80_TCP_PROTO=tcp
PKG_RELEASE=1~bullseye
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
SERVICE_NGINX_PORT_80_TCP=tcp://10.111.70.83:80
NJS_VERSION=0.7.0
TERM=xterm
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.21.4
SERVICE_NGINX_SERVICE_PORT=80
SERVICE_NGINX_PORT_80_TCP_ADDR=10.111.70.83
_=/usr/bin/printenv
root@mypod:/#
二、通过Volume挂载的方式
[root@master ~]# cat secret-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
spec:
containers:
- name: nginx
image: nginx:1.21.4
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test-secret
mountPath: /nginx/
readOnly: true
volumes:
- name: test-secret
projected:
sources:
- secret:
name: test-secret
创建pod,并进入容器查看
[root@master ~]# kubectl exec nginx -it -- /bin/bash
root@nginx:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt nginx opt proc root run sbin srv sys tmp usr var
root@nginx:/# cd nginx
root@nginx:/nginx# ls
test-passwd test-user
root@nginx:/nginx# cat test-passwd
qwe123QAZ
root@nginx:/nginx# cat test-user
admin
root@nginx:/nginx#
最后我们来对比下Secret和ConfigMap这两种资源对象的异同点:
相同点:
key/value的形式
属于某个特定的namespace
可以导入到环境变量
可以通过目录/文件形式挂载
通过 volume 挂载的配置信息均可热更新
不同点:
Secret 可以被 ServerAccount 关联
Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
Secret 支持 Base64 加密
Secret 分为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型,而 Configmap 不区分类型
K8存储之ConfigMap、Secret的更多相关文章
- k8s配置中心-configmap,Secret密码
目录 k8s配置中心-configmap,Secret 创建ConfigMap 使用ConfigMap subPath参数 Secret 官方文档 编写secret清单 使用secret 在 Pod ...
- 二十、Pod的存储之Configmap
Pod 的存储之Configmap 一.Configmap介绍 ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.Co ...
- kubernetes系列12—二个特色的存储卷configmap和secret
本文收录在容器技术学习系列文章总目录 1.configmap 1.1 认识configmap ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.ConfigMa ...
- 3.k8s存储之ConfigMap、Secret
1.ConfigMap ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们提供了向容器 ...
- 09-kubernetes configMap secret
目录 配置容器化应用配置的方式 命令创建和测试configMap 创建一个Pod 挂在测试 命令行文件类创建方式 创建Pod测试 创建后测试 贴近实际进行测试 创建后测试 secret 举例测试 ge ...
- kubernetes Configmap secret的使用
kubernetes configmap 核心作用是让配置信息和镜像解耦,pod可以使用configmap的数据生成配置文件.如果后端的pod配置文件要改变时,只需要更改下configmap里面的数据 ...
- 第十一章 存储之ConfigMap
1.描述信息 ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们提供了向容器中注入配置 ...
- kubeedge架构与核心设计---https://bbs.huaweicloud.com/webinar/100009
今天是kubeedge的第一节课,今天主要带大家回顾一下云原生和边缘计算的发展历程 然后我们会重点介绍一下kubeedge这个项目,他的设计背景和核心理念与我们整体的架构 首先是我们来简单回归一下云原 ...
- Kubernetes之存储
存储卷概述 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态) ...
- Kubernetes学习之路(十六)之存储卷
目录 一.存储卷的概念和类型 二.emptyDir存储卷演示 三.hostPath存储卷演示 四.nfs共享存储卷演示 五.PVC和PV的概念 六.NFS使用PV和PVC 1.配置nfs存储 2.定义 ...
随机推荐
- 自研ORM框架实现工作单元模式
平时我们使用事务,需要显示的Try Catch 并且开启事务 提交事务 异常回滚事务 三步骤,使用工作单元后则只需要Commit. 1.接口定义 1 /// <summary> 2 /// ...
- [seaborn] seaborn学习笔记9-绘图实例(1) Drawing example(1)
文章目录 9 绘图实例(1) Drawing example(1) 1. Anscombe's quartet(lmplot) 2. Color palette choices(barplot) 3. ...
- RocketMQ Compaction Topic的设计与实现
本文作者:刘涛,阿里云智能技术专家. 01 Compaction Topic介绍 一般来说,消息队列提供的数据过期机制有如下几种,比如有基于时间的过期机制--数据保存多长时间后即进行清理,也有基于数据 ...
- 20 张图带你全面了解 HTTPS 协议,再也不怕面试问到了!
本文详细介绍了 HTTPS 相较于 HTTP 更安全的原因,包括对称加密.非对称加密.完整性摘要.数字证书以及 SSL/TLS 握手等内容,图文并茂.理论与实战结合.建议收藏! 1. 不安全的 HTT ...
- python之路35 MySQL 3 字段的约束条件 外键关系
字段约束条件 无符号.零填充 unsigned id int unsigned zerofill id int(5) zerofill 非空 create table t1( id int, name ...
- [LeetCode]杨辉三角 II
题目 代码 class Solution { public: vector<int> getRow(int rowIndex) { vector<int> array(rowI ...
- 代码小DEMO随笔---JS原生手机版本alert弹框
之前的随笔写的是WEB版本的弹框,这次是手机版本,欢迎路过的大佬们提出更好的写法~~ <!DOCTYPE html> <html lang="en"> &l ...
- antDesign 【NG-ZORRO、Angular】日期选择框时间段nz-range-picker设置默认选择日期及限制日期可选范围
下面的代码包含 1.只可以选择今天以后 2.只可以选择今天开始一周内 3.只能选择今天之前的 import { Component } from '@angular/core'; import dif ...
- Node.js+Koa2+TypeScript技术概览
最近几年一直使用Node.js作为后端服务平台,通过Koa2框架中间件快速搭建Web服务,但是使用JavaScript开发大型后端服务时会使程序变得难以维护,继而使用TypeScript语言开发,使编 ...
- 前端基础知识-css(一)个人学习记录
待补充 flex及其属性 https://blog.csdn.net/weixin_44706267/article/details/121291934 css3新特性 sass和less https ...