ASP.NET Core on K8S深入学习(9)Secret & Configmap
本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。
一、Secret
1.1 关于Secret
在应用启动过程中需要一些敏感信息,比如数据库用户名、密码,如果直接明文存储在容器镜像中是不安全的,K8S提供的方案是Secret。

Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。
Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据,也可以使用环境变量的方式使用。
1.2 创建与查看Secret
这里假设我们要创建一个包含以下信息的Secret:
(1)用户名:Edison
(2)密码:EDC123456*
有4种方法来创建Secret:
(1)通过 --from-literal:
kubectl create secret generic mysecret --from-literal=username=Edison --from-literal=password=EDC123456*
PS:每个 --from-literal 对应一个信息条目
(2)通过 --from-file:
echo -n Edison > ./username
echo -n EDC123456* > ./password
kubectl create secret generic mysecret --from-file=./username --from-file=./password
PS:每个文件内容对应一个信息条目
(3)通过 --from-env-file:
cat << EOF > env.txt
username=Edison
password=EDC123456*
EOF
kubectl create secret generic mysecret --from-env-file=env.txt
PS:文件 env.txt 中每行 Key=Value 对应一个信息条目
(4)通过YAML配置文件创建:(推荐方式)
由于配置文件中的敏感数据必须是通过base64编码后的结果,因此需要获取base64编码后的值:

下面就是这个YAML文件的内容:
apiVersion: v1
kind: Secret
metadata:
name: edc-secret
data:
username: RWRpc29u
password: RURDMTIzNDU2Kg==
通过kubectl apply来创建Secret:

创建成功后,验证一下,查看一下这个Secret:
kubectl get secret edc-secret // 查看存在的secret
kubectl describe secret edc-secret // 查看条目的Key
kubectl edit secret edc-secret // 查看条目的Value

将Value进行base64反编码,如下所示,与预期一致:

1.3 在Pod中使用Secret
K8S中Pod中使用Secret有两种方式,一是Volume方式,二是环境变量的方式。
(1)Volume方式
这里我们以一个示例演示一下如何通过Volume方式使用Secret,首先定义一个Pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-demo
spec:
containers:
- name: secret-demo-pod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: edc-secret
该Pod中会使用到刚刚定义的secret(edc-secret),然后volumeMounts定义了将foo mount到容器中的路径为/etc/foo的目录下,并且指定了读写权限为只读。
通过kubectl apply创建之后,我们试着在容器中读取secret来验证一下,如下图所示:

可以看到,K8S为每条敏感数据创建了一个文件,而且其Value是以明文存放的。
当然,你也可以自定义存放数据的目录,如下配置所示:
apiVersion: v1
kind: Pod
metadata:
name: secret-demo
spec:
containers:
- name: secret-demo-pod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: edc-secret
items:
- key: username
path: /edc-group/username
- key: password
path: /edc-group/password
这时,该secret就会存放于/etc/foo/edc-group/username 和 /etc/foo/edc-group/password 两个目录下了。
(2)动态更新
以Volume方式使用Secret,其中一个优点就是支持动态更新。例如,我们将Secret更新一下,重新应用到K8S中:
apiVersion: v1
kind: Secret
metadata:
name: edc-secret
data:
username: RWRpc29u
password: YWJjZGVmZyo= // 换为了 abcdefg*
通过kubectl apply重新应用之后,等待一段时间后,再次进入容器中验证:

已经改为了 abcdefg*,符合预期。
(2)环境变量方式
通过Volume使用Secret看起来稍微麻烦了一点,容器必须通过文件读取数据。K8S提供了另外一种方式,那就是环境变量方式。
下面仍以上面的例子为例,修改配置文件:
apiVersion: v1
kind: Pod
metadata:
name: secret-demo
spec:
containers:
- name: secret-demo-pod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
env:
- name: EDC_SECRET_USERNAME
valueFrom:
secretKeyRef:
name: edc-secret
key: username
- name: EDC_SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: edc-secret
key: password
通过kubectl apply应用之后,进入容器验证一下:

