首页 > 其他分享 >ConfigMap&Secret场景应用

ConfigMap&Secret场景应用

时间:2023-04-23 11:39:54浏览次数:35  
标签:ConfigMap 场景 name kubectl -- secret Secret mysql pod

一、configMap

1.1、概述

ConfigMap是一种API对象,用来将 非加密数据 保存到 键值对 中。可以用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。

1.2、作用

ConfigMapt是Kubernetes系统上两种特殊类型的存储卷,ConfigMap对象用于为容器中的应用提供配置文件等信息。

例如:nginx、redis、mysql、coredns、jenkins、apollo等配置文件,实现统一管理,热更新等;

1.3、创建ConfigMap的常用3种方式

(1)命令行方式创建,格式:--from-literal=key=value

kubectl create configmap cm1 --from-literal=server_name=www.xxx.com --from-literal=listen=80

(2)通过指定文件(内设多个键值对),格式: --from-env-file=文件路径

cat env.txt
server_name=www.xxx.com
listen=80
# 创建
kubectl create configmap cm2 --from-env-file=env.txt

(3)通过YMAL文件创建

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm3
data:
  server_name: www.xxx.com
  listen: "80"

另外一种创建方式:

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.4、ConfigMap的2种使用方式

(1)通过环境变量的方式传递给pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-cm1
spec:
  containers:
  - name: busybox
    image: busybox
    args: [ "/bin/sh", "-c", "sleep 10000" ]
    envFrom:  # env方式
    - configMapRef:
        name: cm1 # configmap名称

验证:kubectl exec pod-cm1 -- env|grep listen

(2)通过volume的方式挂载到pod内

apiVersion: v1
kind: Pod
metadata:
  name: pod-cm2
spec:
  containers:
  - name: busybox
    image: busybox
    args: [ "/bin/sh", "-c", "sleep 10000" ]
    volumeMounts:                               # 用volume挂载方式
    - name: vol-cm                              # 对应下面的volume名
      mountPath: "/etc/nginx"                   # 挂载到容器内部的路径
      readOnly: true                            # 只读
  volumes:
  - name: vol-cm                                # 卷名称
    configMap:
      name: cm2                                 # configmap的名称

验证:kubectl exec pod-cm2 -- cat /etc/nginx/listen kubectl exec pod-cm2 -- cat /etc/nginx/server_name

1.5、ConfigMap的热更新

结论:

  • 通过环境变量的方式传递给pod。这种方式不会热更新;
  • 通过volume的方式挂载到pod内。这种方式会热更新;

验证第1种方式:编辑修改对应的configmap

kubectl edit cm cm1
# 验证
kubectl exec pod-cm1 -- env|grep listen

验证对应的pod里的变化,发现很久都不会改变

验证第2种方式:编辑修改对应的configmap

kubectl edit cm cm2
验证
kubectl exec pod-cm2 -- cat /etc/nginx/listen

验证对应的pod里的变化,一段时间后会改变


二、Secret

Secret与ConfigMap类似,主要的区别是Secret存储的是密文,而ConfigMap存储的是明文。 所以ConfigMap可以用配置文件管理,而Secret可用于密码,密钥,token等敏感数据的配置管理。

Secret有4种类型:

  • Opaque: base64编码格式的Secret,用来存储密码密钥信息证书等,类型标识符为generic
  • Service Account: 用来访问Kubernetes API,由Kubernetes自动创建,并且会 自动挂载 到Pod的/run/secrets/kubernetes.io/serviceaccount目录中
  • kubernetes.io/dockerconfigjson: 用来存储私有 docker registry的认证 信息,类型标识为docker-registry。
  • kubernetes.io/tls: 用于为SSL通信模式存储 证书私钥 文件,命令式创建类型标识为tls。

2.1、Opaque

(1)、将明文密码进行base64编码

# echo -n hellomysql |base64
aGVsbG9teXNxbA==

(2)、编写创建secret的YAML文件

apiVersion: v1
kind: Secret
metadata:
 name: secret-mysql
data:
 password: aGVsbG9teXNxbA==

(3)、创建secret并确认

