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资源时,它所使用的字段包括通常的apiVersion、kind和metadata字段,以及用于存储数据的关键字段“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对象,除了标准的apiVersion、kind和metadata字段,它可用的其他字段如下:

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. Android Q Beta 6 终极测试版发布!

    前言 当今手机市场可谓是百花齐放,但手机系统却屈指可数,其中Android和iOS就占据了整个手机系统市场的99%,单单Android就占据了整个手机系统市场的86%,可谓是占据绝对优势.     其 ...

  2. rabbitmq安装集群

    centos 7.3 64 172.18.39.241 k8s-mini-241172.18.39.242 k8s-mini-242172.18.39.243 k8s-master-243 vim / ...

  3. 一个web请求的全过程

    参考文档:http://www.mamicode.com/info-detail-1357508.html 名词解释DNS: DNS(Domain Name System,域名系统),因特网上作为域名 ...

  4. Golang(六)time 包的用法整理

    1. 常用结构体 Duration:type Duration int64,时间长度,对应单位包括 Nanosecond(纳秒).Microsecond(微妙).Millisecond(毫秒).Sec ...

  5. 【医学】三分钟看懂乳腺BI-RADS分级

    “BI-RADS”是指美国放射学会的乳腺影像报告和数据系统(Breast Imaging Reporting and Data System)的缩写.BI-RADS分级法将乳腺病变分为0-6级,用来评 ...

  6. Spring中Bean命名源码分析

    Spring中Bean命名源码分析 一.案例代码 首先是demo的整体结构 其次是各个部分的代码,代码本身比较简单,不是我们关注的重点 配置类 /** * @Author Helius * @Crea ...

  7. ElasticSearch 线程池类型分析之 ResizableBlockingQueue

    ElasticSearch 线程池类型分析之 ResizableBlockingQueue 在上一篇文章 ElasticSearch 线程池类型分析之 ExecutorScalingQueue的末尾, ...

  8. 解决:Java source1.6不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符

    diamond运算符,指的是JDK1.7的一个新特性.Maven默认用的是JDK1.6去编译.所以需要配置成更高的版本,有以下几种解决办法: 1.在项目pom.xml中加入下面的配置即可 <pr ...

  9. GIT 安装和使用

    目录 GIT 安装和使用 一.GIT 介绍 二.GIT 安装 三.GIT 使用 1. 配置 2. 创建版本库 3. 远程仓库 4. 分支管理 5.标签管理 6. 自定义 GIT 安装和使用 一.GIT ...

  10. 66 网络编程(五)——TCP多线程实现多人聊天室

    思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...