可以看到,可以方便地通过环境变量获取到Value。
PS:需要注意的也是,虽然通过环境变量读取Secret比较方便,但是无法支持Secret动态更新!
二、Configmap
2.1 关于Configmap
上面提到的Secret可以为Pod提供机密数据的存储,而对于一些非机密敏感的数据,像一些应用的配置信息啊神马的,则可以使用Configmap。
Configmap的创建与使用方式与Secret非常类似,不同点只在于数据以明文形式存放(不过,我觉得Secret的密文形式也并不密文,只能算得上是简单编码)。

2.2 创建Configmap
和Secret一样,可以通过 --from-literal,--from-file 和 --from-env-file来创建,这里我们跳过,直接说下我们最常用的yaml配置文件的方式。
apiVersion: v1
kind: ConfigMap
metadata:
name: service-configmap
data:
LogLevel: Error
LogFile: service-timestamp.log
AllowedHosts: edc.com
2.3 使用Configmap
和Secret一样,也可以通过Volume 或 环境变量两种方式来使用Configmap。
(1)Volume方式
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo
spec:
containers:
- name: configmap-demo-pod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
configMap:
name: service-configmap
(2)环境变量方式
apiVersion: v1
kind: Pod
metadata:
name: secret-demo
spec:
containers:
- name: secret-demo-pod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
env:
- name: SERVICE_LOG_LEVEL
valueFrom:
configMapKeyRef:
name: service-configmap
key: LogLevel
- name: SERVICE_LOG_FILE
valueFrom:
configMapKeyRef:
name: service-configmap
key: LogFile
- name: SERVICE_ALLOWED_HOSTS
valueFrom:
configMapKeyRef:
name: service-configmap
key: AllowedHosts
2.4 最佳实践
大多数情况下,大家建议的最佳实践是:
(1)创建ConfigMap采用YAML配置方式 => 便于复用和版本管理
(2)读取ConfigMap采用Volume方式 => 便于配置动态更新
下面我们创建一个Configmap,其YAML内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: service-configmap
data:
appsettings.json: |
LogHandler: NLogHandler
LogLevel: Error
LogFile: %hostname-%timestamp.log
这里注意别忘了:后面的 | 符号,然后创建&查看Configmap:

如果想要在Pod中使用此Configmap,可以在YAML配置如下:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo
spec:
containers:
- name: configmap-demo-pod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
volumeMounts:
- name: configmap
mountPath: "/etc/configmap"
volumes:
- name: configmap
configMap:
name: service-configmap
items:
- key: appsettings.json
path: appsettings.json
这里将Volume mount到了容器的 /etc/configmap 目录中,下面我们验证一下:

这时我们将configmap更新一下,如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: service-configmap
data:
appsettings.json: |
Logging:
LogLevel:
Default: "Error"
AllowedHosts: "*"
通过kubectl apply更新一下configmap,然后再到pod中验证是否动态更新:

