ConfigMap资源

介绍

ConfigMap是让配置文件从镜像中解耦,让镜像的可移植性和可复制性。许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。这些配置信息需要与docker image解耦,你总不能每修改一个配置就重做一个image吧?ConfigMap API给我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。ConfigMap保存的值为键值方式,value长度没有限制。

创建ConfigMap

ConfigMap支持命令创建和使用清单创建。有以下四种方式创建。

1、命令直接创建 --from-literal:

“kubectl create configmap”命令使用“--from-literal”选项可在命令行直接给出键值来创建ConfigMap对象,重复使用此选项可以传递多个键值对。格式如下:

kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2
[root@k8s-master ~]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=www.ilinux.cn    #创建cm资源nginx-config,并指定两个键值
configmap/nginx-config created
[root@k8s-master ~]# kubectl get cm #查看cm资源
NAME DATA AGE
nginx-config 2 4s
[root@k8s-master ~]# kubectl describe cm/nginx-config #查看cm资源nginx-config的详细信息
Name: nginx-config
Namespace: default
Labels: <none>
Annotations: <none> Data
====
nginx_port:
----
80
server_name:
----
www.ilinux.cn
Events: <none>

2、命令行基于文件创建 --from-file:

“kubectl create configmap”命令使用“--from-file”选项即可基于文件内容来创建ConfigMap对象,同样可以重复多次使用。格式如下:

kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
[root@k8s-master ~]# mkdir configmap && cd configmap    #创建一个测试目录
[root@k8s-master configmap]# vim www.conf #编辑文件内容用作cm的value
server {
server_name www.ilinux.cn;
listen 80;
root /data/web/html/;
}
[root@k8s-master configmap]# kubectl create configmap nginx-www --from-file=www.conf=./www.conf #使用上面创建的文件来创建cm资源对象
configmap/nginx-www created
[root@k8s-master configmap]# kubectl get cm #查看cm资源对象
NAME DATA AGE
nginx-config 2 7m1s
nginx-www 1 5s
[root@k8s-master configmap]# kubectl get cm nginx-www -o yaml #查看cm资源对象nginx-www的现象信息
apiVersion: v1
data:
www.conf: |
server {
server_name www.ilinux.cn;
listen 80;
root /data/web/html/;
}
kind: ConfigMap
......

3、命令行基于目录创建 --from-file:

如果配置文件数量较多且存储于有限的目录之中,kubectl还提供了基于目录直接将多个文件分别收纳为键值数据的ConfigMap资源创建方式。将“--from-file”选项后面所跟的路径指向一个目录路径就能将目录下的所有文件一同创建于同一ConfigMap资源中,命令格式如下:

kubectl create configmap <configmap_name> --from-file=<path-to-directory>
这里假设/data/configs/nginx/conf.d/这个目录下有许多的nginx的配置文件,下面这条命令则将这个目录下的所有配置文件在创建ConfigMap资源时,会分别存储为对应的键值数据。
# kubectl create configmap nginx-config-files --from-file=/data/configs/nginx/conf.d/

4、使用资源清单创建:

基于清单文件创建ConfigMap资源时,它所使用的字段包括通常的apiVersionkindmetadata字段,以及用于存储数据的关键字段“data”

[root@k8s-master ~]# kubectl explain cm
KIND: ConfigMap
VERSION: v1
FIELDS:
apiVersion <string>
kind <string>
metadata <Object>
binaryData <map[string]string>
data <map[string]string>
[root@k8s-master configmap]# vim configmap-demo.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-demo
namespace: default
data:
log_level: INFO
log_file: /var/log/test.log
[root@k8s-master configmap]# kubectl apply -f configmap-demo.yaml
configmap/configmap-demo created
[root@k8s-master configmap]# kubectl get cm
NAME DATA AGE
configmap-demo 2 6s
nginx-config 2 23m
nginx-www 1 16m
[root@k8s-master configmap]# kubectl get cm/configmap-demo -o yaml
apiVersion: v1
data:
log_file: /var/log/test.log
log_level: INFO
kind: ConfigMap
metadata:
....

