云原生|kubernetes|关于configMap的一些学习

简介: 云原生|kubernetes|关于configMap的一些学习

前言:

configMap顾名思义--配置文件集合。主要作用是:

configmap是k8s中的应用配置管理方案,在configmap中,各个配置项都是以key-value的方式存在的,value的数据可以是一个配置文件的内容,这些配置项被保存在k8s使用的持久化存储etcd中。

这样就形成了一个k8s中的配置中心,可以独立的对configmap中的数据进行修改,然后将configmap挂载到pod中进行使用,可以以env的方式,也可以以配置文件的方式在pod中进行引用。这样配置和pod就实现了解耦,都是k8s中独立的资源对象了。




configMap的引用形式

configMap没有什么特别的类型就一种,主要作用是:

  • 将ConfigMap中的数据设置为环境变量
  • 将ConfigMap中的数据设置为命令行参数
  • 使用Volume将ConfigMap作为文件或目录挂载

(1)

将configMap中的数据设置为环境变量

命令行生成configMap文件cm-test1.yaml,其中定义了变量env1(字符串形式),它的值是CSDN。

k create cm cm-test1  --from-literal=env1=CSDN -n dev --dry-run=client -o yaml >cm-test1.yaml
k apply -f cm-test1.yaml

 将此configMap定义的变量挂载到pod内,这个pod是tomcat的:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-pod
  template:
    metadata:
      labels:
        app: tomcat-pod
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5-jre10-slim
        env:
          - name: FUCK  #在容器内的变量名称
            valueFrom:
              configMapKeyRef:
                name: cm-test1  #configMap的名称,上面的cm文件定义的名称
                key: env1   #要使用的key的值,上面只定义了这一个key

简单的验证:

部署这个tomcat的pod,等待pod启动正常如下:


[root@k8s-master ~]# k get po -A -owide
NAMESPACE     NAME                                                    READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
default       mysql-5.7.23-5f9bd6468c-h4gqn                           1/1     Running   4          3d6h    10.244.169.130   k8s-node2    <none>           <none>
dev           nginx-deployment-b785b4498-s26js                        1/1     Running   0          5h2m    10.244.36.73     k8s-node1    <none>           <none>
dev           tomcat-deployment-789b44ffcd-z7bfx                      1/1     Running   0          15m     10.244.169.142   k8s-node2    <none>           <none>

进入pod,打印变量值,验证无误。

[root@k8s-master ~]# k exec -it tomcat-deployment-789b44ffcd-z7bfx -n dev -- /bin/bash
root@tomcat-deployment-789b44ffcd-z7bfx:/usr/local/tomcat# env |grep CSDN
FUCK=CSDN
root@tomcat-deployment-789b44ffcd-z7bfx:/usr/local/tomcat# echo $FUCK
CSDN

(2)

命令行方式通过文件生成configMap,使用Volume将ConfigMap作为文件或目录挂载:

例如,现有一个tomcat,将首页index.jsp 更改后挂载到pod内,实现首页的变更

首页文件模板:

[root@k8s-master ~]# cat index.jsp 
this is a test page!!!!!
this is a test page!!!!!
this is a test page!!!!!
this is a test page!!!!!

生成configMap,这里叫cm-test ,namespace指定的是dev,最后执行此文件。

k create configmap cm-test --from-file=index.jsp -n dev -oyaml  --dry-run=client
[root@k8s-master ~]# cat cm-test.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-test
  namespace: dev
data:
  index.jsp: |
    this is a test page!!!!!
    this is a test page!!!!!
    this is a test page!!!!!
    this is a test page!!!!!
    this is a test page!!!!!
    sfsds this is a test page!!!!!
k apply -f cm-test.yaml

 

pod引用此configMap:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-pod
  template:
    metadata:
      labels:
        app: tomcat-pod
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5-jre10-slim
        volumeMounts:
        - name: conf
          mountPath: /usr/local/tomcat/webapps/ROOT/index.jsp#由于这个版本的tomcat此目录下有其它文件,为防止被覆盖,因此设置subPath
          subPath: index.jsp
        ports:
        - containerPort: 8080
      volumes:
      - name: conf
        configMap:
          name: cm-test
          items:
          - key: index.jsp   #key不能写错,cm文件里定义的就是这个
            path: index.jsp  #挂载在容器后叫什么文件名
      nodeName: k8s-node2

(3)

命令行方式,通过文件夹生成configMap清单文件(test文件夹内有三个文件):


echo hello > test/hello.txt
echo world > test/world.txt
cat test/index.jsp 
this is a test page!!!!!
this is a test page!!!!!
this is a test page!!!!!
this is a test page!!!!!
k create cm cm-test3 --from-file=test/  --dry-run=client -o yaml > cm-test3.yaml

查看命令生成的文件的内容:

[root@k8s-master ~]# cat cm-test3.yaml 
apiVersion: v1
data:
  hello.txt: |
    hello
  index.jsp: |
    this is a test page!!!!!
    this is a test page!!!!!
    this is a test page!!!!!
    this is a test page!!!!!
  world.txt: |
    world
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: cm-test3

configMap的调用还是一样的,要么挂载为文件,要么作为环境变量,和它是由文件还是文件夹还是字符串生成没有什么特别的联系,该怎么调用就怎么调用。

 

例如,集群的coredns使用的configMap:

[root@k8s-master ~]# k get cm -A
NAMESPACE     NAME                                 DATA   AGE
kube-system   calico-config                        4      2d13h
kube-system   coredns                              1      2d21h
kube-system   extension-apiserver-authentication   6      3d2h

coredns的configMap的详细内容:

