云原生工程师-9.configmap和secret

2023-05-16

九.configmap-配置管理

个人博客

9.1-配置管理中心基本概念

9.1.1-什么是configmap

​ 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、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数 据库或者文件服务。

9.2-configmap的使用(cm)

9.2.1-通过命令行-文件和目录

直接在命令行中指定configmap参数创建 --from-literal=key=value

[root@master2 ~]# kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=servername=mytomcat
configmap/tomcat-config created
[root@master2 ~]# kubectl get configmap tomcat-config -o yaml
apiVersion: v1
data:
  servername: mytomcat
  tomcat_port: "8080"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-03-16T11:30:45Z"
  name: tomcat-config
  namespace: default
  resourceVersion: "1346681"
  uid: e9d1072c-646d-4e59-bece-9e71f097511a

通过制定文件创建 --from-file=文件

[root@master2 nginx]# kubectl create configmap vip-nginx --from-file=vip-nginx=/etc/nginx/nginx.conf
[root@master2 nginx]# kubectl get cm vip-nginx -o yaml
apiVersion: v1
data:
  vip-nginx: "user nginx; \nworker_processes auto; \nerror_log /var/log/nginx/error.log;
    \npid /run/nginx.pid; \n \ninclude /usr/share/nginx/modules/*.conf; \n \nevents
    { \n worker_connections 1024; \n} \n \n# 四层负载均衡,为两台 Master apiserver 组件提供负载均衡
    \nstream { \n \n log_format main '  - []  \n'; \n \n access_log /var/log/nginx/k8s-access.log
    main; \n \n upstream k8s-apiserver { \n server 192.168.3.110:6443; # Master1 APISERVER
    IP:PORT \n server 192.168.3.111:6443; # Master2 APISERVER IP:PORT \n }\n \n server
    { \n listen 16443; # 由于 nginx 与 master 节点复用,这个监听端口不能是 6443,否则会冲突 \n proxy_pass
    k8s-apiserver; \n } \n} \n \nhttp { \n log_format main ' -  [] \"\" ' \n '  \"\"
    ' \n '\"\" \"\"'; \n \n access_log /var/log/nginx/access.log main; \n \n sendfile
    on; \n tcp_nopush on; \n tcp_nodelay on; \n keepalive_timeout 65; \n types_hash_max_size
    2048; \n \n include /etc/nginx/mime.types; \n default_type application/octet-stream;
    \n\n server { \n listen 80 default_server; \n server_name _; \n \n location /
    { \n } \n } \n}\n"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-03-16T11:35:18Z"
  name: vip-nginx
  namespace: default
  resourceVersion: "1347379"
  uid: 15d261f6-bcee-4df1-9be7-4ddc27c51abb

通过指定目录创建

[root@master2 nginx]# kubectl create cm test-mysql --from-file=/etc/my.cnf.d/
configmap/test-mysql created
[root@master2 nginx]# kubectl get cm test-mysql -o yaml
apiVersion: v1
data:
  client.cnf: |+


    [client]

    [client-mariadb]

  mysql-clients.cnf: |+

    [mysql]

kind: ConfigMap
metadata:
  creationTimestamp: "2023-03-16T11:37:42Z"
  name: test-mysql
  namespace: default
  resourceVersion: "1347748"
  uid: 8039b6ef-f348-4deb-902b-7f787f1c36bf

9.2.2-通过编写yaml

#编写主从数据库的配置文件configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-master-slave
  labels:
    app: mysql-master-slave
data:
  master.cnf: |
    [mysqld]
    log-bin     # 主mysql激活二进制日志
  slave.cnf: |
    [mysqld]
    super-read-only     # 从mysql上面设置为只读
#通过volumeMounts挂载,busybox测试
apiVersion: v1
kind: Pod
metadata:
  name: busybox-test-cm
spec:
  containers:
  - name: busybox-test-cm
    image: docker.io/library/busybox:latest
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    volumeMounts:
    - name: mysql-config
      mountPath: /tmp/config
  volumes:
  - name: mysql-config
    configMap:
      name: mysql-master-slave
#检查结果
kubectl exec -it busybox-test-cm -- sh
/ # ls /tmp/config/
master.cnf  slave.cnf
/ # cat /tmp/config/master.cnf
[mysqld]
log-bin     # 主mysql激活二进制日志
/ # cat /tmp/config/slave.cnf
[mysqld]
super-read-only     # 从mysql上面设置为只读
#

Configmap 热更新:直接kubectl edit cm name 即可

更新后

使用该 ConfigMap 挂载的 Env 不会同步更新

使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概 10 秒)才能同 步更新

1.通过环境变量引入:configMapKeyRef

#mysql配置的configmap
apiVersion: v1 
kind: ConfigMap 
metadata: 
  name: mysql 
  labels: 
   app: mysql 
data: 
  log: "1" 
  lower: "1"
---
#pod引用上述配置文件变量
apiVersion: v1 
kind: Pod 
metadata: 
  name: mysql-pod 
spec: 
  containers: 
  - name: mysql 
    image: busybox 
    command: [ "/bin/sh", "-c", "sleep 3600" ] 
    env: 
    - name: log_bin #定义环境变量 log_bin 
      valueFrom: 
        configMapKeyRef: 
          name: mysql #指定 configmap 的名字 
          key: log #指定 configmap 中的 key 
    - name: lower #定义环境变量 lower 
      valueFrom: 
        configMapKeyRef: 
          name: mysql 
          key: lower 
  restartPolicy: Never

2.通过环境变量引入:envfrom

apiVersion: v1 
kind: Pod 
metadata: 
  name: mysql-pod-envfrom 
spec: 
  containers: 
  - name: mysql 
    image: busybox 
    imagePullPolicy: IfNotPresent 
    command: [ "/bin/sh", "-c", "sleep 3600" ] 
    envFrom: 
    - configMapRef: 
      name: mysql #指定 configmap 的名字 
  restartPolicy: Never
kubectl exec -it mysql-pod-envfrom -- /bin/sh 
/ # printenv 
lower=1 
log=1 

9.2.3-最佳实例主从数据库

apiVersion: v1
data:
  slave.sh: |+
    masterip=`getent hosts mysql-master-slave-0.mysql-master-slave.default.svc.cluster.local | awk '{print $1}'`
    hostip=`cat /etc/hosts | grep svc | awk '{print $1}'`
    mysql -uroot -p000000 -h mysql-master-slave-0.mysql-master-slave.default.svc.cluster.local -e "grant replication slave on *.* to 'admin'@'$hostip' identified by '000000';"
    mysql -uroot -e "CHANGE MASTER TO MASTER_HOST='$masterip', MASTER_USER='admin', MASTER_PASSWORD='000000';start slave;"
kind: ConfigMap
metadata:
  name: slave-sh
  namespace: default
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-master-slave
  labels:
    app: mysql-master-slave
data:
  master.cnf: |
    [mysqld]
    log-bin     # 主mysql激活二进制日志
  slave.cnf: |
    [mysqld]
    super-read-only     # 从mysql上面设置为只读
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-master-slave
  labels:
    app: mysql-master-slave
spec:
  ports:
  - name: mysql
    port: 3306
  clusterIP: None
  selector:
    app: mysql-master-slave
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-read
  labels:
    app: mysql-master-slave
spec:
  type: NodePort
  ports:
  - name: mysql
    port: 3306
    nodePort: 30337
  selector:
    app: mysql-master-slave
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master-slave
spec:
  selector:
    matchLabels:
      app: mysql-master-slave
  serviceName: mysql-master-slave
  replicas: 2
  template:
    metadata:
      labels:
        app: mysql-master-slave
    spec:
      initContainers:
      - name: init-mysql
        image: docker.io/library/mysql:5.7
        command:
        - sh
        - -c
        - |
          host_number=$(echo $HOSTNAME | sed 's/[^0-9]*//g')
          echo [mysqld] > /mnt/conf.d/server-id.cnf
          if [ "$host_number" -eq "0" ]; then
            server_id="100"
            echo "server-id=${server_id}" >> /mnt/conf.d/server-id.cnf
            cp /mnt/config-map/master.cnf /mnt/conf.d/
          else
            server_id=$((100 + host_number))
            echo "server-id=${server_id}" >> /mnt/conf.d/server-id.cnf
            cp /mnt/config-map/slave.cnf /mnt/conf.d/
          fi
        volumeMounts:
        - name: conf
          mountPath: /mnt/conf.d
        - name: config-map
          mountPath: /mnt/config-map
      containers:
      - name: mysql
        image: docker.io/library/mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "000000"
        ports:
        - name: mysql
          containerPort: 3306
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
          subPath: mysql
        - name: conf
          mountPath: /etc/mysql/conf.d
        - name: slave-sh
          mountPath: /root/
        livenessProbe:
          exec:
            command: ["mysqladmin", "ping"]
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command: ["mysqladmin","ping"]
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
      volumes:
      - name: conf
        emptyDir: {}
      - name: config-map
        configMap:
          name: mysql-master-slave
      - name: slave-sh
        configMap:
          name: slave-sh
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: nfs
      resources:
        requests:
          storage: 1Gi

