Kubernetes-9 配置管理configMap

复习

写到这里突然想复习一下之前的内容,我脑子笨学好几个月了还每整明白,不过我很勤奋啊哈哈哈!!!!

  • 首先是虚拟化的起源,K8s的出处,可以实现的功能,组件,还有就是组件的作用。
  • 然后就是安装,我这里有两种安装方式:一种是Kubeadm安装;还有就是比较麻烦的二进制安装啦(我这里的安装流程补上了哟,欢迎观看并提出使用意见),两种安装方式的不同之处
  • Kubectl是让我们管理员和kubernetes集群很好的交互方式,要牢记命令,不然就得经常-h咯
  • K8s的配置文件是声明式的,而yaml文件文件就是我们的配置文件,也是我们管理员很好的备份方式。kubectl explain可以帮到你很多
  • Pod是K8s集群里最小的单元,也是最直接的资源管理的对象。Pod的底层是docker,是一组容器的集合。Pod可以共享网络,共享存储。可以设置镜像拉取策略(imagePullPolicy)、资源限制(resource)、重启机制(restartPolicy)、节点健康检查(livenessProbe,readinessProbe)、影响Pod调度的属性:节点选择器标签(nodeSelector)、亲和性(nodeAffinity)、污点(taint)和容忍(tolerations)
  • Controller(控制器),集群上管理和运行容器的对象。股管理有状态应用的控制器statefulset、用来部署守护进程的daemonset、管理无状态应用且长期伺服型控制器deployment、一次性任务job、周期性任务cronjob。
  • Service 可以帮助我们实服务发现和负载均衡,主要是通过label实现。Service常用的类型主要有四种:ClusterIP、NodePort、LoadBalancer、ExternalName。

简介

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

创建ConfigMap

创建ConfigMap的方式有4种:

  • 通过直接在命令行指定configmap参数创建,即–from-literal
  • 通过指定文件创建,即将一个配置文件创建为一个ConfigMap --from-file=<文件>
  • 通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,–from-file=<目录>
  • 事先写好标准的configmap的yaml文件,通过kubectl create -f创建

通过命令行参数–from-literal创建

创建命令:

kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

获取yaml文件

kubectl get configmap special-config -o yaml

在这里插入图片描述

通过文件创建

vim info

name=zhangsan
age=22
space=hz
job=computer

创建命令(可以有多个–from-file)

kubectl create configmap test-config --from-file=./info

查看内容

kubectl get configmap test-config -o yaml

在这里插入图片描述
可以看到指定文件创建时configmap会创建一个key/value对,key时文件名,value时文件内容。
configmap的key为默认的文件名,还可以通过以下方法将configmap的key自定义修改

kubectl create configmap test1-config --from-file=KEYNAME=FILENAME

通过目录创建

mkdir config
echo ”1111“ > config/a.config
echo "2222" > config/b.config
kubectl create configmap dir-config --from-file=./config

查看内容

kubectl get configmap dir-config -o yaml

在这里插入图片描述
可以看到指定目录创建时configmap内容中的各个文件会创建一个key/value对,key是文件名,value是文件内容。
这里有个问题就是如果config是个三级目录呢?
答案就是–from-file指定目录是指挥识别其中的文件,忽略子目录。

通过yaml文件创建

yaml文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: yaml-config
  namespace: default
data:
  special.how: very
  special.type: charm
  my.cnf: |
    app=nginx
    name=nginx
    web=nginx

创建命令(也可以用create)

kubectl apply -f config.yaml

查看内容

kubectl get configmap yaml-config -o yaml

在这里插入图片描述
这里需要重点注意以下一个key的value有多行是的写法,要用”|”

使用ConfigMap

使用ConfigMap有三种方式:

  • 通过环境变量的方式,直接传递给Pod
    • 使用configmap中指定的key
    • 使用configmap中所有的key
  • 通过在Pod中的命令下运行的方式(启动命令中)
  • 作为volume的方式挂在到Pod内

通过环境变量使用

1通过valueFrom、configMapKeyRef、name、key指定要的key:
apiVersion: v1
kind: ConfigMap
metadata:
  name: yaml-config
  namespace: default
data:
  special.how: very
  special.type: charm
  my.cnf: |
    app=nginx
    name=nginx
    web=nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: config-pod
spec:
  containers:
  - name: test
    image: busybox
    command: [ "/bin/sh", "-c", "env"]
    env:
      - name: LEVEL_KEY
        valueFrom:
          configMapKeyRef:
            name: yaml-config
            key: special.how
      - name: log_LEVEL
        valueFrom:
          configMapKeyRef:
            name: yaml-config
            key: special.type
  restartPolicy: Never
kubectl apply -f config.yaml

