k8s配置文件管理
1.为什么要用configMap
ConfigMap是一种用于存储应用所需配置信息的资源类型,用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。
通过ConfigMap可以方便的做到配置解耦,使得不同环境有不同的配置。
- 考虑真实的使用场景,像数据库这类中间件,是作为公共资源,为多个项目提供服务,不适合和业务容器绑定在同一个Pod中,因为业务容器是经常变更的,而数据库不需要频繁迭代
- yaml的环境变量中存在敏感信息(账号、密码),存在安全隐患
为什么要统一管理环境变量
- 环境变量中有很多敏感的信息,比如账号密码,直接暴漏在yaml文件中存在安全性问题
- 团队内部一般存在多个项目,这些项目直接存在配置相同环境变量的情况,因此可以统一维护管理
- 对于开发、测试、生产环境,由于配置均不同,每套环境部署的时候都要修改yaml,带来额外的开销
k8s提供两类资源,configMap和Secret,可以用来实现业务配置的统一管理, 允许将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性 。
图解configmap创建
ConfigMap里配置文件存储形式
键值对
key: value
文件名: 配置文件的内容
支持的配置类型
1. 直接定义键值对
2. 基于文件创建的键值对
创建方式
1. 命令行
2. 声名式资源配置清单
configMap配置文件如何进入Pod
1. 先创建configMap,Pod再引用
2. ConfigMap属于ns下资源,同一个ns下的POD才可以引用
2.创建configMap
configMap,通常用来管理应用的配置文件或者环境变量
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/
2.1命令行创建
kubectl create configmap --help
# --from-iteral 定义单个k=v
kubectl -n yuchaoit create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=www.yuchaoit.com
[root@k8s-master-10 /all-k8s-yml]#kubectl get cm -n yuchaoit -owide
NAME DATA AGE
nginx-config 2 11s
# 查看详细k-v
[root@k8s-master-10 /all-k8s-yml]#kubectl -n yuchaoit describe cm nginx-config
Name: nginx-config
Namespace: yuchaoit
Labels: <none>
Annotations: <none>
Data
====
nginx_port:
----
80
server_name:
----
www.yuchaoit.com
Events: <none>
2.2 pod引用cm资源
# 看帮助
[root@k8s-master-10 /all-k8s-yml]#kubectl explain pod.spec.containers.env.valueFrom.configMapKeyRef
pod在env字段里引入cm
apiVersion: v1
kind: Pod
metadata:
name: nginx-cm
namespace: yuchaoit
spec:
containers:
- image: nginx:alpine
name: container-0
ports:
- name: http
containerPort: 80
env:
- name: NGINX_PORT
valueFrom:
configMapKeyRef: # 引用ConfigMap
name: nginx-config
key: nginx_port
- name: SERVER_NAME
valueFrom:
configMapKeyRef:
name: nginx-config # 指明cm名
key: server_name # 获取cm的key,拿到value
创建
[root@k8s-master-10 /all-k8s-yml]#kubectl create -f nginx-cm-pod.yml
pod/nginx-cm created
[root@k8s-master-10 /all-k8s-yml]#kubectl -n yuchaoit get po
NAME READY STATUS RESTARTS AGE
mysql-deploy-98b786585-vpkvq 1/1 Running 0 19h
查看pod和cm的关系
查看pod内环境变量信息
[root@k8s-master-10 /all-k8s-yml]#kubectl -n yuchaoit exec nginx-cm -- env |grep -Ei 'nginx_port|server_name'
NGINX_PORT=80
SERVER_NAME=www.yuchaoit.com
NGINX_PORT_80_TCP_PORT=80
NGINX_PORT_80_TCP=tcp://10.1.11.104:80
NGINX_PORT_80_TCP_PROTO=tcp
NGINX_PORT_80_TCP_ADDR=10.1.11.104
注意
pod通过env引入的cm配置
若修改了configmap,pod不会生效
2.3 资源yaml创建configMap
[root@k8s-master-10 /all-k8s-yml]#kubectl -n yuchaoit get cm nginx-config -oyaml
# 快捷获取就行了
apiVersion: v1
data:
nginx_port: "80"
server_name: www.yuchaoit.com
kind: ConfigMap
metadata:
name: nginx-config
namespace: yuchaoit
2.4 通过Volume方式引用configMap
在Volume中引用ConfigMap,就是通过文件的方式直接将ConfigMap的每条数据填入Volume
每条数据是一个文件,键就是文件名,键值就是文件内容。
创建cm
cat > www.conf << 'EOF'
server {
listen 80;
server_name www.yuchaoit.cn;
location / {
root /www/;
index index.html;
}
}
EOF
# 创建cm资源,以文件读取配置
kubectl create -n yuchaoit configmap nginx-www --from-file=www.conf=./www.conf
# 查看cm
[root@k8s-master-10 /all-k8s-yml/class]#kubectl get cm nginx-www
NAME DATA AGE
nginx-www 1 9s
# cm描述信息
[root@k8s-master-10 /all-k8s-yml/class]#kubectl describe cm nginx-www
Name: nginx-www
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
www.conf:
----
server {
listen 80;
server_name www.yuchaoit.cn;
location / {
root /www/;
index index.html;
}
}
Events: <none>
运行nginx-pod调用cm配置
apiVersion: v1
kind: Pod
metadata:
name: nginx-cm
namespace: yuchaoit
spec:
volumes:
- name: nginx-www
configMap:
name: nginx-www
items:
- key: www.conf
path: www.conf
containers:
- image: nginx:latest
name: nginx-pod-cm
ports:
- name: http
containerPort: 80
volumeMounts: # 挂载cm配置到nginx配置里即可
- mountPath: /etc/nginx/conf.d/ # 容器内挂载点
name: nginx-www # 源配置从cm获取
创建pod
[root@k8s-master-10 /all-k8s-yml/class]#kubectl create -f nginx-cm-pod.yml
[root@k8s-master-10 /all-k8s-yml/class]#kubectl get po -owide -n yuchaoit
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-cm 1/1 Running 0 2m59s 10.2.2.95 k8s-node-12 <none> <none>
查看pod调用的cm信息
Volumes:
nginx-www:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: nginx-www
Optional: false
default-token-nkzpq:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-nkzpq
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m26s default-scheduler Successfully assigned yuchaoit/nginx-cm to k8s-node-12
Normal Pulling 3m25s kubelet Pulling image "nginx:latest"
Normal Pulled 3m10s kubelet Successfully pulled image "nginx:latest" in 15.634341981s
Normal Created 3m10s kubelet Created container nginx-pod-cm
Normal Started 3m10s kubelet Started container nginx-pod-cm
[root@k8s-master-10 /all-k8s-yml/class]#kubectl -n yuchaoit describe po nginx-cm
# pod内信息
[root@k8s-master-10 /all-k8s-yml/class]#kubectl -n yuchaoit exec -it nginx-cm -- ls /etc/nginx/conf.d/
www.conf
pod调用cm字段解释
[root@k8s-master-10 /all-k8s-yml/class]#kubectl explain pod.spec.volumes.configMap.items
configMap参数解释
apiVersion: v1
kind: Pod
metadata:
name: nginx-cm
namespace: yuchaoit
spec:
volumes:
- name: nginx-www
configMap: # 引用cm配置
name: nginx-www # cm名
items: # 获取cm数据方式,key提取
- key: www.conf # 指定cm配置里的key
path: www.conf # key映射到文件的相对路径,生成的文件名
containers:
- image: nginx:latest
name: nginx-pod-cm
ports:
- name: http
containerPort: 80
volumeMounts: # 挂载cm配置到nginx配置里即可
- mountPath: /etc/nginx/conf.d/ # 容器内挂载点
name: nginx-www # 源配置从cm获取
2.5 动态修改cm配置
注意,使用env形式不支持热更新!
使用Volume方式引用支持热更新!
[root@k8s-master-10 /all-k8s-yml/class]#kubectl -n yuchaoit edit cm nginx-www
configmap/nginx-www edited
修改www.conf端口为82
[root@k8s-master-10 /all-k8s-yml/class]#kubectl -n yuchaoit exec -it nginx-cm -- cat /etc/nginx/conf.d/www.conf
server {
listen 82;
server_name www.yuchaoit.cn;
location / {
root /www/;
index index.html;
}
}
3.Secret
Secret是一种加密存储的资源对象,您可以将认证信息、证书、私钥等保存在Secret中,而不需要把这些敏感数据暴露到镜像或者Pod定义中,从而更加安全和灵活。
Secret与ConfigMap非常像,都是key-value键值对形式,使用方式也相同,不同的是Secret会加密存储,所以适用于存储敏感信息。
Base64编码
Secret与ConfigMap相同,是以键值对形式保存数据,所不同的是在创建时,Secret的Value必须使用Base64编码。
对字符串进行Base64编码,可以直接使用“echo -n 要编码的内容 | base64”命令即可,示例如下:
# 理解-n参数作用,不输出尾随换行符
[root@k8s-master-10 /all-k8s-yml/class]#echo 'yu' |wc -c
3
[root@k8s-master-10 /all-k8s-yml/class]#echo -n 'yu' |wc -c
2
[root@k8s-master-10 /all-k8s-yml/class]#echo -n 'www.yuchaoit.cn' |base64
d3d3Lnl1Y2hhb2l0LmNu
[root@k8s-master-10 /all-k8s-yml/class]#echo -n '3306' |base64
MzMwNg==
直接创建secret
apiVersion: v1
kind: Secret
metadata:
name: mysecret
data:
key1: aGVsbG8gd29ybGQ= # "hello world" Base64编码后的值
key2: MzMwNg== # "3306" Base64编码后的值
以文件创建Secret
如下示例中定义的Secret中包含两条Key-Value。
建议用如下方式
# 注意密码,别加任何引号
cat > secret_mysql.txt <<'EOF'
MYSQL_ROOT_PASSWORD=www.yuchaoit.cn
EOF
# 创建secret,注意参数
[root@k8s-master-10 /all-k8s-yml/class]#kubectl -n yuchaoit create secret generic mysql-sec --from-env-file=secret_mysql.txt
secret/mysql-sec created
# 查看secrets保存的键值对
[root@k8s-master-10 /all-k8s-yml/class]#kubectl -n yuchaoit get secrets mysql-sec -oyaml
apiVersion: v1
data:
MYSQL_ROOT_PASSWORD: d3d3Lnl1Y2hhb2l0LmNu
kind: Secret
metadata:
creationTimestamp: "2022-09-17T05:59:36Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:MYSQL_ROOT_PASSWORD: {}
f:type: {}
manager: kubectl-create
operation: Update
time: "2022-09-17T05:59:36Z"
name: mysql-sec
namespace: yuchaoit
resourceVersion: "2539757"
selfLink: /api/v1/namespaces/yuchaoit/secrets/mysql-sec
uid: e528d323-69ac-4f3f-b1f6-f72e3b7830d1
type: Opaque
pod调用secret,env形式
[root@k8s-master-10 /all-k8s-yml/class]#cat mysql-sec-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: mysql-sec-pod
namespace: yuchaoit
spec:
containers:
- image: mysql:5.7
name: container-0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-sec # 创建的secret资源名
key: MYSQL_ROOT_PASSWORD # secret里的key
[root@k8s-master-10 /all-k8s-yml/class]#
创建mysql,使用secret
[root@k8s-master-10 /all-k8s-yml/class]#kubectl create -f mysql-sec-pod.yml
[root@k8s-master-10 /all-k8s-yml/class]#kubectl -n yuchaoit get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-sec-pod 1/1 Running 0 56s 10.2.2.98 k8s-node-12 <none> <none>
nginx-cm 1/1 Running 0 117m 10.2.2.95 k8s-node-12 <none> <none>
[root@k8s-master-10 /all-k8s-yml/class]#
[root@k8s-master-10 /all-k8s-yml/class]#curl 10.2.2.98:3306
5.7.36o9^Q#IÿÿLV
x!r1mysql_native_password!ÿ#08S01Got packets out of order[root@k8s-master-10 /all-k8s-yml/class]#
# 测试数据库账密正确
[root@k8s-master-10 /all-k8s-yml/class]#kubectl -n yuchaoit exec mysql-sec-pod -- bash -c 'mysql -uroot -pwww.yuchaoit.cn -e "status;"'
mysql: [Warning] Using a password on the command line interface can be insecure.
--------------
mysql Ver 14.14 Distrib 5.7.36, for Linux (x86_64) using EditLine wrapper
Connection id: 3
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.36 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 1 min 32 sec
Threads: 1 Questions: 5 Slow queries: 0 Opens: 105 Flush tables: 1 Open tables: 98 Queries per second avg: 0.054
--------------
[root@k8s-master-10 /all-k8s-yml/class]#
k8s配置文件管理的更多相关文章
- Kubernetes(k8s)配置文件管理:ConfigMap
目录 一.系统环境 二.前言 三.ConfigMap概览 四.创建ConfigMap 五.ConfigMap的使用 5.1 以环境变量的方式使用ConfigMap 5.2 以卷的方式使用ConfigM ...
- Linux安装LAMP开发环境及配置文件管理
Linux主要分为两大系发行版,分别是RedHat和Debian,lamp环境的安装和配置也会有所不同,所以分别以CentOS 7.1和Ubuntu 14.04做为主机(L) Linux下安装软件,最 ...
- Python-day3作业-haproxy配置文件管理脚本
#!/usr/bin/env python import os,sys,time,re,prettytable,json from collections import defaultdict,Ord ...
- 【C#进阶系列】03 配置文件管理与程序集的引用版本重定向
先来点与标题不相关的: CLR支持两种程序集:弱命名程序集和强命名程序集. 两者的区别在于强命名程序集使用发布者的公钥和私钥进行签名.由于程序集被唯一性地标识,所以当应用程序绑定到强命名程序集时,CL ...
- C#配置文件管理
最近在做项目的过程中用到配置文件,本文简要说明本人在项目过程中是如何使用配置文件的,目的是加深自己对配置文件管理的理解,以便在下次使用时能做到轻松自如. 配置文件,顾名思义,是用户在使用系统或者软件时 ...
- 死磕salt系列-salt 配置文件管理
SLS是Salt State系统的核心,用来描述系统的目标状态,使用YAML语言书写.被用作配置文件管理. SLS文件 sls配置文件分为两种类型 top.sls 这是所有配置文件的入口 sls 这是 ...
- disconf实践(四)基于注解的分布式配置文件管理,自动reload
上一篇讲解了基于xml的自动reload的分布式配置文件管理,这一篇讲解基于注解的自动reload的方式(基于disconf实践二). 1. 修改spring配置文件 <?xml version ...
- disconf实践(三)基于XML的分布式配置文件管理,自动reload
上一篇介绍了基于xml的非自动reload的分布式配置文件管理,这一篇介绍自动reload的方式(基于disconf实践二). 1. 修改RedisConfig.java package org.sp ...
- Haproxy安装部署文档及多配置文件管理方案
一.部署安装 二.软件配置 三.系统服务 四.日志配置 五.小结 文章目录 最近我在负责一个统一接入层的建设项目,涉及到 Haproxy 和 ospf 的运维部署,本文分享一下我在部署 Haproxy ...
- K8s配置。--未完成
配置K8s ##################################################################################### # 配置 --- ...
随机推荐
- 甘肃政法大学AI协会
甘肃政法大学AI协会成员博客 甘肃政法大学AI协会 简介:甘肃政法大学AI协会正式成立于2022年6月30日,是在院团委领导下,人工智能与大数据发展环境为前提的实践性学生社团,是面向全校同学科技创新类 ...
- 千万级可观测数据采集器--iLogtail代码完整开源
简介: 2022年6月29日,阿里云iLogtail开源后迎来首次重大更新,正式发布完整功能的iLogtail社区版.本次更新开源全部C++核心代码,该版本在内核能力上首次对齐企业版,开发者可以构建出 ...
- SQL 开发任务超 50% !滴滴实时计算的演进与优化
摘要:Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态计算.可部署在各种集群环境,对各种大小的数据规模进行快速计算.滴滴基于 Apache Flink 做了大 ...
- 为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(下)
简介: 在上篇中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行下回答. 在上篇中,主要介绍了 Serverless Devs 多环境功能 ...
- 记一次 JMeter 压测 HTTPS 性能问题
简介:在使用 JMeter 压测时,发现同一后端服务,在单机 500 并发下,HTTP 和 HTTPS 协议压测 RT 差距非常大.同时观测后端服务各监控指标水位都很低,因此怀疑性能瓶颈在 JMet ...
- Serverless 应用引擎 SAE 携手谱尼测试共同抗疫
简介:潮落江平未有风,扁舟共济与君同. 阿里云联合乘云至达与谱尼测试携手, 共同筑建抗疫堡垒,共抗疫情.共克时艰. 作者 | 计缘 背景 当前疫情形势依然严峻,各行各业众志成城,携手抗疫.新冠病毒核 ...
- 阿里巴巴开源大规模稀疏模型训练/预测引擎DeepRec
简介:经历6年时间,在各团队的努力下,阿里巴巴集团大规模稀疏模型训练/预测引擎DeepRec正式对外开源,助力开发者提升稀疏模型训练性能和效果. 作者 | 烟秋 来源 | 阿里技术公众号 经历6 ...
- 所有前端都要看的2D游戏化互动入门基础知识
简介: 在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用 本文作者:淘系前端团队-Eva.js作者-明非 背景 现在越来越多的公司和 App 开始使用游戏化的方式去做产品了,所 ...
- Docker Desktop v20.10.8 和 WSL2 迁移镜像存储目录
只迁移存储镜像和挂载文件目录:https://www.cnblogs.com/lemonK/p/17781775.html 同时迁移docker程序目录:https://www.cnblogs.com ...
- [GPT] 用dogecoin接受付款,如何实现收款回调,不借助中心化的第三方
要在不借助中心化的第三方的情况下实现Dogecoin的收款回调,您可以按照以下步骤进行操作: 1. 设置一个用于接收收款回调的URL:您需要在您的网站或应用程序中设置一个用于接收收款回调的URL. ...