k8s存储之configmap

目录

configMap 描述信息

Ⅰ、使用目录创建

Ⅱ、使用文件创建

Ⅲ、使用字面值创建

Pod 中使用 ConfigMap

Ⅰ、使用 ConfigMap 来替代环境变量

Ⅱ、用 ConfigMap 设置命令行参数

Ⅲ、通过数据卷插件使用ConfigMap

Ⅳ、ConfigMap 的热更新


configmap是专门存储我们配置文件的存储方案

configMap 描述信息

ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象。

Ⅰ、使用目录创建

[root@master1 configmap]# vim dir/game.properties
[root@master1 configmap]# vim dir/ui.properties
[root@master1 configmap]# 
[root@master1 configmap]# 
[root@master1 configmap]# kubectl create configmap game-config --from-file=./dir/
configmap/game-config created
[root@master1 configmap]# 
[root@master1 configmap]# kubectl get cm
NAME          DATA   AGE
game-config   2      16s
[root@master1 configmap]# cat dir/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
[root@master1 configmap]# 
[root@master1 configmap]# cat dir/ui.properties 
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
[root@master1 configmap]# 

—from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容。

Ⅱ、使用文件创建

只要指定为一个文件就可以从单个文件中创建 ConfigMap,跟上面的区别就是目录和文件的使用

[root@master1 configmap]# kubectl create configmap game-config-2 --from-file=./dir/game.properties 
configmap/game-config-2 created
[root@master1 configmap]# kubectl get cm
NAME            DATA   AGE
game-config     2      3m12s
game-config-2   1      3s

—from-file 这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的。

Ⅲ、使用字面值创建

使用文字值创建,利用 —from-literal 参数传递配置信息,该参数可以使用多次,格式如下:

[root@master1 configmap]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap/special-config created
[root@master1 configmap]# 
[root@master1 configmap]# kubectl get cm 
NAME             DATA   AGE
game-config      2      9m22s
game-config-2    1      6m13s
special-config   2      5s
[root@master1 configmap]# kubectl describe cm special-config 
Name:         special-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
special.how:
----
very
special.type:
----
charm
Events:  <none>
[root@master1 configmap]# 

分析:special-config表示指定的名字;后面的--from-literal表示指定的键名=值。

既然上面已经分析了三种创建方式,下面的就是一些使用案例

Pod 中使用 ConfigMap

Ⅰ、使用 ConfigMap 来替代环境变量

测试的cm是一个special-config,这之前创建好了,一个env-config

special-config这个cm是之前创建好的,这里补充它的对于的yaml文件如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

下面创建env.yaml

[root@master1 env]# cat  env.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
[root@master1 env]# 
[root@master1 env]# kubectl create -f   env.yaml 
configmap/env-config created
[root@master1 env]# 
[root@master1 env]# kubectl get cm
NAME             DATA   AGE
env-config       1      5s
game-config      2      16m
game-config-2    1      12m
special-config   2      6m50s

上面的两个是我们创建的拥有不同的键值对的ConfigMap,给我们下面创建的pod进行匹配

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: hub.atguigu.com/library/myapp:v1
      command: [ "/bin/sh", "-c", "env" ]     #打印出我们的坏境变量env
     env:
       - name: SPECIAL_LEVEL_KEY
         valueFrom:
[root@master1 configmap]# kubectl create -f  pod.yaml
pod/dapi-test-pod created
[root@master1 configmap]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]     #打印出我们的坏境变量env
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how         #导入的是special-config里面的special.how的值(very),即此时把这个值赋给SPECIAL_LEVEL_KEY
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.type
      envFrom:                #这个就表示我们上面创建的env-config就被导入了
        - configMapRef:
            name: env-config       #匹配上哪个ConfigMap根据这个
  restartPolicy: Never

会有三个不同的环境变量,第一个是env-config,它的键值对是log_level: INFO

第二个它的键名是SPECIAL_LEVEL_KEY,键值是very

第三个它的键名是SPECIAL_TYPE_KEY,键值是charm

总结:上面的就是两种不同的方式,一种通过env字段,一种通过envFrom,把我们的环境变量注入到我们的pod内部。

总结:上面的就是通过我们的ConifigMap把我们的一个坏境变量注入到我们的pod内部。

Ⅱ、用 ConfigMap 设置命令行参数

其实这个跟上面的测试大同小异,上面是打印出整个pod 的env环境信息,这里我们只是打印自己想要的那个环境信息

测试的cm是我们的special-config

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

 测试的pod的yaml文件如下