使用ConfigMap

1、环境变量方式注入到Pod

[root@k8s-master configmap]# vim pod-configmap-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-1
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
env:
- name: NGINX_SERVER_PORT
valueFrom: #下面这一段表示变量NGINX_SERVER_PORT的值来自于configmap资源nginx-config的key(nginx_port)的值
configMapKeyRef:
name: nginx-config #configmap资源名称
key: nginx_port #configmap资源里面的key名
- name: NGINX_SERVER_NAME
valueFrom:
configMapKeyRef:
name: nginx-config
key: server_name
[root@k8s-master configmap]# kubectl apply -f pod-configmap-1.yaml #创建Pod
pod/pod-cm-1 created
[root@k8s-master configmap]# kubectl get pods #查看pod
NAME READY STATUS RESTARTS AGE
pod-cm-1 1/1 Running 0 4s
[root@k8s-master configmap]# kubectl exec -it pod-cm-1 -- printenv |grep NGINX #连接pod资源pod-cm-1并执行命令printenv打印环境变量。过滤是否有上面定义的两个环境变量
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=www.ilinux.cn #测试,修改端口,可以发现使用环境变量的注入pod中的端口不会根据配置的变更而改变
[root@k8s-master configmap]# kubectl edit cm/nginx-config #编辑cm资源nginx-config将nginx_port值改为8080
......
apiVersion: v1
data:
nginx_port: ""
......
[root@k8s-master configmap]# kubectl exec -it pod-cm-1 -- printenv |grep NGINX
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=www.ilinux.cn

2、存储卷方式挂载ConfigMap

[root@k8s-master configmap]# vim pod-configmap-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-2
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/config.d/
readOnly: true
volumes: #创建一个存储卷
- name: nginxconf #存储卷名称
configMap: #使用configMap类型
name: nginx-config #指定configmap资源名称
[root@k8s-master configmap]# kubectl apply -f pod-configmap-2.yaml #创建Pod
pod/pod-cm-2 created
[root@k8s-master configmap]# kubectl get pods #查看pod
NAME READY STATUS RESTARTS AGE
pod-cm-1 1/1 Running 0 10m
pod-cm-2 1/1 Running 0 4s
[root@k8s-master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh #连接pod资源pod-cm-2,并进入到挂载目录查看。
/ # ls /etc/nginx/config.d/
nginx_port server_name
/ # cd /etc/nginx/config.d/
/etc/nginx/config.d # cat nginx_port
8080
/etc/nginx/config.d # cat server_name
www.ilinux.cn #测试,修改端口,可以发现使用volume的方式挂载configmap到容器中,支持动态更新。
[root@k8s-master configmap]# kubectl edit cm/nginx-config #编辑cm资源nginx-config将nginx_port值改为8088
apiVersion: v1
data:
nginx_port: ""
[root@k8s-master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh
/etc/nginx/config.d # cat nginx_port
8088
/etc/nginx/config.d #

示例

这里使用上面创建的configmap资源nginx-www示例。

1)编辑资源清单文件

[root@k8s-master configmap]# vim pod-configmap-3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-3
namespace: default
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxwww
mountPath: /etc/nginx/conf.d/
readOnly: true
volumes:
- name: nginxwww
configMap:
name: nginx-www

2)创建Pod

[root@k8s-master configmap]# kubectl apply -f pod-configmap-3.yaml
pod/pod-cm-3 created
[root@k8s-master configmap]# kubectl get pods -o wide #查看pod
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-cm-3 1/1 Running 0 5s 10.244.1.92 k8s-node1 <none> <none>

3)进入到Pod中查看配置文件,并创建对应的数据目录进行测试