[root@k8s-master ~]# cat coredns/coredns-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |   #这个就是key值了 Corefile
    .:53 {
        errors
        log
        health
        kubernetes cluster.local 10.254.0.0/18
        forward . /etc/resolv.conf
        cache 30
    }

conredns调用它的configMap:

#无关部分省略了
      containers:
      - name: coredns
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0
        imagePullPolicy: IfNotPresent
        args: [ "-conf", "/etc/coredns/Corefile" ]
        volumeMounts:
        - name: config-volume
          mountPath: /etc/coredns
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
#一些存活探针什么的也省略了
      volumes:
        - name: config-volume
          configMap:
            name: coredns
            items:
            - key: Corefile  #coredns-cm.yaml文件里定义的
              path: Corefile  #挂载的文件名称



总结:

configMap和secret是比较类似的,作用基本相同,都是对于kubernetes集群内的配置文件解耦,调用方法也基本类似,都可以通过volume挂载方式直接挂到pod相关的容器内部,也可以作为系统环境变量注入到pod相关的容器内。都可以被多个pod同时调用,比如,Apod调用了名称为B的configMap的某个变量C,Dpod也可以调用BconfigMap的变量C,Epod当然也可以,以此类推。

只是挂载为文件的时候需要注意一点,如果挂载目标路径有文件,那么,挂载文件的时候将会覆盖,如果不想覆盖,比如,挂载到pod的容器的/etc目录下,这个时候肯定不希望覆盖了,如果覆盖容器可能都启动不了,就这个subPath的情况我专门做一下解释:

文件夹+文件的情形:

此时的容器内将会有 /etc/index.jsp 这个文件夹,此文件夹下有index.html 这个文件,也就是最终容器内有/etc/index.jsp/index.html这个文件。

        volumeMounts:
        - name: conf
          mountPath: /etc/index.jsp
         # subPath: index.html
        ports:
        - containerPort: 8080
      volumes:
      - name: conf
        configMap:
          name: cm-test
          items:
          - key: index.jsp
            path: index.html  #挂载在容器后叫什么文件名

覆盖的情形:

此时的pod启动不了,启动失败,因为etc目录被覆盖了,/etc/目录下就只有一个index.html 文件了。

        volumeMounts:
        - name: conf
          mountPath: /etc/
         # subPath: index.html
        ports:
        - containerPort: 8080
      volumes:
      - name: conf
        configMap:
          name: cm-test
          items:
          - key: index.jsp
            path: index.html  #挂载在容器后叫什么文件名

正确的subPath挂载情形:

此时是挂载的文件,没有任何目录,文件名称是index.jsp,注意,这里使用了subPath,

 

        volumeMounts:
        - name: conf
          mountPath: /etc/index.jsp
          subPath: index.html
        ports:
        - containerPort: 8080
      volumes:
      - name: conf
        configMap:
          name: cm-test
          items:
          - key: index.jsp
            path: index.html  #挂载在容器后叫什么文件名
root@tomcat-deployment-d74966946-f8kpm:/etc# ls -al index.jsp 
-rw-r--r-- 1 root root 156 Oct 12 12:55 index.jsp

 

不能正确挂载configMap的情形:

subPath和path修改的不一样了,此时没有覆盖,但只有/etc/index.jsp文件夹,cm的内容是完全找不到的。

        volumeMounts:
        - name: conf
          mountPath: /etc/index.jsp
          subPath: index.html
        ports:
        - containerPort: 8080
      volumes:
      - name: conf
        configMap:
          name: cm-test
          items:
          - key: index.jsp
            path: index.jsp  #挂载在容器后叫什么文件名
root@tomcat-deployment-6dc7fc8cbd-v6wcp:/etc# ls -al index.jsp/
total 0
drwxrwxrwx 2 root root  6 Oct 12 13:00 .
drwxr-xr-x 1 root root 23 Oct 12 13:00 ..

强烈推荐的做法:

是一直使用subPath并且subPath和path保持一致(注意了,注意了,这种subPath是推荐使用的,也应该一直使用的方法哦):

        volumeMounts:
        - name: conf
          mountPath: /etc/index.jsp
          subPath: index.jsp
        ports:
        - containerPort: 8080
      volumes:
      - name: conf
        configMap:
          name: cm-test
          items:
          - key: index.jsp
            path: index.jsp  #挂载在容器后叫什么文件名


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
28 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
29天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
22天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
20天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
1月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
43 3
|
1月前
|
Cloud Native 持续交付 云计算
云原生架构的演进与挑战
随着云计算技术的不断发展,云原生架构已成为企业数字化转型的重要支撑。本文深入探讨了云原生架构的概念、发展历程、核心技术以及面临的挑战,旨在为读者提供一个全面了解云原生架构的视角。通过分析Kubernetes、Docker等关键技术的应用,以及微服务、持续集成/持续部署(CI/CD)等实践案例,本文揭示了云原生架构在提高应用开发效率、降低运维成本、增强系统可扩展性等方面的显著优势。同时,也指出了云原生架构在安全性、复杂性管理等方面所面临的挑战,并提出了相应的解决策略。
|
20天前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
23天前
|
弹性计算 运维 Cloud Native
云原生架构的崛起与未来展望
在数字化转型的浪潮中,云原生架构凭借其高效、灵活和可扩展的特性,正逐渐成为企业IT战略的核心。本文旨在探讨云原生架构的定义、关键特性、实施优势以及面临的挑战,同时展望未来的发展趋势。通过深入分析,我们期望为读者提供一个关于云原生架构全面而深入的视角,助力企业在云计算时代做出更明智的决策。
32 3

热门文章

最新文章