首页 > 其他分享 >k8s-configmap

k8s-configmap

时间:2024-02-22 15:47:45浏览次数:25  
标签:configmap name ConfigMap yaml test 2.1 k8s root

1.1什么是ConfigMap和Secret

​ ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷,ConfigMap对象用于为容器中的应用提供配置文件等信息。但是比较敏感的数据,例如密钥、证书等由Secret对象来进行配置。它们将相应的配置信息保存于对象中,而后在Pod资源上以存储卷的形式挂载并获取相关的配置,以实现配置与镜像文件的解耦。

2.1 configmap

2.1.1创建configmap的几种形式

按大类可分为两种方式,细分共有五种方式:

(一)kubectl create configmap创建

  • (1)通过命令行参数字面直接创建
  • (2)通过指定文件创建
  • (3)通过指定目录创建
  • (4)通过指定环境变量配置文件创建

(二)yaml文件创建

2.1.1.1从命令创建:

通过参数--from-literal直接指定键值对。这种方式比较适用于临时测试使用,而且不适合配置很多的情况。

[root@k8s-master01 2-21]#  kubectl create configmap test-cm1 \
> --from-literal=name=Larry \
> --from-literal=age=18 \
> --from-literal=web=www.wangming.com 
configmap/test-cm1 created

查看内容如下:

[root@k8s-master01 2-21]# kubectl get cm test-cm1 -oyaml
apiVersion: v1
data:
  age: "18"
  name: Larry
  web: www.wangming.com
kind: ConfigMap
metadata:
  creationTimestamp: "2024-02-21T07:02:46Z"
  name: test-cm1
  namespace: default
  resourceVersion: "301060"
  uid: 9ec55f02-0484-401c-b8af-f9e644ab6039

或者

[root@k8s-master01 2-21]# kubectl describe cm test-cm1
Name:         test-cm1
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
age:
----
18
name:
----
Larry
web:
----
www.wangming.com

BinaryData
====

Events:  <none>

2.1.1.2 从文件创建

通过参数--from-file来指定文件

txt.yaml文件内容如下:

[root@k8s-master01 2-21]# cat txt.yaml
server:
  port: 8080
pkslow:
  name: wyt
  age: 18
  webSite: www.wangming.link

txt1.yaml文件内容如下:

[root@k8s-master01 2-21]# cat txt1.yaml
server:
  port: 8080
pkslow:
  name: liming
  age: 20
  webSite: https://www.baidu.com

命令如下:

[root@k8s-master01 2-21]# kubectl create configmap test-cm2 \
> --from-file=txt.yaml \
> --from-file=txt1.yaml
configmap/test-cm2 created

查看内容通过-oymal查看或者describe cm查看

2.1.1.3 从目录创建

如上一种方式没有太大差别,只是--from-file后面的参数是目录,而不是文件。

命令如下:

kubectl create configmap pkslow-directory --from-file=./

2.1.1.4 从环境变量配置文件创建

这种方式如之前的从文件创建很不一样。它的(key, value)不是(文件名,文件内容),而是文件中一个个的配置。

配置文件txt.env内容如下:

PKSLOW_NAME=wangming
PKSLOW_AGE=18
PKSLOW_WEBSITE=www.baidu.com

创建命令如下:

[root@k8s-master01 2-21]# kubectl create cm test-env --from-env-file=txt.env
configmap/test-env created

查看内容如下:

[root@k8s-master01 2-21]# kubectl get cm test-env -oyaml
apiVersion: v1
data:
  PKSLOW_AGE: "18"
  PKSLOW_NAME: wangming
  PKSLOW_WEBSITE: www.baidu.com
kind: ConfigMap
metadata:
  creationTimestamp: "2024-02-21T07:12:42Z"
  name: test-env
  namespace: default
  resourceVersion: "302510"
  uid: 7611344b-37a1-4fc6-858e-770f2efdb6a4

2.1.1.5 通过yaml文件创建

通过yaml文件创建就很常规了,跟普通的kubernetes资源创建没有什么区别。先准备yaml文件如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-yaml
data:
  PKSLOW_AGE: "18"
  PKSLOW_NAME: wangming
  PKSLOW_WEBSITE: www.baidu.com
  application-uat.yaml: |-
    server:
      port: 8080
    pkslow:
      name: edge
      age: 20
      webSite: https://www.edge.com
  application.yaml: |-
    server:
      port: 8080
    pkslow:
      name: Larry
      age: 18
      webSite: www.google.com

再通过以下文件创建:

[root@k8s-master01 2-21]# kubectl apply -f configmap.yaml 
configmap/test-yaml created

2.1.2 Pod使用ConfigMap

Pod中使用ConfigMap有以下四种方式:

  1. 在容器命令和参数内
  2. 容器的环境变量
  3. 在只读卷里面添加一个文件,让应用来读取
  4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

其中第1种和第2种方式类似,只是启动命令添加环境变量,所以还是要把ConfigMap映射为容器的环境变量。

第4种方式要访问API,可以使用相关的库,如Spring Cloud Kubernetes,这里不介绍,因为我不会。

