JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

K8S系列学习之ConfigMap实战 k8s configmap nginx

wys521 2024-10-20 12:21:08 精选教程 261 ℃ 0 评论

Kubernetes学习路上的那些事儿,很有必要分享出来

什么是ConfigMap

官网上给出了一系列使用ConfigMap的实例,可以点击链接进行查看:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-pod-configmap/

简单的说,ConfigMap主要是配合k8s集群实现配置参数加载和业务容器运行分离的,对于开发和运维技术人员来说,“解耦”是个福音。因为难免配置参数发生变动,如果在没有“解耦”的情况下,一旦配置参数发生了改变,则需要手动的去修改业务代码,重新部署业务等,工作量大,且容易出错。

ConfigMap是专门负责维护配置参数,比如业务服务端口号、环境变量、挂载文件路径等等,作为Pod或者其它k8s集群资源,直接引用即可,一旦配置参数发生变动,只需要修改ConfigMap维护的代码即可。


实验过程

实验准备:

K8S集群环境一套,可以是多节点集群,也可以是用于测试和学习的单节点。

实验一:采用环境变量env方式调用configMap的实验。编写ConfigMap的yaml文件,并且创建Pod用于验证。文件名就叫configMap-test.yaml,详细代码如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-1
data:
  server.port: "80"
  server.addr: www.test.com
kubectl create -f configMap-test.yaml   //创建ConfigMap

kubectl get cm   //查看创建的ConfigMap

kubectl describe configmap configmap-1   //查看ConfigMap运行信息,configmap-1是自定义的名称

在这个ConfigMap中,主要维护了两个配置参数,就是data语句块中的server.port和server.addr,赋的值分别是80端口和www.test.com。然后在创建一个Pod验证,看看是否在该Pod创建并运行中能够获取ConfigMap的配置参数值。

Pod的yaml文件就叫configMap-pod.yaml.

apiVersion: v1
kind: Pod
metadata:
  name: cmpod
  namespace: default
spec:
  containers:
  - name: mynginx
    image: nginx
    env:
    - name: nginx_port
      valueFrom:
        configMapKeyRef:
          name: configmap-1
          key: server.port
    - name: nginx_addr
      valueFrom:
        configMapKeyRef:
          name: configmap-1
          key: server.addr

注意:以上Pod中是通过env语句块来调用的configMap的(自定义名称configmap-1)。

kubectl apply -f configMap-pod.yaml  //创建Pod

kubectl get pod  //查看pod

kubectl exec -it cmpod -- bash  //进入该pod内部

evn | grep nginx*   //在pod内部查看带“nginx”的环境变量

确实能够查找的到configMap中维护的两个配置参数,只是在configMap中命名是server.port和server.addr,在Pod中引用时为了区别名称,修改为nginx.port和nginx.addr了。代码的简单解释如下:

通过实验,的确实现了从外部向容器内部传配置参数的功能,实现了业务运行和配置参数的解耦。但是,如果我们尝试着修改一下configMap中的配置参数,比如将server.port端口修改为“8080”,然后再进入验证Pod内部,查看env环境变量,我们会“惊讶”的发现端口仍然是“80”,不会发生变化。

是的,采用env方式,configMap必须在pod创建前创建,且一旦创建后就无法修改了,因为即使修改了configMap的配置参数,在Pod中也是无法生效的。

实验二:采用共享卷的调用模式,即通过volumes语句块实现。只需要稍微修改一下验证pod的yaml文件,为了区别第一个实验,我们就叫configMap-pod2.yaml。

apiVersion: v1
kind: Pod
metadata:
  name: cmpod2
  namespace: default
spec:
  containers:
  - name: mynginx
    image: nginx
    volumeMounts:
    - name: nginx-conf
      mountPath: /etc/nginx/conf.d/
  volumes:
  - name: nginx-conf
    configMap:
      name: configmap-1

主要修改的代码是调用部分,通过volumes语句块来调用。configMap仍然还是configmap-1,在pod内部生成的文件放在/etc/nginx/conf.d这个文件夹下。

创建并启动cmpod2,并且进入cmpod2内部查看生成的文件,跟env调用方式不一样的是,这里分别生成了两个文件server.port和server.addr,也就是configMap中data语句块里的两个key,读取文件后正好就是赋予的两个值——“80”和www.test.com.


我们再次尝试着修改一下configMap中的配置参数,比如修改“80”为“8080”,分别进入两个验证pod中,看看是否都有变化。



实验总结

1)env调用和共享卷调用的异同,通过上面两个实验就比较清楚了,如果配置参数在初始化完成后不再更改,适合用env方式;如果配置参数在后续业务运行中可能变化,采用共享卷调用更合适一些。

2)除了env环境变量调用和共享卷调用外,configMap还可以使用命令行和加载文件等方式调用,详细信息可参考官网。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表