十.配置管理中心Secret

10.1secret基本概念

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

要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 pod 拉取 镜像时使用。

secret可选的参数:

generic: 通用类型,通常用于存储密码数据。

tls:此类型仅用于存储私钥和证书。

docker-registry: 若要保存 docker 仓库的认证信息的话,就必须使用此种类型来创 建。

secret的类型:

Service Account:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录 中。

Opaque:base64 编码格式的 Secret,用来存储密码、秘钥等。可以通过 base64 – decode 解码获得原始数据,因此安全性弱

kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息。

10.2secret的使用

1.配置mysql的root的password

kubectl create secret generic mysql-password --from-literal=password=Mysql123456
#--from-literal=key=value
[root@master2 ~]# kubectl get secret
NAME             TYPE     DATA   AGE
mysql-password   Opaque   1      26s
[root@master2 ~]# kubectl get secret mysql-password -o yaml
apiVersion: v1
data:
  password: TXlzcWwxMjM0NTY=
kind: Secret
metadata:
  creationTimestamp: "2023-03-19T06:40:04Z"
  name: mysql-password
  namespace: default
  resourceVersion: "1963925"
  uid: 2bea85f9-f0cc-407b-b46b-3b41b9899f9e
type: Opaque
#password的值是加密的
#但secret 的加密是一种伪加密,它仅仅是将数据做了 base64 的编码.
#解码
[root@master2 secret]# echo TXlzcWwxMjM0NTY= | base64 -d
Mysql123456
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    test: mysql
spec:
  containers:
  - name: mysql-test
    image: docker.io/library/mysql:5.7
    ports:
      - name: mysql
        containerPort: 3306
    env:
     - name: MYSQL_ROOT_PASSWORD
       valueFrom:
         secretKeyRef:
           name: mysql-password #secret名
           key: password #secret 中key值
