K8s(10)——存储之Configmap

目录

Configmap介绍

什么是configmap

应用场景

局限性

Configmap的创建

字面值创建

通过文件创建

通过目录创建

通过yaml文件创建

Configmap的使用

使用configmap设置环境变量

使用conigmap设置命令行参数

通过数据卷使用configmap

configmap热更新


Configmap介绍

什么是configmap

k8s中的存储类型一般分为Configmap、Secret和Volumes。这一节先讲configmap。

Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;

Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内

部指定目录上;容器中应用程序按照原有方式读取容器特定目录上的配置文件。

应用场景

使用 k8s 部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,

configmap 可以将配置信息和 docker 镜像解耦,以便实现镜像的可移植性和可复用

使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配

置的话,那么更新配置就很麻烦,使用 configmap 可以友好的进行配置共享。

局限性

ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1

MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数

据库或者文件服务。

Configmap的创建

字面值创建

直接用命令行产生

创建一个configmap,名字叫my-config,其中的值是直接用命令定义的,key1的值是config1,key2的值是config2。

[root@k8s2 configmap]# kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

查看,产生了新的cm

[root@k8s2 configmap]# kubectl get cm

NAME DATA AGE

kube-root-ca.crt 1 5d23h

my-config 2 4s

键值已写进去

[root@k8s2 configmap]# kubectl describe cm my-config

Name: my-config

Namespace: default

Labels: <none>

Annotations: <none>

Data

====

key2:

----

config2

key1:

----

config1

通过文件创建

通过指定文件创建一个 configmap,–from-file=<文件>

创建my-config-2,文件的名字就是key的名称,文件的内容就是值value

[root@k8s2 configmap]# kubectl create configmap my-config-2 --from-file=/etc/resolv.conf

通过目录创建

创建一个test目录,复制两个文件进去, kubectl create configmap my-config-3 --from-file=test创建my-config-3,目录中的文件名为key,文件内容是value

[root@k8s2 configmap]# mkdir test

[root@k8s2 configmap]# cp /etc/passwd test/

[root@k8s2 configmap]# cp /etc/fstab test/

[root@k8s2 configmap]# ls test/

fstab passwd

[root@k8s2 configmap]# kubectl create configmap my-config-3 --from-file=test

通过yaml文件创建

[root@k8s2 configmap]# vim cm1.yaml

apiVersion: v1

kind: ConfigMap

metadata:

name: cm1-config

data:

db_host: "172.25.0.250"

db_port: "3306"

[root@k8s2 configmap]# kubectl apply -f cm1.yaml

Configmap的使用

主要有三种
下面依次进行实验

使用configmap设置环境变量

通过环境变量引入:使用 configMapKeyRef

[root@k8s2 configmap]# vim pod1.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod1

spec:

containers:

- name: pod1

image: busybox

command: ["/bin/sh", "-c", "env"]

env:

- name: key1 #把cm1-config中的db_host这个key改名为key1

valueFrom:

configMapKeyRef:

name: cm1-config

key: db_host

- name: key2 #把cm1-config中的db_port这个key改名为key2

valueFrom:

configMapKeyRef:

name: cm1-config

key: db_port

restartPolicy: Never

运行

[root@k8s2 configmap]# kubectl apply -f pod1.yaml

创建pod后查看日志,key1和key2已写入

[root@k8s2 configmap]# kubectl delete pod pod1

另外一种,编辑pod2.yaml文件

[root@k8s2 configmap]# vim pod2.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod2

spec:

containers:

- name: pod2

image: busybox

command: ["/bin/sh", "-c", "env"]

envFrom:

- configMapRef:

name: cm1-config

restartPolicy: Never

[root@k8s2 configmap]# kubectl apply -f pod2.yaml

创建pod1,查看日志,key和value都过来了,并且是原来的名字

[root@k8s2 configmap]# kubectl delete pod pod2

使用conigmap设置命令行参数

编辑pod3.yaml文件

[root@k8s2 configmap]# vim pod3.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod3

spec:

containers:

- name: pod3

image: busybox

command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"] #输出host和port

envFrom:

- configMapRef:

name: cm1-config

restartPolicy: Never

运行

[root@k8s2 configmap]# kubectl apply -f pod3.yaml

查看pod3日志,两个值都有

[root@k8s2 configmap]# kubectl logs pod3

172.25.0.250 3306

删除实验

[root@k8s2 configmap]# kubectl delete pod pod3

通过数据卷使用configmap

把 configmap 做成 volume,挂载到 pod

[root@k8s2 configmap]# vim pod4.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod4

spec:

containers:

- name: pod4

image: busybox

command: ["/bin/sh", "-c", "cat /config/db_host"] #查看/config/db_host

volumeMounts:

- name: config-volume

mountPath: /config #把cm1-config的数据挂载到pod4的/config

volumes:

- name: config-volume

configMap:

name: cm1-config

restartPolicy: Never

创建pod4,查看日志

[root@k8s2 configmap]# kubectl apply -f pod4.yaml

[root@k8s2 configmap]# kubectl logs pod4

172.25.0.250

删除

[root@k8s2 configmap]# kubectl delete pod pod4

configmap热更新

编写nginx.conf文件

[root@k8s2 configmap]# vim nginx.conf

server {

listen 8000;

server_name _;

location / {

root /usr/share/nginx/html;

index index.html index.htm;

}

}

创建nginx.conf

[root@k8s2 configmap]# kubectl create configmap nginxconf --from-file=nginx.conf

编辑nginx.yaml文件

[root@k8s2 configmap]# vim my-nginx.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: my-nginx

spec:

replicas: 1

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx

volumeMounts:

- name: config-volume

mountPath: /etc/nginx/conf.d

volumes:

- name: config-volume

configMap:

name: nginxconf

创建

[root@k8s2 configmap]# kubectl apply -f my-nginx.yaml

查看创建成功

[root@k8s2 configmap]# kubectl get pod

NAME READY STATUS RESTARTS AGE

my-nginx-85fb986977-4bpwb 1/1 Running 0 3s

进入容器,此时端口号为80

[root@k8s2 configmap]# kubectl exec my-nginx-85fb986977-4bpwb -- cat /etc/nginx/conf.d/nginx.conf

server {

listen 8000;

server_name _;

location / {

root /usr/share/nginx/html;

index index.html index.htm;

}

}

编辑cm,修改端口

[root@k8s2 configmap]# kubectl edit cm nginxconf

修改cm后,过上几秒配置信息会同步到容器,但是容器内运行的服务并不会加载生效,且只有选择volume方式可以热更新,需要手动刷新

方式一:

[root@k8s2 configmap]# kubectl delete pod my-nginx-85fb986977-4bpwb

方式二:

[root@k8s2 configmap]# kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20230115"}}}}}'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值