[root@k8s-master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh    #进入到pod中
# ls /etc/nginx/conf.d
www.conf
# cat /etc/nginx/conf.d/www.conf #查看生成的www.conf配置文件
server {
server_name www.ilinux.cn;
listen 80;
root /data/web/html/;
} # nginx -T #查看当前nginx加载的配置文件
......
server {
server_name www.ilinux.cn;
listen 80;
root /data/web/html/;
}
# mkdir -p /data/web/html #创建数据目录
# echo "<h1>ConfigMap Pod Test</h1>" >> /data/web/html/index.html #创建测试文件 #这里拿kubernetes集群节点测试
[root@k8s-master ~]# vim /etc/hosts #编辑hosts文件将上面的pod和对应的域名进行解析
10.244.1.92 www.ilinux.cn
[root@k8s-master ~]# curl www.ilinux.cn #访问测试
<h1>ConfigMap Pod Test</h1>

Secret资源

介绍

Secret对象存储数据的方式及使用方式类似于ConfigMap对象,以键值方式存储数据,在Pod资源中通过环境变量或存储卷进行数据访问,解决了密码、token、密钥等敏感数据的配置问题,而不需要将这些敏感数据暴露到镜像或者pod spec中。另外,Secret对象的数据存储和打印格式为Base64编码的字符串,因此用户在创建Secret对象时也要提供此种编码格式的数据。在容器中以环境变量或存储卷的方式访问时,它们会被自动解码为明文格式。需要注意的是,如果是在Master节点上,Secret对象以非加密的格式存储在etcd中,所以需要对etcd的管理和权限进行严格控制。

Secret的四种类型

  • Opaque:自定义数据内容;base64编码,用来存储密码、秘钥、信息、证书等数据,类型标识符为generic

  • kubernetes.io/service-account-token:`Service Account的认证信息,可在创建Service Account`时由Kubernetes自动创建。

  • kubernetes.io/dockerconfigjson:用来存储Docker镜像仓库的认证信息,类型标识符为docker-regiestry

  • kubernetes.io/tls:用于为SSL通信模式存储证书和私钥文件,命令式创建时类型标识为tls

创建Secret

1、命令直接创建 --from-literal:

“kubectl create secret generic”命令使用“--from-literal”选项可在命令行直接给出键值来创建ConfigMap对象,重复使用此选项可以传递多个键值对。格式如下:

kubectl create secret generic NAME --from-literal=key1=value1 --from-literal=key2=value2
[root@k8s-master ~]# kubectl create secret generic mysql-auth --from-literal=username=root --from-literal=password=MyP@sswd     #创建secret资源mysql-auth,并指定两个键值
secret/mysql-auth created
[root@k8s-master ~]# kubectl get secret #查看secret资源
NAME TYPE DATA AGE
default-token-blm9l kubernetes.io/service-account-token 3 3d
mysql-auth Opaque 2 17s
[root@k8s-master ~]# kubectl describe secret/mysql-auth #查看secret资源mysql-auth的详细信息
Name: mysql-auth
Namespace: default
Labels: <none>
Annotations: <none> Type: Opaque Data
====
password: 8 bytes
username: 4 bytes

2、命令行基于文件创建 --from-file:

“kubectl create secret generic”命令使用“--from-file”选项即可基于文件内容来创建ConfigMap对象,同样可以重复多次使用。格式如下:

kubectl create secret generic my-secret --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
[root@k8s-master ~]# mkdir secret && cd secret
[root@k8s-master secret]# echo -n admin > ./username
[root@k8s-master secret]# echo -n 123456 > ./password
[root@k8s-master secret]#
[root@k8s-master secret]# kubectl create secret generic mysecret --from-file=username=./username --from-file=password=./password
secret/mysecret created
[root@k8s-master secret]# kubectl get secret
NAME TYPE DATA AGE
default-token-blm9l kubernetes.io/service-account-token 3 3d
mysecret Opaque 2 6s
mysql-auth Opaque 2 5m23s
[root@k8s-master secret]# kubectl get secret/mysecret -o yaml
apiVersion: v1
data:
password: MTIzNDU2 #这里可以看到secret存储的值都是base64编码格式
username: YWRtaW4=
kind: Secret
metadata
......

3、使用资源清单创建:

Secret资源是标准的Kubernetes API对象,除了标准的apiVersionkindmetadata字段,它可用的其他字段如下:

data    <map[string]string>    #"key:value"格式的数据,通常是敏感信息,数据格式需要以Base64格式编码的字符串,因此需要事先完成编码
stringData <map[string]string> #以明文格式(非Base64编码)定义的“key:value"数据;无须事先对数据进行Base64编码,而是在创建为Secret对象时自动进行编码并保存于data字段中。
type <string> #仅是为了便于编程方式处理Secret数据而提供的类型标识。
[root@k8s-master secret]# vim secret-demo.yaml
apiVersion: v1
kind: Secret
metadata:
name: secret-demo
namespace: default
stringData:
username: redis
password: redisP@ss
type: Opaque
[root@k8s-master secret]# kubectl apply -f secret-demo.yaml
secret/secret-demo created
[root@k8s-master secret]# kubectl get secret
NAME TYPE DATA AGE
default-token-blm9l kubernetes.io/service-account-token 3 3d1h
mysecret Opaque 2 28m
mysql-auth Opaque 2 33m
secret-demo Opaque 2 5s
[root@k8s-master secret]# kubectl get secret/secret-demo -o yaml
apiVersion: v1
data:
password: cmVkaXNQQHNz
username: cmVkaXM=
kind: Secret
metadata:
......

使用Secret

类似于Pod消费ConfigMap对象的方式,Secret对象可以注入为环境变量,也可以存储为存储卷形式挂载使用。因为Secret默认保存的是非明文格式,通过注入为环境变量实为不明智。

存储卷方式示例:

这里假设需要为Nginx测试创建SSL虚拟主机

1)首先创建私钥和自签证书

