免费素材下载网站,宁夏交通建设有限公司网站,frontpage导入网站,电子商务网站建设如何配置与存储
配置管理
ConfigMap
ConfigMap的创建
一般用于去存储 Pod 中应用所需的一些配置信息#xff0c;或者环境变量#xff0c;将配置于 Pod 分开#xff0c;避免应为修改配置导致还需要重新构建 镜像与容器。configmap缩写为cmkubectl create cm -h来查看创建命令…配置与存储
配置管理
ConfigMap
ConfigMap的创建
一般用于去存储 Pod 中应用所需的一些配置信息或者环境变量将配置于 Pod 分开避免应为修改配置导致还需要重新构建 镜像与容器。configmap缩写为cmkubectl create cm -h来查看创建命令
指定目录去创建
比如我在config目录中创建test目录在里面简单配置两个配置文件db.properties , redis.properties在config目录执行命令kubectl create configmap test-dir-config --from-filetest/
基于指定的文件去创建用的最多
在test目录下面创建application.yaml然后下面进行操作执行kubectl create cm spring-test-yaml --from-file/root/k8s/config/test/application.yaml这样描述cm之后里面信息的文件名就是application.yaml要是想改变文件名可以执行kubectl create cm spring-test-yaml --from-fileapp.yaml/root/k8s/config/test/application.yaml就变成了app.yaml参数比较少时可以自己指定参数执行kubectl create cm spring-test-yaml --from-literalusernameroot --from-literalpasswordadmin
cm环境变量加载与配置文件加载
cm环境变量加载
配置文件如下所示
apiVersion: v1
kind: Pod
metadata:name: test-env-cm
spec:containers:- name: env-testimage: alpinecommand: [/bin/bash, -c, env;sleep 3600]imagePullPolicy: IfNotPresentenv:- name: JAVA_VM_OPTSvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: JAVA_OPTS_TEST # 表示从上面name的cm中获取名字为key的value将其赋值给本地环境变
量 JAVA_VM_OPTS,也就是name为JAVA_VM_OPTS的值是从test-env-config这个cm的JAVA_OPTS_TEST这个key取
到的值给他- name: APPvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: APP_NAMErestartPolicy: Never# 下面是用到的config
rootmaster:~/k8s/config# kubectl describe cm test-env-config
Name: test-env-config
Namespace: default
Labels: none
Annotations: noneDataAPP_NAME:
----
springboot_env-test
JAVA_OPTS_TEST:
----
-Xms512m -Xmx512mBinaryData
Events: none
cm配置文件加载
配置文件如下所示
apiVersion: v1
kind: Pod
metadata:name: test-configfile-pod
spec:containers:- name: config-testimage: alpinecommand: [/bin/sh, -c, env;sleep 3600]imagePullPolicy: IfNotPresentenv:- name: JAVA_VM_OPTSvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: JAVA_OPTS_TEST # 表示从上面name的cm中获取名字为key的value将其赋值给本地环境变
量 JAVA_VM_OPTS,也就是name为JAVA_VM_OPTS的值是从test-env-config这个cm的JAVA_OPTS_TEST这个key取
到的值给他- name: APPvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: APP_NAMEvolumeMounts: # 加载数据卷- name: db-config # 表示加载volume属性中的哪个数据卷mountPath: /usr/local/mysql/conf # 将想要的数据卷中的文件加载到哪个目录下readOnly: true # 是否只读volumes: # 数据卷挂载可以是configmap和secret- name: db-config # 数据卷的名字随意设置configMap: # 数据卷的类型为configmapname: test-dir-config # configmap的名字必须跟想要加载的cm名字相同items: # 对configmap中的key进行映射如果不指定的话会默认将configmap中所有的key全部转换为一个个同名的文件,这里指定的话可以将path的命名和key不一样- key: db.properties # configmap中的keypath: db.properties # 将该key的值转换为文件restartPolicy: Never# 对configmap中的key进行映射如果不指定的话会默认将configmap中所有的key全部转换为一个个同名的文件,这里指定的话可以将path的命名和key不一样
# 也就是原来的key为db.xxx可以将path写为db.properties# 上面就实现了cm的配置文件加载进入容器之后查看 发现只有db.properties也就是定义了items之后只会加载path上的那个文件如果不定义则会有所有文件。
加密数据配置Secret Secret 的应用kubectl create secret -h查看命令,有三种形式如下。用第一种比较多 有一个问题是如果有特殊字符的话创建后的可能和创建时输入的不一样 比如kubectl create secret generic orig-secret --from-literalusernameadmin --from-literalpasswordds!30这里password有特殊字符所以创建后的可能不一样 当创建好之后可以直接输入名称来查看发现显示的是字节数
Docker仓库Secret配置 这里听了个大概没有实操 可以看帮助了解一下大概使用方法kubectl create secret docker-registry -h 常用场景就是配置一个secret里面有用户名和密码然后配置文件里面用到刚才这个secret如果拉取镜像没有登陆的话会使用配置文件给出的这个secret里的信息去登陆然后拉取镜像 这里直接上配置文件
apiVersion: v1
kind: Pod
metadata:name: private-image-pull-pod
spec:imagePullSecrets:- name: harbor-secret # 意思就是当拉取镜像的时候如果没有登陆则会去找到harbor-secret这个Secret配置文件的用户名和密码去登陆。containers:- name: nginximage: 192.168.113.122:8858/opensource/nginx:1.9.1command: [/bin/sh, -c, env;sleep 3600]imagePullPolicy: IfNotPresentenv:- name: JAVA_VM_OPTSvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: JAVA_OPTS_TEST # 表示从上面name的cm中获取名字为key的value将其赋值给本地环境变
量 JAVA_VM_OPTS,也就是name为JAVA_VM_OPTS的值是从test-env-config这个cm的JAVA_OPTS_TEST这个key取
到的值给他- name: APPvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: APP_NAMEvolumeMounts: # 加载数据卷- name: db-config # 表示加载volume属性中的哪个数据卷mountPath: /usr/local/mysql/conf # 将想要的数据卷中的文件加载到哪个目录下readOnly: true # 是否只读volumes: # 数据卷挂载可以是configmap和secret- name: db-config # 数据卷的名字随意设置configMap: # 数据卷的类型为configmapname: test-dir-config # configmap的名字必须跟想要加载的cm名字相同items: # 对configmap中的key进行映射如果不指定的话会默认将configmap中所有的key全部转换为一个个同名的文件,这里指定的话可以将path的命名和key不一样- key: db.properties # configmap中的keypath: db.properties # 将该key的值转换为文件restartPolicy: Never
SubPath的使用 使用 ConfigMap 或 Secret 挂载到目录的时候会将容器中源目录给覆盖掉此时我们可能只想覆盖目录中的某一个文件但是这样的操作会覆盖整个文件因此需要使用到 SubPath配置方式
定义 volumes 时需要增加 items 属性配置 key 和 path且 path 的值不能从 / 开始
在容器内的 volumeMounts 中增加 subPath 属性该值与 volumes 中 items.path 的值相同
containers:......volumeMounts:- mountPath: /etc/nginx/nginx.conf # 挂载到容器哪里name: config-volume # 使用哪个 configmap 或 secretsubPath: etc/nginx/nginx.conf # 与 volumes.[0].items.path 相同
volumes:
- configMap:name: nginx-conf # configMap 名字items: # subPath 配置key: nginx.conf # configMap 中的文件名path: etc/nginx/nginx.conf # subPath 路径subpath后面跟的是volume的路径这个路径是相对于 Volume 的根路径的而不是绝对路径。
这样也就是将volume中的etc/nginx/nginx.conf文件挂载到容器里的/etc/nginx/nginx.conf下
ComfigMap的热更新 我们通常会将项目的配置文件作为 configmap 然后挂载到 pod那么如果更新 configmap 中的配置会不会更新到 pod 中呢 这得分成几种情况 默认方式会更新更新周期是更新时间 缓存时间subPath不会更新变量形式如果 pod 中的一个变量是从 configmap 或 secret 中得到同样也是不会更新的这里说的是pod将cm里的值当作变量而不是当作volume挂载到pod中后者容器中的应用程序可以直接读取这些文件来获取配置信息。 对于 subPath 的方式我们可以取消 subPath 的使用将配置文件挂载到一个不存在的目录避免目录的覆盖然后再利用软连接的形式将该文件链接到目标位置 如下图新创建一个文件夹目录之后将subpath指到新目录然后新目录创建一个软连接指到开始的那个目录也能实现更改。 但是如果目标位置原本就有文件可能无法创建软链接此时可以基于前面讲过的 postStart 操作执行删除命令将默认的文件删除即可
第一种可以直接通过edit命令直接修改configmap
第二种通过replace替换 由于 configmap 我们创建通常都是基于文件创建并不会编写 yaml 配置文件因此修改时我们也是直接修改配置文件而 replace 是没有 --from-file参数的因此无法实现基于源配置文件的替换此时我们可以利用下方的命令实现 该命令的重点在于 --dry-run参数该参数的意思打印 yaml 文件但不会将该文件发送给 apiserver再结合 -o yaml输出 yaml 文件就可以得到一个配置好但是没有发给 apiserver 的文件然后再结合 replace 监听控制台输出得到 yaml 数据即可实现替换.kubectl create cm test-dir-config --from-file./test/ --dry-run -o yaml | kubectl replace -f-输出的yaml文件作为输出当作后面管道符后面命令-f的输入。 也就是更改test文件夹里面的东西之后然后管道符之前的是将修改后的保存成一个yaml文件传到后面去进行修改 这里不传给apiserver也就是不会生效由于 --dry-run 参数这个更新操作也是模拟的不会真正应用到集群中的资源。
配置文件不可变
跟上面的有出入上面是更新这里是不能改变。对于一些敏感服务的配置文件在线上有时是不允许修改的此时在pod中配置 configmap 时可以设置 immutable: true 来禁止修改这个命令是与最外层的命令是同级的。