k8s的configMap基本概念及案例

pod中两种特殊类型的存储卷:secret,configMap
  pod.spec.volumes.secret
  pod.spec.volumes.configMap
多数情况下,这两个存储卷不是给pod做存储空间来用的,而是给我们的管理员或者用户提供了从集群外部向pod内部的应用注入配置信息的方式。
configMap里放的是配置信息
configMap的主要作用是:让配置信息与镜像文件结藕,配置信息可以通过configMap注入。
简单来讲,一个configMap就是一系列配置数据的集合,而这些数据将来可以注入到pod对象中的容器中,以供使用。
而注入方式有两种:1,直接把configMap当存储卷。2,使用env的envFrom应用configMap当中所保存的数据
在每一个configMap中所有的配置信息都保存为键值格式。
configMap属于名称空间级别的资源。

configMap里面的配置信息是明文的。
secret相对于configMap,功能上是相似的,但是secret是以其他编码方式去记录配置信息的,但是也可以被解读,只不过有技术门槛,不是那么容易就被解读的。
使用base64是可以解读的:echo ******** | base64 -d
********是kubectl describe secret secretName -o yaml中的值的编码

配置容器化应用的方式:
    1.自定义命令行参数;
       args:[ ]
    2.把配置文件直接焙进镜像;
    3.环境变量;
      (1)Cloud Native的应用程序一般可直接通过环境变量加载配置;
      (2)通过entrypoint脚本来预处理变量为配置文件中的配置信息;
    4.存储卷;
pod资源环境变量的获取方式:
在pod中我们要想通过环境变量传递内容、传递数据、传递信息给pod中的容器
我们需要在容器上使用env、value、或valueFrom来获取数据;
在pod.spec.containers.env{name,value}/{valueFrom}
pod.spec.containers.env.valueFrom.{configMapKeyRef:configMap}/{fieldRef:引用配置文件的某个字段:metadata...}/{resourceFieldRef:资源限制}/{secretKeyRef:secret}

使用valueFrom方式获取配置的方式:
pod.spec.containers.env.valueFrom.configMapKeyRef
pod.spec.containers.env.valueFrom.secretKeyRef
kubectl create configMap configMapName --from-file=key1=file1url --from-file=keyN=fileNurl 此时以文件名为key,以文件内容为value
详情:kubectl create configmap --help

例:
创建一个pod,创建一个configMap,pod用env引用configMap定义的key和value。
1.先创建configMap

 1 kubectl create cm cm-1 --from-literal=nginx_port=80 --from-literal=server_name=myapp.smbands.com
 2 kubectl describe cm cm-1
 3 Name:         cm-1
 4 Namespace:    default
 5 Labels:       <none>
 6 Annotations:  <none>
 7
 8 Data
 9 ====
10 nginx_port:
11 ----
12 80
13 server_name:
14 ----
15 myapp.smbands.com
16 Events:  <none>

2.创建pod

 1 vim myapp-pod.yaml
 2 apiVersion: apps/v1
 3 kind: Deployment
 4 metadata:
 5   name: myapp-demo
 6   namespace: default
 7 spec:
 8   replicas: 1
 9   selector:
10     matchLabels:
11       app: myapp
12   template:
13     metadata:
14       labels:
15         app: myapp
16     spec:
17       containers:
18       - name: myapp
19         image: ikubernetes/myapp:v1
20         imagePullPolicy: IfNotPresent
21         ports:
22         - name: http
23           containerPort: 80
24         env:
25         - name: NGINX_SERVER_PORT
26           valueFrom:
27             configMapKeyRef:
28               name: cm-1
29               key: nginx_port
30         - name: NGINX_SERVER_NAME
31           valueFrom:
32             configMapKeyRef:
33               name: cm-1
34               key: server_name

3.运行pod查看env

1 kubectl apply -f myapp-pod.yaml
2 kubectl exec myapp-pod-5db6d54bb7-rjhkz -- printenv
3 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
4 HOSTNAME=myapp-demo-5db6d54bb7-rjhkz
5 NGINX_SERVER_PORT=80
6 NGINX_SERVER_NAME=myapp.smbands.com

当我们使用环境变量注入时,只在pod启动时加载生效
如上示例如果更改configMap中的key或value,容器中的env只会在重启容器时生效。

当然我们可以使用存储卷方式来实时获取configMap里的数据。
只不过存储卷方式,configMap挂载到pod中的某个目录下每个键成为文件名,对应值成为文件内容。也就是说,把configMap中的键值以文件方式挂载到pod中。
例:创建一个pod,创建一个configMap,pod使用挂载卷方式引用configMap里的主机配置内容,pod运行后可直接使用指定主机访问。
1.创建configMap:

 1 vim www.config
 2 server {
 3         server_name myapp.smbands.com;
 4         listen 80;
 5         root /data/web/html;
 6         }
 7 kubectl create cm cm-2 --from-file=www.conf
 8 kubectl describe cm cm-2
 9 Name:         cm-2
10 Namespace:    default
11 Labels:       <none>
12 Annotations:  <none>
13
14 Data
15 ====
16 www.conf:
17 ----
18 server {
19    server_name myapp.smbands.com;
20    listen 80;
21    root /data/web/html;
22 }
23
24 Events:  <none>

2.创建pod

 1 vim myapp-pod-1.yaml
 2 apiVersion: apps/v1
 3 kind: Deployment
 4 metadata:
 5   name: myapp-1
 6   namespace: default
 7 spec:
 8   replicas: 1
 9   selector:
10     matchLabels:
11       app: myapp
12   template:
13     metadata:
14       labels:
15         app: myapp
16     spec:
17       containers:
18       - name: myapp
19         image: ikubernetes/myapp:v1
20         imagePullPolicy: IfNotPresent
21         ports:
22         - name: http
23           containerPort: 80
24         volumeMounts:
25         - name: wwwconf
26           mountPath: /etc/nginx/conf.d/
27       volumes:
28       - name: wwwconf
29         configMap:
30           name: cm-2

3.启动pod,查看挂载点目录。

1 kubectl apply -f myapp-pod-1.yaml
2 kubectl exec myapp-1-5b5fc74c6-jd2b7 -- cat /etc/nginx/conf.d/www.conf
3 server {
4     server_name myapp.smbands.com;
5      listen 80;
6      root /data/web/html;
7 }          

此时可以修改hosts文件,在发布路径下写测试页,然后就可以curl myapp.smbands.com

4.修改configMap cm-2的listen 80 为listen 8080
kubectl edit cm cm-2 修改80为8080
等待片刻,再查看

1 kubectl exec myapp-1-5b5fc74c6-jd2b7 -- cat /etc/nginx/conf.d/www.conf
2 server {
3     server_name myapp.smbands.com;
4      listen 8080;
5      root /data/web/html;
6 }      

注意:这里储存卷挂载方式可以实时注入信息,但是不一定注入的信息都能生效。
比如此例,虽然cm-2修改为8080,pod中的配置文件也同步为8080,但是nginx的监听地址还是80,需要重载配置文件才能生效。

原文地址:https://www.cnblogs.com/Smbands/p/10876940.html

时间: 2024-07-31 07:46:25

k8s的configMap基本概念及案例的相关文章

k8s基础知识和概念

k8s基础知识和概念 一. 简介 kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制. Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务

k8s pod和容器概念的区分

一:在探讨pod和容器的区别之前,我们先谈谈为什么k8s会使用pod这个最小单元,而不是使用docker的容器,k8s既然使用了pod,当然有它的理由. 1:更利于扩展k8s不仅仅支持Docker容器,也支持rkt甚至用户自定义容器,为什么会有这么多不同的容器呢,因为容器并不是真正的虚拟机,参考我之前的博客,docker的一些概念和误区总结,此外,Kubernetes不依赖于底层某一种具体的规则去实现容器技术,而是通过CRI这个抽象层操作容器,这样就会需要pod这样一个东西,pod内部再管理多个

K8S 之 快速入门概念

一.K8S 快速入门(四级基本概念) 二.Pod/Pod控制器理解 三.Name/Namespace 四.Label/Label选择器 五.Service/Ingress 原文地址:https://blog.51cto.com/12965094/2466083

k8s通过configmap管理应用配置信息

Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap. ConfigMap 的创建和使用方式与 Secret 非常类似,主要的不同是数据以明文的形式存放. 1.configMap的创建 与 Secret 一样,ConfigMap 也支持四种创建方式: 1.1通过 --from-literal: kubectl create configmap myconfigmap --from-literal=config1=

k8s上的基础概念和术语

kubernetes基本概念和术语 kubeernetes中的大部分概念如Node,Pod,Replication Controller ,Serverce等都可以看作一种“资源对象”,几乎所有的资源对象都可以通过kubernetes提供的kubectl工具(或者API编程调用)执行增删改查等操作并将其保存在etcd中持久化存储.从这个角度来看,kubernetes其实是一个高度自动化的资源控制系统,它通过跟踪对比etcd库里保存的“资源期望状态”与当前环境中的“实际资源状态”的差异来实现自动控

k8s 之 configMap

configMap 是一种快捷的修改容器内 变量的方式,由k-v组成,当修改configmap时 容器中的变量也会相应修改.查看帮助文档 [[email protected] ~]# kubectl explain pod.spec.containers.env.valueFrom.configMapKeyRef [[email protected] ~]# kubectl explain configmap configmap 可以直接用命令创建也可以把value保存到文件中,此时文件名为ke

k8s 使用configMap

需求:制作镜像的时候有些配置信息,需要单独保存. 1. 建立configMap 1.1 由配置文件创建 比如说配置信息保存在一个文件里my.cnf,里面存了key=value一行一个的键值对. 创建命令: kubectl create configMap   myMap  --from-file=my.cnf (多个配置文件后面接多个--from-file 或者后面跟my.cnf所在的目录) 1.2  由yaml文件创建 test.yaml内容如下: apiVersion: v1 kind: C

k8s用 ConfigMap 管理配置(13)

一.ConfigMap介绍 Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap ConfigMap 的创建和使用方式与 Secret 非常类似,主要的不同是数据以明文的形式存放. 与 Secret 一样,ConfigMap 也支持四种创建方式: 1. 通过 --from-literal: kubectl create configmap myconfigmap --from-literal=config1=xx

k8s使用ConfigMap配置mysql和nginx (13)

configmap:是实现给容器内应用程序传递参数.原因:就是为了让镜像 和 配置文件解耦,以便实现镜像的可移植性和可复用性举个例子,比如我有一个pod,既要运行在正式环境,又要运行在测试环境,还有预发三个环境,但是当中的配置,是不一样的,那么我们需要准备三个不同的pod进行测试使用.configmap就是解决这个问题的,我们只需要准备不同的configmap即可,然后把不同的configmap挂载到同一个pod当中,就可以实现不同环境的pod运行,减少pod的复杂度,实现程序和pod的分离.