[root@master1 configmap]# cat pod1.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
   - name: test-container
     image: busybox
     command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]      #运行的命令是打印出这两个值
     env:
       - name: SPECIAL_LEVEL_KEY
         valueFrom:
           configMapKeyRef:
             name: special-config
             key: special.how
       - name: SPECIAL_TYPE_KEY
         valueFrom:
           configMapKeyRef:
             name: special-config
             key: special.type
  restartPolicy: Never
[root@master1 configmap]# 
[root@master1 configmap]# kubectl create -f  pod1.yaml 
pod/dapi-test-pod created
[root@master1 configmap]# 
[root@master1 configmap]# kubectl get pod 
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          58s
[root@master1 configmap]# kubectl logs dapi-test-pod 
very charm
[root@master1 configmap]# 

Ⅲ、通过数据卷插件使用ConfigMap

cm.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

在数据卷里面使用这个 ConfigMap,有不同的选项。最基本的就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容。。。

[root@master1 configmap]# cat pod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:alpine
      command: [ "/bin/sh", "-c", "sleep 600s" ]
      volumeMounts:        #在当前容器内进行数据卷为config-volume的挂载
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:        #这个config-volume从名字为special-config的导入来的
        name: special-config
  restartPolicy: Never
[root@master1 configmap]# 
[root@master1 configmap]# kubectl create -f  pod2.yaml
pod/dapi-test-pod created
[root@master1 configmap]# 
[root@master1 configmap]# kubectl get pod 
NAME            READY   STATUS    RESTARTS   AGE
dapi-test-pod   1/1     Running   0          3s
[root@master1 configmap]# kubectl exec -it dapi-test-pod sh 
/ # cd /etc/config
/etc/config # ls
special.how   special.type
/etc/config # cat special.how 
very/etc/config # 
/etc/config # cat special.type 
charm/etc/config # 

Ⅳ、ConfigMap 的热更新

[root@master1 configmap]# cat  pod3.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: log-config
[root@master1 configmap]# 
[root@master1 configmap]# kubectl create -f   pod3.yaml
configmap/log-config created
deployment.extensions/my-nginx created
[root@master1 configmap]# 
[root@master1 configmap]# kubectl get pod 
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-6c59667984-b7htz   1/1     Running   0          36s

分析:上面是创建一个Deployment去调用ConfigMap,调用的方式是以volumes的方式挂载进来的挂载的是log-config,挂载的目录是/etc/config 的目录中。。也就意味我们去my-nginx容器中,在/etc/config的目录下会有一个log_level的文件名,它的内容应该是INFO。

[root@master1 configmap]# kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2` cat /etc/config/log_level
INFO[root@master1 configmap]#

修改 ConfigMap

kubectl edit configmap log-config

修改 log_level 的值为 DEBUG 等待大概 10 秒钟时间,再次查看环境变量的值,发现已经更改至DEBUG了,如果对于我们nginx的应用十分友好,可以达到这样热更新状态。

[root@master1 configmap]# kubectl edit configmaps log-config 
configmap/log-config edited
[root@master1 configmap]# 
[root@master1 configmap]# kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2` cat /etc/config/log_level
INFO[root@master1 configmap]# 
[root@master1 configmap]# kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2` cat /etc/config/log_level
DEBUG[root@master1 configmap]# 

注意:configmap如果以env的方式挂载至容器,修改configmap不会实现热更新。

ConfigMap 更新后滚动更新 Pod

更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,即我们的pod不会更新,也就是pod不会死亡并启动,即pod的名字不会变,我们可以通过修改 pod annotations 的方式强制触发滚动更新。

 kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations":{"version/config": "20190411" }}}}}'

!!! 更新 ConfigMap 后: 使用该 ConfigMap 挂载的 Env 不会同步更新 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

