K8S入门篇-配置管理
一、ConfigMap
1.1 ConfigMap介绍
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap 将你的环境配置信息和容器镜像解耦,便于应用配置的修改。
ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。
1.2 ConfigMap创建
从文件夹创建,--from-file
[root@k8s-master01 ~/k8s/configmap]# tree
.
└── conf
├── redis.cfg
└── userinfo.cfg
kubectl create cm cmfromdir --from-file=conf/
查看创建结果:
[root@k8s-master01 ~/k8s/configmap]# kubectl get cm cmfromdir -oyaml
apiVersion: v1
data:
redis.cfg: |
bind 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
userinfo.cfg: |
username=admin
password=123456
kind: ConfigMap
metadata:
creationTimestamp: "2022-10-19T02:41:34Z"
name: cmfromdir
namespace: default
resourceVersion: "5046746"
uid: aa1d8f26-6165-4823-bc05-6e30fa8b3942
从文件创建,--from-file
kubectl create cm cmfromfile --from-file=conf/redis.cfg
从文件创建,--from-file,自定义key名称
kubectl create cm cmfromcustom --from-file=myredis=conf/redis.cfg --from-file=userinfo.cfg=conf/userinfo.cfg
可以自定义多个key,且cm是区分不同namespace的。
创建环境变量,从文件创建,--from-env-file
kubectl create cm cmfromenvfile --from-env-file=env.cfg
必须是key=value的形式,否则不会生效。
[root@k8s-master01 ~/k8s/configmap/conf]# cat env.cfg username=admin password=123
创建环境变量,从命令行创建,--from-literal
kubectl create cm envfromliteral --from-literal=level=INFO --from-literal=PASSWORD=redis123

1.3 ConfigMap使用
1.3.1 valueFrom
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: dp-cm
name: dp-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-cm
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: dp-cm
spec:
containers:
- image: nginx
name: nginx
env:
- name: COMM_ENV #自定义普通env变量
value: testenv
- name: USERNAME #configmap类型的变量
valueFrom: #值来源于configmap中的username,保存在USERNAME中
configMapKeyRef:
name: cmfromlitral2
key: username
- name: PASSWORD #configmap类型的变量
valueFrom: #值来源于configmap中的password,保存在PASSSWORD中
configMapKeyRef:
name: cmfromlitral2
key: password
resources: {}
status: {}
查看结果

1.3.2 envFrom
对于生成批量env,我们可以使用envFrom方式
定义一个cm

定义deploy中的pod使用envFrom:
[root@k8s-master01 ~/k8s/configmap]# cat dp-cm-envfrom.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: dp-cm-env
name: dp-cm-env-from
spec:
replicas: 1
selector:
matchLabels:
app: dp-cm-env
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: dp-cm-env
spec:
containers:
- image: nginx
name: nginx
envFrom:
- configMapRef:
name: cmfromlitral
resources: {}
status: {}
查看结果:

1.3.3 挂载文件
[root@k8s-master01 ~/k8s/configmap]# cat dp-cm-file.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: dp-cm-file
name: dp-cm-files
spec:
replicas: 1
selector:
matchLabels:
app: pod-cm-file
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: pod-cm-file
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: config
mountPath: /etc/redis.cfg #挂载目录
subPath: redis.cfg #默认是创建目录,设置这个参数后,不创建目录,而是创建文件
volumes:
- name: config
configMap:
name: cmfromfile
defaultMode: 0666 #可以设定文件权限
查看结果:

二、Secret
2.1 secret类型
- Opaque:通用型Secret,默认类型;
- kubernetes.io/service-account-token:作用于ServiceAccount,包含一个令牌,用于标识API服务账户;
- kubernetes.io/dockerconfigjson:下载私有仓库镜像使用的Secret,和宿主机的/root/.docker/config.json一致,宿主机登录后即可产生该文件;
- kubernetes.io/basic-auth:用于使用基本认证(账号密码)的Secret,可以使用Opaque取代;
- kubernetes.io/ssh-auth:用于存储ssh密钥的Secret;
- kubernetes.io/tls:用于存储HTTPS域名证书文件的Secret,可以被Ingress使用;
- bootstrap.kubernetes.io/token:一种简单的 bearer token,用于创建新集群或将新节点添加到现有集群,在集群安装时可用于自动颁发集群的证书。
通过秘钥拉取镜像仓库:
kubectl create secret docker-registry myregistrykey \ --docker-server=DOCKER_REGISTRY_SERVER \ --docker-username=DOCKER_USER \ --docker-password=DOCKER_PASSWORD \ --docker-email=DOCKER_EMAIL
使用仓库钥匙,deploy上配置:
spec:
imagePullSecrets:
- name: myregistry
containers:
2.2 Secret管理HTTPS证书
生成证书:
#自己生成key和crt文件,一般情况是申请的第三方的 openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=test.com" #生成证书 kubectl -n default create secret tls nginx-test-tls --key=tls.key --cert=tls.crt
使用证书:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-https-test
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: https-test.com
http:
paths:
- backend:
serviceName: nginx-svc
servicePort: 80
tls:
- secretName: nginx-test-tls
2.3 使用SubPath解决挂载覆盖
我们一般挂载redis.cfg希望是挂载在/etc下面,但是如果直接挂载的话,会报错,因为k8s会覆盖etc下面的所有文件,而etc下面的文件是属于只读层,所以会报错。
解决方法:使用subpath
[root@k8s-master01 ~/k8s/configmap]# cat dp-cm-file.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: dp-cm-file
name: dp-cm-files
spec:
replicas: 1
selector:
matchLabels:
app: pod-cm-file
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: pod-cm-file
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: config
mountPath: /etc/redis.cfg #挂载目录
subPath: redis.cfg #默认是创建目录,设置这个参数后,不创建目录,而是创建文件
volumes:
- name: config
configMap:
name: cmfromfile
defaultMode: 0666 #可以设定文件权限
三、ConfigMap和Secret热更新
3.1 通过文件热更新
kubectl create cm nginx-conf --from-file=nginx.conf --dry-run=client -oyaml | kubectl replace -f -
3.2 通过replace更新
直接更新yaml文件后,执行
kubect replace -f a.yaml
三、ConfigMap和Secret使用限制
3.1 使用限制

3.2 immutable的使用
immutable设置成true后,则configmap的数据不可更改。


浙公网安备 33010602011771号