# kubectl apply -f secret-mysql.yaml
# kubectl get secret |grep secret-mysql

Secret的2种使用方式:

(1)通过ENV变量的方式

创建mysql的pod示例,引用来自如上的 secret-mysql

apiVersion: v1
kind: Pod
metadata:
  name: pod-mysql-secret
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    env:
      - name: MYSQL_ROOT_PASSWORD
        valueFrom:
          secretKeyRef:
            name: secret-mysql				# 对应创建的secret名字
            key: password

验证变量效果:

kubectl exec -it pod-mysql-secret /bin/bash
root@pod-mysql-secret1:/# env |grep MYSQL_ROOT_PASSWORD

(2)通过volume的方式挂载

apiVersion: v1
kind: Pod
metadata:
  name: pod-mysql-secret2
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 100000
    volumeMounts:
    - name: vol-secret                  # 定义挂载的卷,对应下面定义的卷名
      mountPath: "/opt/passwd"    # 挂载目录(支持热更新),也可以使用subPath挂载文件(但不支持热更新)
      readOnly: true                    # 只读
  volumes:
  - name: vol-secret                    # 定义卷名
    secret:                             # 使用secret
      secretName: secret-mysql              # 对应创建好的secret名

验证挂载效果:

kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password

热更新测试

# echo -n hellonginx |base64
aGVsbG9uZ2lueA==

# 更新secret秘钥
kubectl edit secret secret-mysql

验证 pod-mysql-secret

kubectl exec pod-mysql-secret -- env|grep MYSQL_ROOT_PASSWORD

验证 pod-mysql-secret2

kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password

结论:

  • 通过env的方式 pod中参数并未发生变化;

    • 需重启pod;
    • 推荐更新configMap的name;
  • 通过挂载的方式 pod中参数发生变化;

2.2、dockerconfigjson

**场景:**使用jenkins自动部署容器到K8S中,其中一个步骤就是在运行容器前需要下载当前应用镜像,这时候就需要我们通过secret创建docker类型的秘钥来进行授权并拉取镜像

查看授权文件:
/root/.docker/config.json

通过授权文件来进行加密创建:
# kubectl create secret generic harborsecret --from-file=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -ndefault

引用:

apiVersion: v1
kind: Pod
metadata:
  name: fooTest
spec:
  containers:
    - name: fooTest
      image: xxxx/xxxxapp:v1
  imagePullSecrets:
    - name: harborsecret

2.3、kubernetes.io/tls

**场景:**在K8S业务场景中,很多服务通过ingress进行暴露,多数应用的核心通讯协议为https,这就需要我们引入对应域名的证书tls;

kubectl create secret tls ingress-secret2023 -ndefault --key 7128773__xxxx.com.key --cert 7128773__xxxx.com.pem

引用:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/proxy-body-size: "0"
    ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  labels:
    app: harbor
    chart: harbor
    heritage: Tiller
    release: xxxx
  name: xxxx-harbor-ingress
  namespace: default
spec:
  rules:
  - host: core-harbor.xxxx.com
    http:
      paths:
      - backend:
          serviceName: xxxx-harbor-portal
          servicePort: 80
        path: /
      - backend:
          serviceName: xxxx-harbor-core
          servicePort: 80
        path: /api/
      - backend:
          serviceName: xxxx-harbor-core
          servicePort: 80
        path: /service/
      - backend:
          serviceName: xxxx-harbor-core
          servicePort: 80
        path: /v2/
      - backend:
          serviceName: xxxx-harbor-core
          servicePort: 80
        path: /chartrepo/
      - backend:
          serviceName: xxxx-harbor-core
          servicePort: 80
        path: /c/
  - host: notary-harbor.xxxx.com
    http:
      paths:
      - backend:
          serviceName: xxxx-harbor-notary-server
          servicePort: 4443
        path: /
  tls:
  - hosts:
    - core-harbor.xxxx.com
    secretName: ingress-secret2023

运维狗_16819874294811.png

标签:ConfigMap,场景,name,kubectl,--,secret,Secret,mysql,pod
From: https://blog.51cto.com/u_12593421/6216894

