k8s配置中心-configmap,Secret密码
k8s配置中心-configmap,Secret
在生产环境中经常会遇到需要修改配置文件的情况,传统的修改方式不仅会影响到服务的正常运行,而且操作步骤也很繁琐。为了解决这个问题,kubernetes项目从1.2版本引入了ConfigMap功能,用于将应用的配置信息与程序的分离。这种方式不仅可以实现应用程序被的复用,而且还可以通过不同的配置实现更灵活的功能。在创建容器时,用户可以将应用程序打包为容器镜像后,通过环境变量或者外接挂载文件的方式进行配置注入。ConfigMap && Secret 是K8S中的针对应用的配置中心,它有效的解决了应用挂载的问题,并且支持加密以及热更新等功能,可以说是一个k8s提供的一件非常好用的功能。
创建ConfigMap
# 创建名称空间
apiVersion: v1
kind: Namespace
metadata:
name: sg-bs
labels:
app: sg-bs
---
# ConfigMap是名称空间级资源
apiVersion: v1
kind: ConfigMap
metadata:
name: test-configmap
namespace: sg-bs
data: # 健 : 值
level: debug
使用ConfigMap
## 使用挂载方式,将配置文件挂载到容器中
# 使用
kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx-config
spec:
selector:
matchLabels:
app: nginx-config
template:
metadata:
labels:
app: nginx-config
spec:
containers:
- name: nginx
image: nginx
volumeMounts: # 挂载
- mountPath: /etc/nginx/conf.d # 挂载路径
name: nginx-config-configmap # 存储卷名字
volumes:
- name: nginx-config
persistentVolumeClaim:
claimName: nginx-config
- name: nginx-config-configmap
configMap:
name: test-configmap # ConfigMap名字
items:
- key: level
path: level # 最终路径为:/etc/nginx/conf.d/level
subPath参数
# configmap热更新
## 修改configmap中的文件,可以同步到所有的挂载此configmap的容器中(仅仅同步到容器中),但是如果使用subPath参数,则热更新失效。
## configMap挂载会直接覆盖原来的目录,如果不覆盖则需要使用subPath参数(subPath参数只能够针对文件,同时不支持热更新)
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
default.conf: |
server {
listen 80;
listen [::]:80;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.php;
}
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}
index.php: |
<?php
phpinfo();
?>
---
kind: Service
apiVersion: v1
metadata:
name: nginx-config
spec:
ports:
- port: 80
targetPort: 80
nodePort: 30089
selector:
app: nginx-config
type: NodePort
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx-config
spec:
selector:
matchLabels:
app: nginx-config
template:
metadata:
labels:
app: nginx-config
spec:
containers:
- name: php
image: alvinos/php:wordpress-v2
volumeMounts:
- mountPath: /usr/share/nginx/html
name: nginx-config-configmap
- name: nginx
image: alvinos/nginx:wordpress-v2
volumeMounts:
- mountPath: /usr/share/nginx/html/index.php
name: nginx-config-configmap
subPath: index.php
- mountPath: /etc/nginx/conf.d
name: nginx-config-configmap
volumes:
- name: nginx-config-configmap
configMap:
name: nginx-config
items:
- key: index.php
path: index.php
Secret
Secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。
Secret用来保存敏感数据,保存之前就必须将文件进行base64加密,挂载到pod中,自动解密。
默认使用Opaque类型。
Secret有四种类型:
Service Account :用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中;
Opaque :base64编码格式的Secret,用来存储密码、密钥等;
kubernetes.io/dockerconfigjson :用来存储私有docker registry的认证信息
tls类型:访问证书
官方文档
https://kubernetes.io/zh/docs/concepts/configuration/secret/
编写secret清单
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: YWRtaW4xMjMK
username: YWRtaW4K
使用secret
Secret 可以作为数据卷被挂载,或作为环境变量 暴露出来以供 Pod 中的容器使用。它们也可以被系统的其他部分使用,而不直接暴露在 Pod 内。 例如,它们可以保存凭据,系统的其他部分将用它来代表你与外部系统进行交互。
在 Pod 中使用 Secret 文件
在 Pod 中使用存放在卷中的 Secret:
- 创建一个 Secret 或者使用已有的 Secret。多个 Pod 可以引用同一个 Secret。
- 修改你的 Pod 定义,在
spec.volumes[]下增加一个卷。可以给这个卷随意命名, 它的spec.volumes[].secret.secretName必须是 Secret 对象的名字。 - 将
spec.containers[].volumeMounts[]加到需要用到该 Secret 的容器中。 指定spec.containers[].volumeMounts[].readOnly = true和spec.containers[].volumeMounts[].mountPath为你想要该 Secret 出现的尚未使用的目录。 - 修改你的镜像并且/或者命令行,让程序从该目录下寻找文件。 Secret 的
data映射中的每一个键都对应mountPath下的一个文件名。
这是一个在 Pod 中使用存放在挂载卷中 Secret 的例子:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
您想要用的每个 Secret 都需要在 spec.volumes 中引用。
如果 Pod 中有多个容器,每个容器都需要自己的 volumeMounts 配置块, 但是每个 Secret 只需要一个 spec.volumes。
您可以打包多个文件到一个 Secret 中,或者使用的多个 Secret,怎样方便就怎样来。
将 Secret 键名映射到特定路径
我们还可以控制 Secret 键名在存储卷中映射的的路径。 你可以使用 spec.volumes[].secret.items 字段修改每个键对应的目标路径:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
将会发生什么呢:
usernameSecret 存储在/etc/foo/my-group/my-username文件中而不是/etc/foo/username中。passwordSecret 没有被映射
如果使用了 spec.volumes[].secret.items,只有在 items 中指定的键会被映射。 要使用 Secret 中所有键,就必须将它们都列在 items 字段中。 所有列出的键名必须存在于相应的 Secret 中。否则,不会创建卷。
Secret 文件权限
你还可以指定 Secret 将拥有的权限模式位。如果不指定,默认使用 0644。 你可以为整个 Secret 卷指定默认模式;如果需要,可以为每个密钥设定重载值。
例如,您可以指定如下默认模式:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
defaultMode: 256
之后,Secret 将被挂载到 /etc/foo 目录,而所有通过该 Secret 卷挂载 所创建的文件的权限都是 0400。
请注意,JSON 规范不支持八进制符号,因此使用 256 值作为 0400 权限。 如果你使用 YAML 而不是 JSON,则可以使用八进制符号以更自然的方式指定权限。
注意,如果你通过 kubectl exec 进入到 Pod 中,你需要沿着符号链接来找到 所期望的文件模式。例如,下面命令检查 Secret 文件的访问模式:
kubectl exec mypod -it sh
cd /etc/foo
ls -l
输出类似于:
total 0
lrwxrwxrwx 1 root root 15 May 18 00:18 password -> ..data/password
lrwxrwxrwx 1 root root 15 May 18 00:18 username -> ..data/username
沿着符号链接,可以查看文件的访问模式:
cd /etc/foo/..data
ls -l
输出类似于:
total 8
-r-------- 1 root root 12 May 18 00:18 password
-r-------- 1 root root 5 May 18 00:18 username
你还可以使用映射,如上一个示例,并为不同的文件指定不同的权限,如下所示:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
mode: 511
在这里,位于 /etc/foo/my-group/my-username 的文件的权限值为 0777。 由于 JSON 限制,必须以十进制格式指定模式,即 511。
请注意,如果稍后读取此权限值,可能会以十进制格式显示。
使用来自卷中的 Secret 值
在挂载了 Secret 卷的容器内,Secret 键名显示为文件名,并且 Secret 的值 使用 base-64 解码后存储在这些文件中。 这是在上面的示例容器内执行的命令的结果:
ls /etc/foo/
输出类似于:
username
password
cat /etc/foo/username
输出类似于:
admin
cat /etc/foo/password
输出类似于:
1f2d1e2e67df
容器中的程序负责从文件中读取 secret。
k8s配置中心-configmap,Secret密码的更多相关文章
- k8s配置集ConfigMap详解
ConfigMap介绍 ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷,ConfigMap对象用于为容器中的应用提供配置文件等信息.但是比较敏感的数据,例如密钥.证书 ...
- k8s-2-集成apollo配置中心
主题: 在k8s中集成Apollo配置中心 架构图 一.配置中心概述 配置的几种方式 本课讲得是基于配置中心数据库实现 配置管理的现状 常见的配置中心 主讲:k8s configmap,apollo ...
- K8S(10)配置中心实战-configmap资源
k8s配置中心实战-configmap资源 目录 k8s配置中心实战-configmap资源 0 configmap前置说明 0.1.1 configmap和secret 0.1.2 怎么使用conf ...
- K8S(11)配置中心实战-单环境交付apollo三组件
k8s配置中心实战-交付apollo三组件 目录 k8s配置中心实战-交付apollo三组件 1 apollo简单说明 1.1 apollo最简架构图: 1.2 apollo组件部署关系 2 为app ...
- K8S(12)配置中心实战-多环境交付apollo三组件
k8s配置中心实战-多环境交付apollo三组件 目录 k8s配置中心实战-多环境交付apollo三组件 1.环境准备工作 1.1 zk环境拆分 1.2 namespace分环境 1.3 数据库拆分 ...
- .NET Core + K8S + Apollo 玩转配置中心
1.引言 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...
- (转)实验文档3:在kubernetes集群里集成Apollo配置中心
使用ConfigMap管理应用配置 拆分环境 主机名 角色 ip HDSS7-11.host.com zk1.od.com(Test环境) 10.4.7.11 HDSS7-12.host.com zk ...
- 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践
写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 可能很多新手都会遇到同样的问题:我要我的Asp.net ...
- spring cloud学习(六) 配置中心-自动更新
上一篇学习了spring cloud config的基本使用,但发现有个问题,就是每次更改配置后,都需要重启服务才能更新配置,这样肯定是不行的.在上网查资料了解后,spring cloud支持通过AM ...
随机推荐
- Forest v1.5.12 发布,声明式 HTTP 框架,已超过 1.6k star
Forest介绍 Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL.Header 以及 Body 等信息)绑定到您自定义的 Interfac ...
- 如何用LOTO示波器安全的测量高电压?
本文里我们把几十伏以上,超出对人体安全电压或者超出示波器量程的电压定为高电压,以220V市电举例讨论. 示波器上是有方便自测和探头补偿用的标准方波的,一般是1K Hz.我们的USB示波器上也有这个标准 ...
- Git撤销、回滚操作
git的工作流 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的. 暂存区:已经 git add xxx 进去, ...
- c++学习笔记(六)
windows批处理 什么是批处理? 批处理(Batch),也称为批处理脚本. 顾名思义,批处理就是对某对象进行批量的处理.批处理文件的扩展名为bat. 批处理文件(batch file)包含一系列 ...
- 博主日常工作中使用的shell脚本分享
前言: 今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作.该脚本用于本地电脑和服务器交互上,实现以下功能: 自动拉取自己个人电脑上的源码到服务器上yocto包 ...
- SpringCloud升级之路2020.0.x版-34.验证重试配置正确性(3)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们继续上一节针对我们的重试进行测试 验证针对可重试的方法响应超时异常重试正确 我们可以通 ...
- 菜鸡的Java笔记 国际化程序实现原理
国际化程序实现原理 Lnternationalization 1. Locale 类的使用 2.国家化程序的实现,资源读取 所谓的国际化的程序 ...
- [hdu7042]二叉树
考虑最后这棵二叉树的结构,不难发现被移动的点在原树或新树中构成的都是若干棵完整的子树 (若$x$被移动,则$x$在原树或新树的子树中所有点都会被移动) 先在原树中考虑此问题,对于每一棵由被移动的点所构 ...
- [loj3075]组合数求和
Subtask1:$m,nd\le 2\times 10^{3}$ 对$M$质因数分解,假设$M=\prod_{i=1}^{k}p_{i}^{\alpha_{i}}$(其中$p_{i}$为素数) ...
- [bzoj1927]星际竞速
考虑没有爆发,那么相当于是带权最小不可交路径覆盖,由于只能从编号小的到编号大的,因此一定是DAG,而DAG的最小路径覆盖可以拆点并跑最大流,那么带权的只需要跑费用流即可(S向i连(1,0)的边,i'向 ...