configMap
直接看帮助
创建 configMap#
1 | kubectl create cm -h # configMap = cm |
1 | Examples: |
Based on folder bar
基于指定的目录来创建 configMap
现在我的目录是
/home/echin/config
下面创建几个配置:
/home/echin/config/test/db.properties
:sh1
2username=root
password=admin/home/echin/config/test/redis.properties
:sh1
2host:localhost
port:6379然后在
/home/echin/config
目录下sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35hhhyc@hhhyc:~/config$ sudo kubectl create configmap test-dir-config --from-file=
test/
configmap/test-dir-config created
# 查看有哪些配置文件
hhhyc@hhhyc:~/config$ sudo kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 3d20h # 这个是证书
test-dir-config 2 8s
# 详细查看配置文件中的信息
hhhyc@hhhyc:~/config$ sudo kubectl describe cm test-dir-config
Name: test-dir-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
db.properties:
----
username=root
password=admin
redis.properties:
----
host:127.0.0.1
port:6379
BinaryData
====
Events: <none>Based on files
基于指定的文件创建 configMap
同上
配置文件:
yaml1
2
3
4
5System:
application:
name: 'test-app'
server:
port: 8080命令:
sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29hhhyc@hhhyc:~/config$ vim application.yaml
hhhyc@hhhyc:~/config$ sudo kubectl create cm config-app-yaml --from-file=application.yaml
configmap/config-app-yaml created
hhhyc@hhhyc:~/config$ sudo kubectl get cm
NAME DATA AGE
config-app-yaml 1 13s
kube-root-ca.crt 1 3d21h
test-dir-config 2 10m
hhhyc@hhhyc:~/config$ sudo kubectl describe cm config-app-yaml
Name: config-app-yaml
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
application.yaml:
----
System:
application:
name: 'test-app'
server:
port: 8080
BinaryData
====
Events: <none>但是 我上面的 example 中明明命令中 是有一个 key1 这个选项的:
sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23hhhyc@hhhyc:~/config$ sudo kubectl create cm try-yaml --from-file=app.yaml=application.yaml
configmap/try-yaml created
hhhyc@hhhyc:~/config$ sudo kubectl describe cm try-yaml
Name: try-yaml
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
app.yaml: # ****&$$$ 可以看出这里变成了 app.yaml 而不是上面的 application.yaml
----
System:
application:
name: 'test-app'
server:
port: 8080
BinaryData
====
Events: <none>其他方法不常用,因此不写了,懒得学
使用 configMap#
单个值的导入
yaml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22apiVersion: v1
kind: Pod
metadata:
name: env
spec:
containers:
- name: evn
image: alpine
restartPolicy: always
imagePullPolicy: IfNotPresent
env:
- name: GO_ENV_OPTS
valueFrom:
configMapKeyRef:
name: test-env-config
key: GO_ENV_USERNAME
- name: APP
valueFrom:
configMapKeyRef:
name: test-env-config
key: GO_ENV_PASSWORD
- name: .............除了说麻烦还是麻烦,但还是得说怎么写
yaml1
2
3
4
5- name: GO_ENV_OPTS # 容器中环境变量的 key
valueFrom: # 容器中环境变量的 value 来自哪里
configMapKeyRef: # 依赖
name: test-env-config # 这个configMap文件中
key: GO_ENV_USERNAME # 这个configMap文件中的这个key直接
kubectl create -f xx.yaml
就可以应用了差不多这么理解
数据卷挂载
yaml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21apiVersion: v1
kind: Pod
metadata:
name: env
spec:
containers:
- name: evn
image: alpine
restartPolicy: always
imagePullPolicy: IfNotPresent
volumeMounts: # 加载数据卷
- name: config-volume # 表示加载 volumes 属性中的哪个数据卷,因为有可能有多个 volumes
mountPath: "/user/local/mysql/conf" # 想要讲数据卷中的文件加载到哪个目录下
readOnly: true # 只能读
volumes: # 通过数据卷 挂载 configMap,secret
- name: config-volume # 数据卷的名字,随便设置
configMap: # 数据卷的类型为 configMap
name: config-app-yaml # configMap 的名字,必须和要加载的configMap的名字相同
items: # 对 configMap 中的 key 进行映射,如果不指定默认所有key进行转换
- key: "db.properties" # configMap中的key
path: "db.properites" # 将该key转化为文件虽然可能有点绕,梳理一下就是:
使用哪些 configMap 及 key
yaml1
2
3
4
5configMap:
name: config-app-yaml
items:
- key: "db.properties"
path: "db.properites"就是这里的声明,这里声明了要用什么 configMap 以及 这个 configMap 中的什么 key
定义有哪些数据卷
plaintext1
2
3
4
5
6
7
8
9
10
11
12
13volumes:
- name: config-volume
configMap:
name: config-app-yaml
items:
- key: "db.properties"
path: "db.properites"
- name: config-volume1
configMap:
name: config-app-yaml
items:
- key: "redis.properties"
path: "redis.properites"这里声明一个 数据卷 挂载着 这么多 configMap,像商品一样挑选
Docker 加载 数据卷
plaintext1
2
3
4
5
6
7
8
9
10
11containers:
- name: evn
image: alpine
volumeMounts:
- name: xxxx
mountPath: "/user/local/mysql/conf" # 想要讲数据卷中的文件加载到哪个目录下
readOnly: true # 只能读
volumes:
- name: xxxx
volumes:
- name: ssss这里声明一个 docker 可以加载多个数据卷,并把这些数据卷的加载数据 存放在 path 下
Docker 可以加载多个数据卷,数据卷可以映射到多个 configMap
然后直接
kubectl create -f xxx.yaml
创建即可
使用SubPath解决配置覆盖问题#
下面答案纯属gpt,因为我懒得看视频
在Kubernetes中,使用subPath
可以在挂载卷时指定特定的子路径,而不是挂载整个卷。这在需要从共享存储卷中选择特定配置文件或目录时非常有用,可以用来避免配置文件的覆盖问题。
以下是使用subPath
的一些场景和方法:
Pod中使用subPath#
在Pod的配置文件中,你可以在volumeMounts
部分使用subPath
来指定挂载的子路径:
1 | apiVersion: v1 |
在这个例子中,config-volume
是一个卷,它引用了一个ConfigMap。subPath
指定挂载specific-directory
子目录,而不是整个ConfigMap的内容。
ConfigMap和Secrets#
使用ConfigMap或Secrets来存储配置文件,并通过subPath
在Pod中挂载特定的配置文件,可以避免不同应用程序使用相同卷时的配置冲突。
多环境配置#
如果你有多个环境(如开发、测试和生产环境),并且每个环境有不同的配置文件,你可以创建不同的ConfigMap或Secrets,每个都包含特定环境的配置,并在Pod中使用适当的subPath
来挂载它们。
避免配置覆盖#
当多个容器或Pod需要挂载相同的卷,但使用不同的配置文件时,使用subPath
可以确保每个容器都挂载其特定的配置文件,而不会相互覆盖。
示例:避免配置覆盖#
假设你有一个共享的存储卷,其中包含多个应用程序的配置文件,每个应用程序的配置文件都放在不同的子目录中:
1 | spec: |
在这个例子中,shared-config
卷被挂载到两个容器中,但每个容器使用不同的subPath
来访问特定的配置目录,从而避免了配置文件的覆盖。
使用subPath
是一种灵活的方式来管理Kubernetes中的配置文件,特别是在需要从共享存储中挂载特定文件或目录时。
configMap 热更新#
默认方式:会更新,更新周期是更新时间 +缓存时间
subPath:不会更新
变量形式:如果 pod 中的一个变量是从configmap或secret中得到,同样也是不会更新的
通过 edit 命令直接修改配置
shell1
sudo kubectl edit cm configMapName
通过 replace 替换
由于
confgmap
的创建通常都是基于文件创建,并不会编写yaml
配置文件,因此修放时我们也是直接修改配置文件,而replace
是没有--from-file
参数的,因此无法实现基于源配置文件的替换,此时我们可以利用下方的命今实现
该命今的重点在于--dry-run
参数,意思是打印yaml
文件,但不会将该文件发送给apiserver
,结合-o yaml
输出yaml
文件就可以得到一个配置好但是没有发给 apiserver 的文件,然后再结合 replace 监听控制台输出得到yaml 数据即可实现替换我们先看一下容器中的配置
sh1
vim db.properties
输出 yaml 文件
sh1
2
3sudo kubectl create cm xxconfig --from-file=./test/ --dry-run -o yaml
// 下面会输出yaml 数据替换
sh1
2
3sudo kubectl create cm xxconfig --from-file=./test/ --dry-run -o yaml | sudo kubectl replace -f-
# 前面的输出进入管道后面的输入
不可变的配置 ConfigMap#
为了线上环境的稳定性,必须要 保证 某些重要配置的不可修改
在配置 configmap
时可以设置 immutable: true
来禁止修改