可以看出,已经动态更新,符合预期!
2.5 ASP.NET Core appSettings
我们在ASP.NET Core中的配置都是写在appSettings.json文件中,如何将appSettings.json转换为ConfigMap呢?圣杰已经总结归纳为了《.NET Core使用K8S Configmap的正确姿势》一文,有兴趣的读者可以参考此文。
三、小结
本文探索了在K8S中如何进行配置管理,如果需要密文配置,可以使用Secret,如果是一般应用配置,可以使用ConfigMap。虽然Secret和ConfigMap都定义了好几种定义方式,但是我们一般采用YAML配置创建和Volume方式读取,因为Volume方式可以支持动态更新。最后,通过分享圣杰的一篇文章,介绍了如何在ASP.NET Core下使用Configmap的方式,希望对你有帮助!
参考资料
(1)CloudMan,《每天5分钟玩转Kubernetes》
(2)李振良,《一天入门Kubernets教程》
(3)马哥(马永亮),《Kubernetes快速入门》
(4)benjamin杨,《K8S通过Secret管理敏感信息》
(5)伊凡的一天,《K8S对象之Secret》
ASP.NET Core on K8S深入学习(9)Secret & Configmap的更多相关文章
- ASP.NET Core on K8S深入学习(7)Dashboard知多少
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 在第二篇<部署过程解析与Dashboard>中介绍了如何部署Das ...
- ASP.NET Core on K8S 入门学习系列文章目录
一.关于这个系列 自从2018年底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发现运维工 ...
- ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建
在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...
- ASP.NET Core on K8S深入学习(2)部署过程解析与Dashboard
上一篇<K8S集群部署>中搭建好了一个最小化的K8S集群,这一篇我们来部署一个ASP.NET Core WebAPI项目来介绍一下整个部署过程的运行机制,然后部署一下Dashboard,完 ...
- ASP.NET Core on K8S深入学习(3)Deployment
上一篇<部署过程解析与安装Dashboard>中我们了解K8S的部署过程,这一篇我们来了解一下K8S为我们提供的几种应用运行方式:Deployment.DaemonSet与Job,它们是K ...
- ASP.NET Core on K8S深入学习(4)你必须知道的Service
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个 ...
- ASP.NET Core on K8S深入学习(5)Rolling Update
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.什么是Rolling Update? 为了服务升级过程中提供可持续的不中断 ...
- ASP.NET Core on K8S深入学习(10)K8S包管理器Helm
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Helm 1.1 为何需要Helm? 虽然K8S能够很好地组织和编排容 ...
- ASP.NET Core on K8S深入学习(8)数据管理
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 在Docker中我们知道,要想实现数据的持久化(所谓Docker的数据持久化即 ...
随机推荐
- 2019最新idea注册码
2019最新注册码到2020年1月7号 N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iL ...
- IOS应用无法下载、此时无法安装应用程序
无法安装应用 app开发者,进行程序测试,重试还不行,就重新打包, 个人,更改wifi的dns 在“设置” –> “WiFi” –> 进入当前的WiFi 进入之后点击旁边的叹号,然后进入之 ...
- Java 之MVC动态分页完美实现
一个分页小技术有时也是让人挠头,在这里完全前端实现方式与Java的实现方式,我们提供给你完全的编码参考,希望能够帮到你哦(:) 内容导读 1.程序结构 2.JSP页面设计 3.分页主要编码 4.运行效 ...
- OLE--SWT高级控件
OLE和ActiveX控件的支持 OLE(Object Link Embeded)是指在程序之间链接和嵌入对象数据.通过OLE技术可以在一个应用程序中执行其他的应用程序. 而ActiveX ...
- 禅道、jenkins部署记录
禅道部署1.检查你linux系统的位数(uname -a)2.下载对应位数的禅道包3.通过xftp工具将禅道包拷贝到虚拟机的/opt目录4.tar 对禅道包进行解压5.改配置:vi /opt/zbox ...
- Spark 系列(三)—— 弹性式数据集RDDs
一.RDD简介 RDD 全称为 Resilient Distributed Datasets,是 Spark 最基本的数据抽象,它是只读的.分区记录的集合,支持并行操作,可以由外部数据集或其他 RDD ...
- AWS Aurora数据库 Multi-Master 小测
AWS Aurora Mysql终于推出了Multi-Master,直面硬刚Oracle RAC.在多一份数据库产品选择的小兴奋之余,我们也看看新推出的Multi-Master的特点(包括优缺点). ...
- 一起来学JavaScript吧(JS兔子领进门)
首先我们学习一门语言呢不一要学习它的所有历史,但是一定要知道它的使用基本规则.不要在最基础的部分出错.不过胡萝贝还是带你了解JavaScript的历史吧. 1994年网景公司(Netscape)发布了 ...
- 关于JVM内存溢出的原因分析及解决方案探讨
前言:JVM中除了程序计数器,其他的区域都有可能会发生内存溢出. 0.什么是内存溢出 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出. 1. ...
- 10分钟安装Elasticsearch
关注公众号 itweknow,回复"ES"获取<Elasticsearch权威指南 中文版>. 最近在尝试着搭建一个ELK(一个开源的实时日志分析平台),而本文所讲的E ...