K8S入门篇-配置管理
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/16805474.html
目录
一、ConfigMap
1.1 ConfigMap介绍
1.2 ConfigMap创建
1.3 ConfigMap使用
二、Secret
2.1 secret类型
2.2 Secret管理HTTPS证书
2.3 使用SubPath解决挂载覆盖
三、ConfigMap和Secret热更新
3.1 通过文件热更新
3.2 通过replace更新
三、ConfigMap和Secret使用限制
3.1 使用限制
一、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
1 | kubectl create cm cmfromdir --from- file =conf/ |
查看创建结果:
1 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 | [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
1 | kubectl create cm cmfromfile --from- file =conf /redis .cfg |
从文件创建,--from-file,自定义key名称
1 | kubectl create cm cmfromcustom --from- file =myredis=conf /redis .cfg --from- file =userinfo.cfg=conf /userinfo .cfg |
可以自定义多个key,且cm是区分不同namespace的。
创建环境变量,从文件创建,--from-env-file
1 | kubectl create cm cmfromenvfile --from- env - file = env .cfg |
必须是key=value的形式,否则不会生效。
1 2 3 | [root@k8s-master01 ~ /k8s/configmap/conf ] # cat env.cfg username=admin password=123 |
创建环境变量,从命令行创建,--from-literal
1 | kubectl create cm envfromliteral --from-literal=level=INFO --from-literal=PASSWORD=redis123 |
1.3 ConfigMap使用
1.3.1 valueFrom
1 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 35 36 37 | 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:
1 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 | [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 挂载文件
1 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 | [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,用于创建新集群或将新节点添加到现有集群,在集群安装时可用于自动颁发集群的证书。
通过秘钥拉取镜像仓库:
1 2 3 4 5 | kubectl create secret docker-registry myregistrykey \ --docker-server=DOCKER_REGISTRY_SERVER \ --docker-username=DOCKER_USER \ --docker-password=DOCKER_PASSWORD \ --docker-email=DOCKER_EMAIL |
使用仓库钥匙,deploy上配置:
1 2 3 4 | spec: imagePullSecrets: - name: myregistry containers: |
2.2 Secret管理HTTPS证书
生成证书:
1 2 3 4 5 6 | #自己生成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 |
使用证书:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
1 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 | [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 通过文件热更新
1 | kubectl create cm nginx-conf --from- file =nginx.conf --dry-run=client -oyaml | kubectl replace -f - |
3.2 通过replace更新
直接更新yaml文件后,执行
1 | kubect replace -f a.yaml |
三、ConfigMap和Secret使用限制
3.1 使用限制
3.2 immutable的使用
immutable设置成true后,则configmap的数据不可更改。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律