[root@k8s-master secret]# openssl genrsa -out nginx.key 2048
[root@k8s-master secret]# openssl req -new -x509 -key nginx.key -out nginx.crt -subj /C=CN/ST=ShenZhen/L=ShenZhen/O=DevOps/CN=www.ilinux.cn

2)创建secret

[root@k8s-master secret]# kubectl create secret tls nginx-ssl --key=./nginx.key --cert=./nginx.crt
secret/nginx-ssl created
[root@k8s-master secret]# kubectl get secret nginx-ssl
NAME TYPE DATA AGE
nginx-ssl kubernetes.io/tls 2 14s

3)编辑资源清单

[root@k8s-master secret]# vim pod-secret-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-demo
namespace: default
spec:
containers:
- name: web-server
image: nginx:1.12
volumeMounts:
- name: nginxcert
mountPath: /etc/nginx/ssl/
readOnly: true
volumes:
- name: nginxcert
secret:
secretName: nginx-ssl

4)创建pod并验证

[root@k8s-master secret]# kubectl apply -f pod-secret-demo.yaml
pod/secret-volume-demo created
[root@k8s-master secret]# kubectl exec -it secret-volume-demo -- /bin/sh
# ls /etc/nginx/ssl
tls.crt tls.key

(十)Kubernetes ConfigMap和Secret的更多相关文章

  1. kubernetes ConfigMap和Secret:配置应用程序

    7.1.配置容器化应用程序 7.2.向容器传递命令行参数 7.2.1.待Docker中定义命令与参数 1.了解ENTRYPOINT与CMD ENTRYPOINT定义容器启动时被调用的可以执行程序 CM ...

  2. kubernetes系列12—二个特色的存储卷configmap和secret

    本文收录在容器技术学习系列文章总目录 1.configmap 1.1 认识configmap ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.ConfigMa ...

  3. kubernetes Configmap secret的使用

    kubernetes configmap 核心作用是让配置信息和镜像解耦,pod可以使用configmap的数据生成配置文件.如果后端的pod配置文件要改变时,只需要更改下configmap里面的数据 ...

  4. Kubernetes configMap(配置文件存储)

    Kubernetes configMap(配置文件存储) 官方文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure ...

  5. k8s之configmap和secret

    1.configmap configmap和secret是两种特殊的存储卷,它们不是给pod提供存储空间用的,而是给管理员或者用户提供了从外部向pod内部注入信息的方式. configmap:把配置文 ...

  6. 九,configMap及secret的基本使用

    目录 制定容器配置的方式 configMap(存储数据为明文,敏感数据慎用) 创建configMap的几种方式 命令行创建和测试configMap实例 创建一个Pod 挂载测试 通过指定文件创建con ...

  7. 容器编排系统K8s之ConfigMap、Secret资源

    前文我们了解了k8s上的pv/pvc/sc资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14188621.html:今天我们主要来聊一下 ...

  8. k8s env、configmap、secret外部数据加载配置

    K8s提供了多种外部数据注入容器的方式,今天我们主要学习环境变量.ConfigMap以及Secret的使用和配置. 环境变量 在docker项目中,对一个容器添加环境变量可以在容器创建时通过-e EN ...

  9. 深入探究 K8S ConfigMap 和 Secret

    ConfigMap 1.什么是 ConfigMap? ConfigMap 是用来存储配置文件的 Kubernetes 资源对象,配置对象存储在 Etcd 中,配置的形式可以是完整的配置文件.key/v ...