所以我们主要讲解第2、3种方式。

2.1.2.1 Pod的环境变量映射

ConfigMap的值映射到环境变量,主要有两种方式,valueFromenvFrom

2.1.2.1.1 valueFrom一一映射

通过valueFrom来配置环境变量,Pod的环境变量名与ConfigMap不必相同。

apiVersion: v1
kind: Pod
metadata:
  name: env-value-from
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: wm_NAME
          valueFrom:
            configMapKeyRef:
              name: test-yaml
              key: PKSLOW_NAME
        - name: wm_WEBSITE
          valueFrom:
            configMapKeyRef:
              name: test-yaml
              key: PKSLOW_WEBSITE
  restartPolicy: Never

查看结果:

[root@k8s-master01 2-21]# kubectl logs -f env-value-from | grep wm_NAME
wm_NAME=wangming

也可以把application-uat.yaml这种文件映射成环境变量,但因为文件内容可能是多行的,一般不会这样做。

2.1.2.1.2 envFrom全部映射

通过envFrom会把ConfigMap的所有键值对都映射到Pod的环境变量中去。使用如下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-envfrom
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
        - configMapRef:
            name: test-yaml
  restartPolicy: Never

查看环境变量如下:

[root@k8s-master01 2-21]# kubectl logs -f cm-envfrom
MY_NGINX_SERVICE_PORT=80
MY_NGINX_PORT=tcp://192.168.92.236:80
KUBERNETES_PORT=tcp://192.168.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=cm-envfrom
SHLVL=1
MY_NGINX_PORT_80_TCP_ADDR=192.168.92.236
HOME=/root
PKSLOW_WEBSITE=www.baidu.com
application.yaml=server:
  port: 8080
pkslow:
  name: Larry
  age: 18
  webSite: www.google.com
MY_NGINX_PORT_80_TCP_PORT=80
MY_NGINX_PORT_80_TCP_PROTO=tcp
MY_NGINX_PORT_80_TCP=tcp://192.168.92.236:80
KUBERNETES_PORT_443_TCP_ADDR=192.168.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
MY_NGINX_SERVICE_PORT_HTTP=80
application-uat.yaml=server:
  port: 8080
pkslow:
  name: edge
  age: 20
  webSite: https://www.edge.com
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://192.168.0.1:443
PKSLOW_AGE=18
MY_NGINX_SERVICE_HOST=192.168.92.236
KUBERNETES_SERVICE_HOST=192.168.0.1
PWD=/
PKSLOW_NAME=wangming

显然看起来这种方式更简便,不用每个环境变量都配一遍,但它可能会带来脏数据,就看怎么使用了

2.1.3 加载文件

2.1.3.1 通过volume加载

可以通过volume的方式把ConfigMap加载进Pod,如下:

apiVersion: v1
kind: Pod
metadata:
  name: mount-volume
spec:
  volumes:
    - name: config-volume
      configMap:
        name: test-yaml
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "sleep 1000000" ]
      imagePullPolicy: IfNotPresent
      volumeMounts:
        - name: config-volume
          mountPath: /data/config
  restartPolicy: Never

查看结果:

[root@k8s-master01 2-21]# kubectl exec -it mount-volume -- cat /data/config/PKSLOW_AGE
18

如果只想要ConfigMap的部分内容,并自定义文件名,可通过items来配置,如下:

apiVersion: v1
kind: Pod
metadata:
  name: mount-volume
spec:
  volumes:
    - name: config-volume
      configMap:
        name: test-yaml
        items:
          - key: application.yaml
            path: app.yaml
          - key: application-uat.yaml
            path: uat.yaml
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "sleep 1000000" ]
      imagePullPolicy: IfNotPresent
      volumeMounts:
        - name: config-volume
          mountPath: /data/config
  restartPolicy: Never

2.1.3.2 通过subPath加载

通过配置subPath字段,把文件一个一个加载到Pod中去。

apiVersion: v1
kind: Pod
metadata:
  name: pkslow-mount-subpath
spec:
  volumes:
    - name: config-volume
      configMap:
        name: pkslow-yaml
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "sleep 1000000" ]
      imagePullPolicy: IfNotPresent
      volumeMounts:
        - name: config-volume
          mountPath: /data/config/dev.yaml
          subPath: application.yaml
        - name: config-volume
          mountPath: /data/config/uat.yaml
          subPath: application-uat.yaml
  restartPolicy: Never

查看内容如下:

$ kubectl exec -it pkslow-mount-subpath -- /bin/sh
/ # cd /data/config/

/data/config # ls -lrt
total 8
-rw-r--r--    1 root     root            89 Feb 21 17:31 uat.yaml
-rw-r--r--    1 root     root            78 Feb 21 17:31 dev.yaml

/data/config # cat dev.yaml 
server:
  port: 8080
pkslow:
  name: Larry
  age: 18
  webSite: www.pkslow.com
  
/data/config # cat uat.yaml 
server:
  port: 8080
pkslow:
  name: LarryDpk
  age: 20
  webSite: https://www.pkslow.com

2.1.4 不可变的ConfigMap