相关文章

  • 【IT老齐002】MySQL集群模式与应用场景
    【IT老齐002】MySQL集群模式与应用场景单库模式优点简单粗暴适合数据量干万以下小型应用企业网站,创业公司首选缺点不具备可用性与并发性读写分离集群模式读写分离中间件insert、update、delete负载均衡到从库select路由到主库MySQL主从复制binlog......
  • 视觉SLAM:模型介绍、算法框架及应用场景
    目录01 什么是SLAM 1.1 相机模型1.2 相机运动1.3建图02SLAM算法框架03SLAM的应用场景3.1自动驾驶的高精度定位3.2自主移动机器人知识扩展:组合导航(GNSS/INS)二维码导航/磁导航3.3室内场景的三维重建:AR(增强现实技术)等04 结语参考文献:本文主要想使用尽量少的专业词汇来解释......
  • Redis布隆过滤器的原理和应用场景,解决缓存穿透
    大家好,我是哪吒。一、布隆过滤器BloomFilter是什么布隆过滤器BloomFilter是一种专门用来解决去重问题的高级数据结果。实质就是一个大型位数组和几个不同的无偏hash函数,无偏表示分布均匀。由一个初值为零的bit数组和多个哈希函数组成,用来判断某个数据是否存在,它和HyperLogLog一样,不......
  • 物联网常见协议之Amqp协议及使用场景解析
    摘要:本文围绕AMQP协议,为大家详细解析AMQP协议、核心技术亮点、多协议之间的对比以及使用实践。本文分享自华为云社区《物联网常见协议之Amqp协议及使用场景解析》,作者:张俭。引言本文围绕AMQP协议,为大家详细解析AMQP协议、核心技术亮点、多协议之间的对比以及使用实践,并介绍华为......
  • loadrunner入门教程(20) --场景创建
    文章目录1.任务背景2.任务目标3.任务实操3.1人工场景3.2面向目标场景4.任务总结1.任务背景Controller是loadrunner的场景工具,用于创建和控制loadrunner场景。由一个场景负责定义每个测试会话中发生的事件。他控制要模拟的用户数、这些用户执行的操作以及用于运行模拟场景的计算......
  • Android事件分发-基础原理和场景分析
    作者:京东零售 郭旭锋1为什么需要事件分发和其他平台类似,Android中View的布局是一个树形结构,各个ViewGroup和View是按树形结构嵌套布局的,从而会出现用户触摸的位置坐标可能会落在多个View的范围内,这样就不知道哪个View来响应这个事件,为了解决这一问题,就出现了事件分发......
  • Socks5代理和IP代理的区别及应用场景
      Socks5代理和IP代理都是网络代理服务,它们可以帮助用户在访问互联网时隐藏真实IP地址,从而增强网络安全和隐私保护。但是,这两种代理服务之间有一些重要的区别和不同之处。首先,Socks5代理是一种传输层代理,而IP代理是一种网络层代理。这意味着Socks5代理可以处理更广泛的协议,包括......
  • AIRIOT物联网平台助力油库自动化升级 实现业务场景全覆盖
     随着我国石油工业的飞速发展,油库规模迅速扩大,油库系统逐渐完善起来。石油行业属于高风险行业,所以石油化工产品在储存、运输和生产各个环节,均有极高的安监、环保、应急的管理要求。通常情况下,油库容量、油品种类、运输周期时间等都是造成危险事故的源头,且发生事故损失......
  • Function的使用场景
    Function的使用场景如下所示:publicclassApiInvoke<R>{privateLoggerlogger=LoggerFactory.getLogger(getClass());public<T>Mapinvoke(Mapmap,Class<T>tClass,Function<T,R>function){returninvokeWithoutException......
  • 物联网多协议、多场景自定义测试|XMeter Cloud 更新
    近日,全球首个物联网MQTT负载测试云服务XMeterCloud推出了自定义场景测试功能。该功能将满足用户自主定义测试场景和测试更广泛协议的需求,实现对除MQTT以外的TCP、WebSocket、HTTP等其他网络协议的测试,帮助用户构建更复杂的测试场景,提高测试效率和测试覆盖率。了解详情:XMet......