[root@master2 secret]# kubectl exec -it mysql -- /bin/bash
bash-4.2# printenv |grep MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=Mysql123456

将secret挂载到volume中

apiVersion: v1
kind: Pod
metadata:
  name: busybox-test
  labels:
    test: busybox
spec:
  containers:
  - name: mysql-test
    image: docker.io/library/busybox:latest
    command: ["sh","-c","sleep 3600"]
    volumeMounts:
    - name: mysqlpassword
      mountPath: /root/
      readOnly: true
  volumes:
  - name: mysqlpassword
    secret:
      secretName: mysql-password
[root@master2 secret]# kubectl exec -it busybox-test -- sh
/ #
/ # ls /root/
password
/ # cat /root/password
Mysql123456/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

云原生工程师-9.configmap和secret 的相关文章

随机推荐

  • 解决centos9安装mongodb数据库错误:mongod: error while loading shared libraries: libcrypto.so.1.1: cannot open

    今天进行mongodb数据库在linux进行环境搭建搭建到了一半就开始出现错误 mongod error while loading shared libraries libcrypto so 1 1 cannot open shared
  • [模板] 线性筛素数 (欧拉筛)

    模板 素数筛 P3383 模板 线性筛素数 洛谷 计算机科学教育新生态 题目背景 本题已更新 xff0c 从判断素数改为了查询第 k 小的素数 提示 xff1a 如果你使用 cin 来读入 xff0c 建议使用 std ios sync w
  • WSL+Systemd+Gnome+VcXsrv+CUDAToolkit 安装

    我的版本信息 wsl xff1a PS C Users kirk gt wsl update 正在检查更新 无更新使用 内核版本 xff1a 5 10 102 1 Ubuntu xff1a kirk 64 KirkComputer lsb
  • java上位机

    可以做 xff0c 我有做好的底层通讯程序 xff0c 无需了解通讯协议 xff0c 只要正确配置就可以读出相应的寄存器的值 xff0c 数据类型支持short xff0c int xff0c float等 xff0c 我也有做好的界面 x
  • java上位机的界面

  • Lanelet2高精地图3——LineString(线串)介绍

    LineString线串是两个或者多个点生成的有序数组 xff0c 用来描述地图元素的形状 线串可以通过高度离散化实现 xff0c 来描述任何一维形式 xff0c 并应用于地图上的任何可物理观察到的部分 与样条曲线相比 xff0c 线串可以
  • 香橙派的使用入门无屏幕安装系统

    首先我购买的是香橙派pipc这款开发板价格在105块 xff0c 需要购买散热片以及风扇 电源需要一个5v3安的电源 xff0c 系统有时候会运行不正常 一开始没有屏幕就需要一根usb转ttl的串口线 xff0c 注意不是usb转232 软
  • 香橙派进入系统后设置ip

    Debian 可以配置静态IP 动态IP使Debian连上互联网 用户使用nano编辑器编辑interface网卡配置文件 xff0c 为Debian系统指定本网络中的唯一IP地址 xff0c 使其能上网 方法 步骤 将用户当前目录切换到网
  • 香橙派更改中文界面以及安装输入法

    第一步更新语言包 sudo apt get install locales 第二部选择 sudo dpkg reconfigure locales 找到语言包空格键选中变 最后安装 scim 输入法相关 xff1a apt get inst
  • 香橙派添加启动脚本

    sudo nano etc rc local 后台启动 nohup root frp frpc c root frp frpc ini amp 查询日志 cat nohup out java jar root aaa jar
  • app远程访问plc实现方法

    工业上越来越多的人需要将局域网内的plc数据或者单片机的数据上传到手机app上 xff0c 实现远程的操作监控 实现的方法是借助plc支持modbus协议 xff0c 通过dtu模块实现串口透传到云服务器 xff0c 之后开发手机app实现
  • java访问西门子300plc以及仿真的测试方法

    安装step7软件 支持win7 64位系统 安装仿真软件plc sim 之后以管理员身份运行Nettoplcsim 下bin下的NetToPLCsim
  • Shell 批量拉取docker镜像(当前目录和指定目录)

    批量拉取docker容器镜像 拉取当前文件夹内的容器镜像 xff1a span class token shebang important bin sh span span class token comment 当前路径 span spa
  • docker-compose部署Jenkins+Gitlab CICD

    docker compose 搭建CICD jenkins 43 gitlab 1 修改yum源 xff08 1 xff09 备份原来的yum源 mv etc yum repos d CentOS Base repo etc yum rep
  • kubernetes Pod高级用法-探针

    POD 2高级用法 容器探测详解 所谓容器探测就是我们在里面设置了一些探针 xff0c 或者传感器来获取相应的数据用来判断容器存活与否或者就绪与否的标准 xff1b 目前k8s支持的存活性探测方式和就绪性探测方式都是一样的 xff0c 探针
  • 云原生工程师-1.容器相关

    个人博客地址 一 docker容器相关 1 服务器虚拟机容器的区别基础知识 k8s1 24之前 xff1a docker 1 24之后containerd docker主要制作镜像 xff1a docker build xff0c dock
  • nginx配置后转发没有生效的一个坑个人总结

    一 概述 nginx配置规则还是有点复杂的 xff0c 在此只总结下本人遇到的一个坑与解决方法 xff0c 具体原因还不清楚 二 配置后没有生效的坑 1 首先 xff0c 要访问的url样例是 xff1a http 10 123 123 1
  • 云原生工程师-6.k8s四层负载均衡-Service

    五 k8s四层负载均衡 Service 个人博客 5 1 什么是Service 5 1 1 Service作用 在 kubernetes 中 xff0c Pod 是有生命周期的 xff0c 如果 Pod 重启它的 IP 很有可能会发生变化
  • 云原生工程师-8.statefulset和daemonset

    七 Statefulset 有状态服务 个人博客 7 1 Statefulset相关概念 7 1 1 什么是Statefulset StatefulSet 是有状态的集合 xff0c 管理有状态的服务 xff0c 它所管理的 Pod 的名称
  • 云原生工程师-9.configmap和secret

    九 configmap 配置管理 个人博客 9 1 配置管理中心基本概念 9 1 1 什么是configmap Configmap 是 k8s 中的资源对象 xff0c 用于保存非机密性的配置的 xff0c 数据可以用 key value