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

 

 

 

 

 

 

 

posted @   skyflask  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示