云原生
Kubernetes基础
容器技术介绍
Docker快速入门
Containerd快速入门
K8S主要资源罗列
认识YAML
API资源对象
Kubernetes安全掌控
Kubernetes网络
Kubernetes高级调度
Kubernetes 存储
Kubernetes集群维护
Skywalking全链路监控
ConfigMap&Secret场景应用
Kubernetes基础概念及核心组件
水平自动扩容和缩容HPA
Jenkins
k8s中部署jenkins并利用master-slave模式实现CICD
Jenkins构建过程中常见问题排查与解决
Jenkins部署在k8s集群之外使用动态slave模式
Jenkins基于Helm的应用发布
Jenkins Pipeline语法
EFKStack
EFK日志平台部署管理
海量数据下的EFK架构优化升级
基于Loki的日志收集系统
Ingress
基于Kubernetes的Ingress-Nginx解决方案
Ingress-Nginx高级配置
使用 Ingress-Nginx 进行灰度(金丝雀)发布
Ingress-nginx优化配置
APM
Skywalking全链路监控
基于Helm部署Skywalking
应用接入Skywalking
服务网格
Istio
基于Istio的微服务可观察性
基于Istio的微服务Gateway实战
Kubernetes高可用集群部署
Kuberntes部署MetalLB负载均衡器
Ceph
使用cephadm部署ceph集群
使用Rook部署Ceph存储集群
openstack
glance上传镜像失败
mariadb运行不起来
创建域和项目错误_1
创建域和项目错误_2
安装计算节点
时钟源
网络创建失败
本文档使用 MrDoc 发布
-
+
首页
ConfigMap&Secret场景应用
# 1、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` ```bash kubectl create configmap cm1 --from-literal=server_name=www.xxx.com --from-literal=listen=80 ``` (2)通过指定文件(内设多个键值对),格式: --from-env-file=文件路径 ```bash cat env.txt server_name=www.xxx.com listen=80 # 创建 kubectl create configmap cm2 --from-env-file=env.txt ``` (3)通过YMAL文件创建 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: cm3 data: server_name: www.xxx.com listen: "80" ``` 另外一种创建方式: ```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.4 ConfigMap的2种使用方式 (1)通过环境变量的方式传递给pod ```yaml 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内 ```yaml 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 ```bash kubectl edit cm cm1 # 验证 kubectl exec pod-cm1 -- env|grep listen ``` **验证对应的pod里的变化,发现很久都不会改变** 验证第2种方式:编辑修改对应的configmap ```bash kubectl edit cm cm2 验证 kubectl exec pod-cm2 -- cat /etc/nginx/listen ``` **验证对应的pod里的变化,一段时间后会改变** # 2、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编码 ```bash # echo -n hellomysql |base64 aGVsbG9teXNxbA== ``` (2)、编写创建secret的YAML文件 ```yaml apiVersion: v1 kind: Secret metadata: name: secret-mysql data: password: aGVsbG9teXNxbA== ``` (3)、创建secret并确认 ```bash # kubectl apply -f secret-mysql.yaml # kubectl get secret |grep secret-mysql ``` Secret的2种使用方式: - (1)通过ENV变量的方式 创建mysql的pod示例,引用来自如上的 secret-mysql ```yaml 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 ``` 验证变量效果: ```bash kubectl exec -it pod-mysql-secret /bin/bash root@pod-mysql-secret1:/# env |grep MYSQL_ROOT_PASSWORD ``` - 通过volume的方式挂载 ```yaml 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名 ``` 验证挂载效果: ```bash kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password ``` 热更新测试 ```bash # echo -n hellonginx |base64 aGVsbG9uZ2lueA== # 更新secret秘钥 kubectl edit secret secret-mysql ``` 验证 `pod-mysql-secret` ```bash kubectl exec pod-mysql-secret -- env|grep MYSQL_ROOT_PASSWORD ``` 验证 `pod-mysql-secret2` ```bash kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password ``` 结论: - 通过env的方式 pod中参数并未发生变化; - 需重启pod; - 推荐更新configMap的name; - 通过挂载的方式 pod中参数发生变化; ## 2.2 dockerconfigjson **场景:**使用jenkins自动部署容器到K8S中,其中一个步骤就是在运行容器前需要下载当前应用镜像,这时候就需要我们通过secret创建docker类型的秘钥来进行授权并拉取镜像 ```bash 查看授权文件: /root/.docker/config.json 通过授权文件来进行加密创建: # kubectl create secret generic harborsecret --from-file=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n default ``` **引用:** ```yaml 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; ```bash kubectl create secret tls ingress-secret2023 -n default --key 7128773__xxxx.com.key --cert 7128773__xxxx.com.pem ``` **引用:** ```yaml 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 ```
阿星
2024年1月27日 18:28
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码