一、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的数据不可更改。