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

 

 

 

 

 

 

 

posted @ 2022-10-19 10:53  skyflask  阅读(256)  评论(0)    收藏  举报