10 . Kubernetes之Configmap,Secret
时间:2022-07-25
本文章向大家介绍10 . Kubernetes之Configmap,Secret,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
configmap简介
Configmap和Secret类似,用来存储配置文件的Kubernetes资源对象,所有的配置内容都存储在etcd中.
配置容器化应用的方式:
# 1. 自定义命令行参数
# args:
# 2. 把配置文件直接配进镜像
# 3. 环境变量
# 1. Cloud Native的应用程序一般可直接通过环境变量加载配置:
# 2. 通过entrypoint脚本来预处理变量为配置文件中的配置信息:
# 4. 存储卷
整个configmap放的是多个键值对,减值数据,每个key只代表一个配置信息,参数,一整个配置文件,没有长度限制,我们可以在Pod启动从Configmap某个键获取相关的数据项
创建ConfigMap
创建ConfigMap的方式有4种
# 方式一: 通过直接在命令行中指定configmap参数创建,即--from-literal
# 方式二: 通过指定文件创建,即将一个配置文件创建为一个ConfigMap, --from-file=<文件>
# 方式三: 通过指定目录创建,即将一个目录下所有的配置文件创建为一个ConfigMap,--from-file=<目录>
# 方式四: 事先写好标准的configmap的yaml文件,然后kubectl create -f 创建:
# 环境变量注入只要能进入Pod都能被人看见,最好使用存储卷然后权限调给600,只有属主能看见
命令行创建
kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=youmen
kubectl get cm
NAME DATA AGE
nginx-config 2 8s
kubectl describe cm nginx-config
Name: nginx-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
nginx_port:
----
80
server_name:
----
youmen.com
Events: <none>
.conf文件创建
cat www.conf
server {
server_name myapp.youmen.com;
listen 80;
root /data/web/html;
}
kubectl create configmap nginx-www --from-file=./www.conf
kubectl get cm
NAME DATA AGE
nginx-config 2 3m13s
nginx-www 1 4s
kubectl describe cm nginx-www
Name: nginx-www
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
www.conf:
----
server {
server_name myapp.youmen.com;
listen 80;
root /data/web/html;
}
Events: <none>
yaml创建
cat cm-demo1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-1
namespace: default
labels:
app: myapp
tier: frontend
annotations:
youmen.com/created-by: "cluster-admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
env:
- name: NGINX_SERVER_PORT
valueFrom:
configMapKeyRef:
name: nginx-config
key: nginx_port
- name: NGINX_SERVER_NAME
valueFrom:
configMapKeyRef:
name: nginx-config
key: server_name
kubectl apply -f cm-demo1.yaml
kubectl exec -it pod-cm-1 /bin/sh
# 我们用edit修改里面的变量端口号或者域名,但是Pod内部不会刷新,只有创建才能注入进去
# 或者我们使用存储卷方式
kubectl edit cm nginx-config
存储卷方式
Example1
[root@master storage]# cat pod-configmap-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-com-2
namespace: default
labels:
app: myapp
tier: frontend
annotations:
youmen.com/created-by: "cluster admin"
spec:
containers:
- name: nginx
image: daocloud.io/library/nginx
ports:
- name: http
containerPort: 80
volumeMounts:
- name: pv-nginx
mountPath: /etc/nginx/config.d/
volumes:
- name: pv-nginx
configMap:
name: pvc2-nfs
kubectl exec -it pod-com-2 bash
cat /etc/nginx/config.d/server_name
youmen
cat /etc/nginx/config.d/nginx_port
80
ls -l /etc/nginx/config.d/
total 0
lrwxrwxrwx 1 root root 16 Dec 25 08:09 nginxport -> ..data/nginxport
lrwxrwxrwx 1 root root 18 Dec 25 08:09 server_name -> ..data/server_name
# 我们去修改下端口,然后看NginxPod那边呢能不能实时刷新
kubectl edit cm nginx-conf
cat /etc/nginx/config.d/nginxport
8080
Example2
我们先生成一个configmap文件
cat www.conf
server {
server_name myapp.youmen.com;
listen 80;
root /etc/nginx/conf.d/default.conf;
}
kubectl create configmap nginx-www --from-file=./www.conf
配置podyaml
cat pod-configmap-demo3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-com-3
namespace: default
labels:
app: myapp
tier: frontend
annotations:
youmen.com/created-by: "cluster admin"
spec:
containers:
- name: nginx
image: nginx
ports:
- name: http
containerPort: 80
volumeMounts:
- name: cv0
mountPath: /etc/nginx/conf.d/
volumes:
- name: cv0
configMap:
name: nginx-www
kubectl exec -it pod-com-3 bash
cat /etc/nginx/conf.d/www.conf
server {
server_name myapp.youmen.com;
listen 80;
root /usr/share/nginx/html/;
}
echo "<h1>Nginx Server configured by CM</h1>" > /usr/share/nginx/html/index.html
接下来我们一边访问测试,一边访问
curl 10.244.1.62
<h1>Nginx Server configured by CM</h1>
kubectl edit cm nginx-www # 修改端口为8080
# 此时Pod里面配置文件已经被修改了,但是监听的端口没有改,需要重新载入一下,才能使监听端口修改
cat /etc/nginx/conf.d/www.conf
server {
server_name myapp.youmen.com;
listen 8080;
root /usr/share/nginx/html/;
}
nginx -s reload
curl 10.244.1.62
curl: (7) Failed connect to 10.244.1.62:80; Connection refused
[root@master configmap]# curl 10.244.1.62:8080
<h1>Nginx Server configured by CM</h1>
与Secret区别
# 1 . ConfigMap保存的是不需要加密的应用所需的配置信息
# 2 . ConfigMap的用法几乎与Secret完全相同,可以使用kubectl create configmap从文件或者目录创建ConfigMap,也可以直接编写ConfigMap对象的YAML文件.
Secret简介
Secret
Secret用来保存小片敏感数据的k8s资源、例如密码、token、或者秘钥。这类数据当然也可以存在Pod或者镜像中,但是放在Secret中为了更方便的控制如何使用数据,并减少暴露的风险. 用户可以创建自己的Secret,系统也会有自己的Secret. Pod需要先引用才能使用某个Secret。
kubectl create secret --help
docker-registry Create a secret for use with a Docker registry
generic Create a secret from a local file, directory or literal value
tls Create a TLS secret
Key值创建
kubectl create secret generic mysql-root-password --from-literal=password=ZHOUjian.20
kubectl get secret
NAME TYPE DATA AGE
default-token-j9thc kubernetes.io/service-account-token 3 6d21h
mysql-root-password Opaque 1 6s
kubectl describe secret mysql-root-password
Name: mysql-root-password
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 11 bytes
kubectl get secret mysql-root-password -o yaml
apiVersion: v1
data:
password: WkhPVWppYW4uMjA=
kind: Secret
metadata:
creationTimestamp: "2019-12-25T09:02:27Z"
name: mysql-root-password
namespace: default
resourceVersion: "1438552"
selfLink: /api/v1/namespaces/default/secrets/mysql-root-password
uid: a1a55f14-86b1-4ada-8050-a8e8ccbdd145
type: Opaque
# 此处加密并不是绝对安全,能通过base64解密,而且env注入时,你看到是加密的密码,但是Pod里面的环境变量是明文
echo WkhPVWppYW4uMjA= |base64 -d
ZHOUjian.20
环境变量注入mysql密码
cat pod-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-1
namespace: default
labels:
app: myapp
tier: frontend
annotations:
youmen.com/create-by: "cluster admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-root-password
key: password
kubectl exec pod-secret-1 -- printenv |grep MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=ZHOUjian.20
# 环境变量注入只要能进入Pod都能被人看见,最好使用存储卷然后权限调给600,只有属主能看见
- 如何找到最优学习率?
- 简单易学的机器学习算法——Rosenblatt感知机
- 多级复制的数据不同步问题(r7笔记第11天)
- 简单易学的机器学习算法——Logistic回归
- Python 用OPEN读文件报错 ,路径以及r
- Oracle 12c PDB浅析(r9笔记第10天)
- merge语句导致的CPU使用率过高的优化(二) (r7笔记第9天)
- 网页爬虫-R语言实现基本函数
- Python中的random模块用于生成随机数
- 简单易学的机器学习算法——极限学习机(ELM)
- 图片数据集太少?Keras Image Data Augmentation 各参数详解
- 备库归档删除策略失效的问题分析 (r7笔记第6天)
- 优化算法——梯度下降法
- Java基础-26(02)总结网络编程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 重温四大基础数据结构:数组、链表、队列和栈
- C# 程序在 Docker 中响应 Unix 信号
- Android | Tangram动态页面之路(七)硬核的Virtualview
- Spark SQL如何选择join策略
- 江湖事儿 | 技术人如何做好晋升准备
- Dockerfile 的 ENTRYPOINT 与 CMD
- Docker Entry Script 详解
- 使用 docker-compose 替代 docker run
- 分享给您一个快速离职的 SHELL 脚本
- ASP.NET WebAPI 中的参数绑定
- Qt音视频开发7-ffmpeg音频播放
- 本地 Docker Registry 的安装与使用
- 安装 Docker 环境
- 为生产环境编译 Angular 2 应用
- 剑指offer 03:二维数组中的查找