可以禁止修改ConfigMap,好处有:

  • 保护应用,使之免受意外(不想要的)更新所带来的负面影响。
  • 通过大幅降低对 kube-apiserver 的压力提升集群性能,这是因为系统会关闭 对已标记为不可变更的 ConfigMap 的监视操作。

此功能特性由 ImmutableEphemeralVolumes 特性门控 来控制。你可以通过将 immutable 字段设置为 true 创建不可变更的 ConfigMap。 例如:

apiVersion: v1
kind: ConfigMap
metadata:
  ...
data:
  ...
immutable: true

一旦某 ConfigMap 被标记为不可变更,则 无法 逆转这一变化,也无法更改 databinaryData 字段的内容。你只能删除并重建 ConfigMap。 因为现有的 Pod 会维护一个对已删除的 ConfigMap 的挂载点,建议重新创建 这些 Pods。

3 总结

SecretConfigMap的创建与使用也是类似的,不再详细介绍了。

标签:configmap,name,ConfigMap,yaml,test,2.1,k8s,root
From: https://www.cnblogs.com/wytblog/p/18027467

相关文章

  • 在k8S中,Pod的容器重启策略有哪些?
    在Kubernetes(k8S)中,Pod的容器重启策略(restartPolicy)定义了当Pod中的容器终止运行时kubelet应该如何处理。Kubernetes提供了以下三种重启策略:Always:默认值,表示无论容器以何种方式退出(包括正常退出、非零退出码或其他故障),kubelet都会自动重启该容器。这个策略适用......
  • 在k8S中,如何实现Pod中容器的文件和宿主机之间相互拷贝?
    在Kubernetes(k8S)中,要实现Pod中容器的文件与宿主机之间的相互拷贝,可以使用kubectlcp命令。以下是具体的命令格式和用法:从Pod中复制文件到本地(宿主机):kubectlcp[NAMESPACE/]POD:CONTAINER_PATHLOCAL_FILEPATH例如,将名为my-pod的Pod中,容器内的/path/to/file-i......
  • 在k8S中,镜像下载策略有哪些?
    在Kubernetes(k8S)中,镜像下载策略主要体现在imagePullPolicy这个字段上,它控制了Pod中容器镜像的拉取行为。以下是三种不同的imagePullPolicy策略:Always:当imagePullPolicy设置为Always时,每次创建新Pod或重启Pod中的容器时,Kubernetes都会尝试从指定的regist......
  • 在k8S中,使用kubectl logs无法查看日志是什么原因,如何让其能够查看?
    在Kubernetes(k8S)中,使用kubectllogs命令无法查看Pod日志的原因可能有多种。以下是一些常见原因及其相应的排查和解决方法:Pod状态问题:检查Pod是否处于Running状态。如果Pod处于Pending、CrashLoopBackOff或其他非运行状态,日志可能无法获取。确保Pod正常启......
  • K8S
    K8S基础概念1、是什么kubernetes具有以下特性:服务发现和负载均衡Kubernetes可以使用DNS名称或自己的IP地址公开容器,如果进入容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定。存储编排Kubernetes允许你自动挂载你选择的存储系统,例如本地存储、......
  • k8s集群无法启动
    K8S集群启动失败一、问题现象问题的起因:来源于大年初二的停电上班后第一天:开始重启所有服务,就发现了k8s集群无法启动了。。[root@test~]#kubectlgetnodesTheconnectiontotheserver10.0.7.16:6443wasrefused-didyouspecifytherighthostorport?二、解决......
  • k8s-dashboard、helm
    目录dashboard安装dashboard1.创建SA2.集群角色绑定3.创建secret4.查看tokenhelm安装helm1.下载tar包2.解压3.配置环境变量4.配置helm补全配置helm源使用helm1.search2.pull3.执行安装3.1解压3.2将pv持久化存储关闭3.3安装3.4访问3.5获取登录的用户名和密码dashb......
  • linux安装k8s 单机版
    一、准备工作1.确认环境swapoff-a//关闭swapsetenforce0//临时关闭selinux每台机器的ip和uuid不能一样cat/sys/class/dmi/id/product_uuid//每台机器的uuid不能相同ifconfig-a//ip不能相同2.开放端口协议方向端口范围作用使用者TCP......
  • k8s排查网络丢包
    网络丢包的定义与现象​网络丢包是指部分包正常,部分包被丢弃。从现象上看就不是网络一直不通,而是:偶尔不通。速度慢(丢包导致重传)。排查思路​TODO可能原因​高并发NAT导致conntrack插入冲突​如果高并发并且做了NAT,比如使用了ip-masq-agent,对集群外的网段或公......
  • 在k8S中,如何查看一个Pod最近20分钟日志?
    在Kubernetes(k8S)中,要查看一个Pod最近20分钟的日志,可以使用kubectllogs命令结合--since参数来指定时间范围。但是请注意,kubectllogs目前并不直接支持以分钟为单位的时间参数,而是接受时间戳或者相对时间(例如秒数)。假设您想要查看最近20分钟的Pod日志,首先需要计......