• 【云原生--Kubernetes】配置管理


    一.configmap

    1.1 概述

    定义: Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。

    作用: 我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache
    等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。
    所以,k8s 中引入了 Configmap资源对象,可以当成 volume 挂载到 pod 中,实现统一的配置管理。

    特点:
    1、Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;
    2、Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上;
    3、容器中应用程序按照原有方式读取容器特定目录上的配置文件;
    4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

    知识结构图:
    在这里插入图片描述

    1.2 创建方法

    1.2.1 命令行直接创建

    直接在命令行中指定 configmap 参数创建,通过**–from-literal** 指定参数

    #创建
    kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=nginx
    #查看configmap
    kubectl describe configmap nginx-config
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    1.2.2 通过文件/目录创建

    通过指定文件创建一个 configmap,–from-file=<文件/目录>

    vim nginx.conf
    
    server {
     server_name www.nginx.com;
     listen 80;
     root /home/nginx/www/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    • 通过指定文件创建
     kubectl create configmap www-nginx --from-file=www=/opt/config/nginx.conf
     kubectl describe configmap www-nginx
    
    • 1
    • 2

    在这里插入图片描述

    • 通过目录创建
      当某些服务存在多个配置文件时,放在同一目录下,我们可以指定目录,进行创建
      在这里插入图片描述
    kubectl create configmap www-nginx2 --from-file=/opt/config/
    kubectl describe configmap www-nginx2
    
    • 1
    • 2

    在这里插入图片描述

    1.2.3 YAML创建

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nginx-conf
      labels:
        app: nginx-conf
    data:
      nginx.conf: |
        server {
         server_name www.nginx.com;
         listen 80;
         root /home/nginx/www/
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    在这里插入图片描述

    1.3 使用

    新创一个configmap用于测试

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: test
      labels:
        app: test
    data:
      xy: "xiayan"
      hi: "hello world"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    kubectl apply -f test.yaml
    
    • 1

    在这里插入图片描述

    1.3.1 变量引入

    创建一个pod,引用configmap

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: busybox
          image: busybox
          command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
          env:
            - name: LEVEL
              valueFrom:
                configMapKeyRef:
                  name: test
                  key: xy
            - name: TYPE
              valueFrom:
                configMapKeyRef:
                  name: test
                  key: hi
      restartPolicy: Never                         
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    kubectl apply -f pod-configmap.yaml 
    kubectl get pod
    kubectl logs mypod
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    1.3.2 文件挂载

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod1
    spec:
      containers:
        - name: busybox
          image: busybox
          command: [ "/bin/sh","-c","cat /etc/config/hi" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: test
      restartPolicy: Never
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    #创建pod
    kubectl apply -f cm.yaml
    #查看pod日志
    kubectl logs mypod1
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    二. Secret

    2.1 概述

    Secret 解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。

    secret 可选参数有三种:

    1.== generic==: 通用类型,通常用于存储密码数据。
    2.== tls==:此类型仅用于存储私钥和证书。
    3. docker-registry: 若要保存 docker 仓库的认证信息的话,就必须使用此种类型来创建。
    Secret 类型:

    1. Service Account:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod的/run/secrets/kubernetes.io/serviceaccount 目录中。
    2. Opaque:base64 编码格式的 Secret,用来存储密码、秘钥等。可以通过 base64 --decode 解码
      获得原始数据,因此安全性弱。
    3. kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息。

    2.2 创建

    2.2.1 命令行创建

    Secret的命令行创建方法与configmap一样,可以通过命令行或者文件/目录的方式创建,这里就不过多介绍,此处使用命名行创建,其它方法可以参照上方的方法进行创建

    把 mysql 的 root 用户的 password 创建成 secret

    kubectl create secret generic mysql-password --from-literal=password=xy123456
    # 查看secret详细信息
    kubectl describe secret mysql-password
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.2.2 YAML文件创建

    通过手动加密,基于base64加密

     echo -n 'admin' | base64
     YWRtaW4=
     echo -n 'xy123456' | base64
    eHkxMjM0NTY=
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    创建YAML

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: eHkxMjM0NTY=
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    kubectl apply -f secret.yaml 
    kubectl get secret
    kubectl describe secret mysecret
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.3 使用

    使用方法与configmap一样

    2.3.1 变量引用

    创建pod

    apiVersion: v1
    kind: Pod
    metadata:
      name: secretpod
    spec:
      containers:
      - name: busybox
        image: busybox
        command: [ "/bin/sh","-c","echo $(SECRET_USERNAME) $(SECRET_PASSWORD)" ]
        env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: mysecret
                key: username
          - name: SECRET_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysecret
                key: password
      restartPolicy: Never
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    kubectl apply -f secret-pod.yaml 
    kubectl get pod
    kubectl logs secretpod
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.3.2 文件挂载

    将 Secret 挂载到 Volume 中

    vim pod_secret_volume.yaml
    
    • 1
    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-volume-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: secret-volume
          mountPath: "/etc/secret"
          readOnly: true
      volumes:
      - name: secret-volume
        secret:
          secretName: mysecret
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    kubectl apply -f pod_secret_volume.yaml 
    kubectl get pod
    kubectl exec -it secret-volume-pod /bin/bash
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    在这里插入图片描述
    进入pod可以看到/etc/secret下有password和username两个文件,查看内容和我们创建的secret内容吻合。

  • 相关阅读:
    Three 之 three.js (webgl)鼠标/手指通过射线移动物体的简单整理封装
    HCIA使用DHCP配置eNSP,给路由器加权限并且加密
    8、数据结构-字符串、编码集
    PT_离散型随机变量下的分布:几何/超几何/幂律
    下班前几分钟,我弄清了v-model与.sync的区别
    【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)
    Kubernetes:kube-scheduler 源码分析
    java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码
    互联网Java工程师面试题·Spring篇·第三弹
    Springboot开发系统记录操作日志
  • 原文地址:https://blog.csdn.net/weixin_44175418/article/details/126168941