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

     

     

  • 相关阅读:
    linux 首次登陆与线上求助
    003生信人必练
    计算器概论
    01 git 概念
    01 基因组学基本感念
    Python 函数习题
    Python字符编码详解,str,bytes
    python class
    [Leetcode]287. Find the Duplicate Number
    深度解析Word2vec
  • 原文地址:https://www.cnblogs.com/skyflask/p/16805474.html
Copyright © 2020-2023  润新知