随机推荐

  1. [技术博客]使用wx.downloadfile将图片下载到本地临时存储

    目录 目标 代码展示 重点讲解 目标 在上一篇技术博客中,我们生成的海报中包含图片,这些图片是存储到服务器上的,而canvas的drawimage函数只能读取本地文件,因此我们在drawCanvas之 ...

  2. ASP.NET 网站迁移 HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用

    前提:今天要做网站迁移,把A服务器上的网站迁移到B服务器上,A服务器当时的环境是.NET 4.0 ,而B服务器是.NET2.0,A服务器IIS为6.0,B服务器IIS版本为7.0  第一步,先在B服务 ...

  3. 【p6spy学习之一】p6spy使用

    一.介绍 p6spy是一个开源项目,通常使用它来跟踪数据库操作,查看程序运行过程中执行的sql语句.1.原理 p6spy将应用的数据源给劫持了,应用操作数据库其实在调用p6spy的数据源,p6spy劫 ...

  4. JavaScript如何实现日期的前一天后一天转变

    1.生成时间 var data =new Date(); 2.获得时间戳     什么是时间戳? 时间戳是指格林威治时间自1970年1月1日(00:00:00 GTM)至当前时间的总秒数.它也被称为U ...

  5. 关于nginx proxy_next_upstream 重试 和 max_fails的那些事

    背景及简要分析 前几天一次故障定位的时候发现,后端服务(java)在从故障中恢复之后,会出现大量499,且会持续较长时间无法自行恢复.根本原因是服务容量问题,处理太慢导致客户端等不了了,主动断开.不过 ...

  6. Flume的Source、Sink总结,及常用使用场景

    数据源Source RPC异构流数据交换 Avro Source Thrift Source 文件或目录变化监听 Exec Source Spooling Directory Source Taild ...

  7. Vue3.0结合bootstrap做多页面应用(2)基础配置

    接下来就是多页面应用的配置啦,安装完vue 3.0可以发现目录比2.0的精简了很多, public相当于原来的static,里面的index.html是项目的入口 ,src同以前一样,cli3.0没有 ...

  8. IdentityServer4学习及简单使用

    本文,主要用来记录IdentityServer4的简单使用. 一. IdentityServer的预备知识 要学习IdentityServer,需要了解下基于Token的验证体系,其中涉及到Token ...

  9. .NET Core MD5加密 32位和16位

    public class MD5Help { //此代码示例通过创建哈希字符串适用于任何 MD5 哈希函数 (在任何平台) 上创建 32 个字符的十六进制格式哈希字符串官网案例改编 /// <s ...

  10. springMVC中controller层方法中使用private和public问题

    楼主一直习惯使用public,偶尔手误也可能使用private,但是发觉也没啥区别,都能调用service层,注入bean. 后来做一个新项目时,发觉自己以前的写的部分功能报错,当时有点懵逼,,找了半 ...