总结:上面的所有就是如何通过ConfigMap去保存我们的一些配置文件以及一些数据。那这些数据可以通过我们被导入pod内部成为环境变量或者是所谓的文件,从而达到我们的这种热更新的目的。但是这些文件是以明文的方式去保存的,如果有一些密码文件,通过ConfigMap就不适合了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、安装准备: 1.环境 主机名 IP k8s-master 192.168.250.111 k8s-node01 192.168.250.112 k8s-node02 192.168.250.116 2.设置主机名 hostnamectl --static set-hostname k8s-master hostnamectl --static set-hostname k8s-node01 hostnamectl --static set-hostname k8s-node02 3.关闭防火墙和selinux systemctl disable firewalld systemctl stop firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 执行完成后重启虚拟机。 4.在master机器上安装ansible 执行命令:sudo yum install ansible (离线处理补充) 5.配置 ansible ssh密钥登录,此操作需要在所有机器上执行 ssh-keygen -t rsa -b 2048 回车 回车 回车 ssh-copy-id $IP #$IP为所有虚拟机,按照提示输入yes 和root密码 (密钥补充) 二、安装kubernetes集群 进入ansible安装路径 : cd /etc/ansible 将路径下的roles文件夹和hosts文件删除。 解压压缩文件kubeasz.zip文件,将解压后的内容放入当前目录下(/etc/ansible) 根据搭建集群环境要求,进入/etc/ansible/example 目录下选取 hosts.allinone.example 单节点AllInOne hosts.m-masters.example 单主多节点 hosts.s-master.example 多主多节点 红色标记的是需要自行修改的地方 修改完成后将文件名改为hosts 放入/etc/ansible/目录下。 安装prepare ansible-playbook 01.prepare.yml 安装etcd ansible-playbook 02.etcd.yml 安装kubectl命令 ansible-playbook 03.kubectl.yml 安装docker ansible-playbook 04.docker.yml 如果执行时出现报错: 可忽略。 解决方法: 在master节点上执行:curl -s -S "https://registry.hub.docker.com/v2/repositories/$@/tags/" | jq '."results"[]["name"]' |sort 所有机器上执行: wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -ivh epel-release-latest-7.noarch.rpm yum install jq -y 在重新执行: ansible-playbook 04.docker.yml 安装calico ansible-playbook 05.calico.yml 部署master节点 ansible-playbook 06.kube-master.yml 加入node节点 ansible-playbook 07.kube-node.yml 如果执行成功,k8s集群就安装好了。 三、验证安装 如果提示kubectl: command not found,退出重新ssh登陆一下,环境变量生效即可 kubectl version #查看kubernetes版本 kubectl get componentstatus # 可以看到scheduler/controller-manager/etcd等组件 Healthy kubectl cluster-info # 可以看到kubernetes master(apiserver)组件 running kubectl get node # 可以看到单 node Ready状态 kubectl get pod --all-namespaces # 可以查看所有集群pod状态 kubectl get svc --all-namespaces # 可以查看所有集群服务状态 calicoctl node status # 可以在master或者node节点上查看calico网络状态 四、安装主要组件 安装kubedns kubectl create -f manifests/kubedns 安装heapster kubectl create -f manifests/heapster 安装dashboard kubectl create -f manifests/dashboard 访问dashboard 先执行命令查看dashboard的NodePort 端口 kubectl get svc -n kube-system 访问web页面 https://masterIP: 7443 选择令牌按钮 ,用命令查询登录令牌 之前安装过 heapster 执行命令:kubectl get secret -n kube-system 查询 heapster-token-twpw4 的详细内容 执行命令:kubectl describe secret heapster-token-twpw4 -n kube-system Token就是登录令牌,复制登录就好了 安装ingress kubectl create -f manifests/ingress/ 安装EFK(elasticsearch+ fluentd + kibana) 首先进入 manifests/EFK 文件夹下 (cd /etc/ansible/manifests/EFK) 查看并修改 ceph-sercet.yaml 文件。 此key值是 ceph存储用户的token值 ,将此key值转换为base64 将文件中红色选选中部分修改为转换后的值。 修改完成后 部署 pv 和 pvc 执行命令:kubectl create -f es-pv-data.yaml kubectl create -f es-pvc-data.yaml 部署fluentd 执行命令:kubectl create -f fluentd-rbac.yml -f fluentd-configmap.yml -f fluentd-daemonset.yml 部署elasticsearch 先设置node节点中role ,指定master client data 部署位置 执行命令:kubectl get nodes kubectl label node 10.2.0.244 role=master (10.2.0.244 是我本机kubernetes 的master节点 ,所以我也将此master也部署在这里) 其余的两个节点分别是data 和 client 执行命令:kubectl create -f es-discovery-svc.yaml -f es-svc.yaml -f es-master.yaml -f es-client.yaml -f es-data.yaml 其中部署elasticsearch集群需要注意一些事项 : Master节点一般只有一个 并且提供9300 端口 客户端通讯使用 Client 节点一般提供9200端口 用于连接kibana 和 fluentd http访问使用 Data 节点是提供数据存储,持久化对data节点进行就可以。 其中 master , client , data 部署文件中 配置的 CLUSTER_NAME 指的是 elasticsearch集群名称 Java运行自行设置,最大值和最小值需要一致。 最小为-Xms256m 部署kibana 执行命令:kubectl create -f kibana-svc.yaml -f kibana.yaml 这里需要注意 kibana.yaml 文件中 参数的设置 这里的CLUSTER_NAME 也是elasticsearch部署文件中设置的集群名称。 #安装 flannel 执行命令: cd /etc/ansible/roles/flannel 先修改kube-flannel.yml文件 --iface 对应的是本机的网卡名称 command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth1" ] 修改完成后 执行: kubectl create -f kube-flannel-rbac.yml kubectl apply -f kube-flannel.yml

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值