查看pod日志

kubectl logs config-pod

在这里插入图片描述

2 通过envFrom、configMapRef、name使得configmap中所有的key/value对都自动变成环境变量:
apiVersion: v1
kind: ConfigMap
metadata:
  name: yaml-config
  namespace: default
data:
  special.how: very
  special.type: charm
  my.cnf: |
    app=nginx
    name=nginx
    web=nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: config-pod
spec:
  containers:
  - name: test
    image: busybox
    command: [ "/bin/sh", "-c", "env"]
    envFrom:
    - configMapRef:
        name: yaml-config
  restartPolicy: Never

然后创建

kubectl apply -f config.yaml

查看pod日志

kubectl logs config-pod

在这里插入图片描述

在启动命令中引用

在命令引用时,先设置为环境变量,之后通过$(VAR_NAME)设置容器启动命令的启动参数:

apiVersion: v1
kind: ConfigMap
metadata:
  name: yaml-config
  namespace: default
data:
  special.how: very
  special.type: charm
  my.cnf: |
    app=nginx
    name=nginx
    web=nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: config-pod
spec:
  containers:
  - name: test
    image: busybox
    command: [ "/bin/sh", "-c", "echo $(LEVEL_KEY) $(log_LEVEL)" ]
    env:
      - name: LEVEL_KEY
        valueFrom:
          configMapKeyRef:
            name: yaml-config
            key: special.how
      - name: log_LEVEL
        valueFrom:
          configMapKeyRef:
            name: yaml-config
            key: special.type
  restartPolicy: Never

然后创建

kubectl apply -f config.yaml

查看pod日志

kubectl logs config-pod

在这里插入图片描述

作为volume挂在使用

把yaml-config所有的key/value挂载进来:

apiVersion: v1
kind: ConfigMap
metadata:
  name: yaml-config
  namespace: default
data:
  special.how: very
  special.type: charm
  my.cnf: |
    app=nginx
    name=nginx
    web=nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: config-pod
spec:
  containers:
  - name: test
    image: nginx
    volumeMounts:
    - name: configmap-volume
      mountPath: /etc/config
  volumes:
    - name: configmap-volume
      configMap:
        name: yaml-config
  restartPolicy: Never

然后创建

kubectl apply -f config.yaml

查看pod日志

kubectl logs config-pod

在这里插入图片描述
可以看到,在/etc/config下以每个key为文件名,value为内容创建了多个文件

假如不想以key名最为配置文件名,可以阴阳items字段,在其中要用下能对路径path替换掉:

apiVersion: v1
kind: Pod
metadata:
  name: config-pod
spec:
  containers:
  - name: test
    image: nginx
    volumeMounts:
    - name: configmap-volume
      mountPath: /etc/config
  volumes:
    - name: configmap-volume
      configMap:
        name: yaml-config
        items:
        - key: my.cnf
          path: a.config
        - key: special.type
          path: b.config
  restartPolicy: Never

应用yaml文件,进入pod中,查看vloumePath

kuebctl apply -f config.yaml
kuebctl exec -it config-pod -- /bin/bash
ls /etc/config

在这里插入图片描述注意**:

  • 删除configmap后原来的pod不受影响,然后再删除pod后,重启pod会报错:找不到configmap的volume
  • pod起来后通过kubectl edit configmap … 修改configmap,过一会pod的内部的配置文件也会刷新

configmap热更新

先做一个deploment:

apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      app: my-nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: log-config

应用yaml文件,并查看内容

kubectl apply -f hot.yaml
kubectl exec -it `kubectl get pod -o name | cut -d "/" -f 2 |awk "NR==1{print}"` -- cat /etc/config/log_level

修改configmap的value,在此查看pod里的内容

kubectl edit configmap log-config
kubectl exec -it `kubectl get pod -o name | cut -d "/" -f 2 |awk "NR==1{print}"` -- cat /etc/config/log_level

注意

特别注意configMap如果以ENV的方式挂载至容器,修改configMap并不会实现热更新
更新configMap后:

  • 使用该configMap挂在的ENV不会同步更新
  • 使用该configMap挂载的Volume中的数据需要一段时间才能同步更新

ENV是在容器启动的时候注入的,启动之后kubernetes就不会再改变环境变量的值,且同一个namespace中的Pod的环境变量是不断累加的,参考kubernetes中的服务发现与docker容器间的环境变量传递源码探究。为了更新容器中使用ConfigMap挂载的配置,可以通滚动更新Pod方式来强制重启挂载ConfigMap,也可以在更新ConfigMap后先将副本数设置为0,然后在扩容。

先这样,想到其他的后续再补充!!!!

猜你喜欢

转载自blog.csdn.net/qq_51574197/article/details/115291759