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. laravel代码规范强制检查

    目录 介绍 代码规范检查与修复 在git commit时自动检查代码规范 后记 介绍 在团队协作开发中,代码规范是必要的.以前的规范都是自己定,然后手动检查,很难做到有效的约束. 现代的PHP,则有得 ...

  2. Navicat 连接远程数据库报错:2003 - Can‘’t connect to MySQL server on 'XX.XX.XX.XX' (10061)

    Navicat 连接远程数据库报错:2003 - Can‘’t connect to MySQL server on '172.22.69.190'  (10061) 一.原因 远程数据库使用了默认设 ...

  3. Python【每日一问】29

    问: [基础题]:给一个不多于 5 位的正整数,要求:一.求它是几位数,二.逆序印出各位数字[提高题]:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加 ...

  4. 避免maven package 打包时执行 mybatis-generator-maven-plugin 插件

    一.为什么打包时会执行该插件mybatis-generator-maven-plugin默认绑定了package的生命周期 二.如何解决如果在package和install 执行插件,修改pom中的配 ...

  5. R语言dataframe的常用操作总结

    前言:近段时间学习R语言用到最多的数据格式就是data.frame,现对data.frame常用操作进行总结,其中函数大部分来自dplyr包,该包由Hadley Wickham所作,主要用于数据的清洗 ...

  6. SQL系列(十)—— 联结(join)

    在数据库设计中,基本上都是根实体ER关系和范式设计多张表.这样更能设计出更合理.紧凑的表结构,提高有效数据存储,数据的管理维护更简便,也提高了库表的伸缩性. 但是事物总是平衡的,在很多场景中单张表的数 ...

  7. C#子线程执行完后,调用主线程的方法

    private delegate void CheckVersionNumber_CallBack(string str);//定义一个为委托 用于 检测版本 //检测版本private void m ...

  8. SpringBootSecurity学习(18)前后端分离版之 OAuth2.0 数据库(MyBatis)存储客户端

    使用Mybatis查询客户端信息 前面的例子使用了默认的jdbc配置来动态从数据库查询客户端信息,下面来改用更加灵活的mybatis来实现,改用mybatis,首先pom中换成mybatis的依赖: ...

  9. java自定义异常和throw、throws的使用

    一.自定义异常类 我们知道所有的异常都是Exception,所以我们需要自定义异常只需要继承那个Exception类就可以了.下面我们自定义一个异常类,代码如下: /** * 自定义异常, */ // ...

  10. 用Java访问带有Kerberos认证的HBase

    程序代码实例如下:    package com.hbasedemo; import java.io.IOException; import org.apache.hadoop.conf.Config ...