本篇已加入《.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

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

ASP.NET Core on K8S深入学习(9)Secret & Configmap的更多相关文章

  1. ASP.NET Core on K8S深入学习(7)Dashboard知多少

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 在第二篇<部署过程解析与Dashboard>中介绍了如何部署Das ...

  2. ASP.NET Core on K8S 入门学习系列文章目录

    一.关于这个系列 自从2018年底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发现运维工 ...

  3. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...

  4. ASP.NET Core on K8S深入学习(2)部署过程解析与Dashboard

    上一篇<K8S集群部署>中搭建好了一个最小化的K8S集群,这一篇我们来部署一个ASP.NET Core WebAPI项目来介绍一下整个部署过程的运行机制,然后部署一下Dashboard,完 ...

  5. ASP.NET Core on K8S深入学习(3)Deployment

    上一篇<部署过程解析与安装Dashboard>中我们了解K8S的部署过程,这一篇我们来了解一下K8S为我们提供的几种应用运行方式:Deployment.DaemonSet与Job,它们是K ...

  6. ASP.NET Core on K8S深入学习(4)你必须知道的Service

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个 ...

  7. ASP.NET Core on K8S深入学习(5)Rolling Update

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.什么是Rolling Update? 为了服务升级过程中提供可持续的不中断 ...

  8. ASP.NET Core on K8S深入学习(10)K8S包管理器Helm

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Helm 1.1 为何需要Helm? 虽然K8S能够很好地组织和编排容 ...

  9. ASP.NET Core on K8S深入学习(8)数据管理

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 在Docker中我们知道,要想实现数据的持久化(所谓Docker的数据持久化即 ...

随机推荐

  1. shiro创建配置对象

    在执行 Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory(&quo ...

  2. 在 Windows 上使用 Python 进行 web 开发

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一篇我们介绍了在Windows 10下进行初学者入门开发Python的指 ...

  3. UE4 代理 BindRaw和BindUObject

    代理允许您在C++对象上以通用的但类型安全的方式调用成员函数.通过使用代理,可以将其动态地绑定到任何对象的成员函数上,然后在该对象上调用函数,即时调用者不知道该对象的类型也没关系. 任何时候都应该通过 ...

  4. Where is the clone one and how to extract it?

    One cannot be in two places at once. Do you know what's "Dual Apps"? Manufactures like Xia ...

  5. 一道看似简单的go程序的深入分析

    先上代码: func main() { var a [10]int for i := 0; i < 10; i++ { go func(i int) { for { a[i]++ } }(i) ...

  6. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

  7. 【POJ - 1862】Stripies (贪心)

    Stripies 直接上中文了 Descriptions 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板 ...

  8. 中间件增强框架之-CaptureFramework框架

    一.背景 应用服务监控是智能运维系统的重要组成部分.在UAV系统中,中间件增强框架(MOF)探针提供了应用画像及性能数据收集等功能,其中数据收集功能主要采集四类数据:实时数据.画像数据.调用链接数据生 ...

  9. 当下最流行的微服务与spring cloud,你搞清楚了吗?

    微服务架构:Spring-Cloud 什么是微服务? 微服务就是把原本臃肿的一个项目的所有模块拆分开来并做到互相没有关联,甚至可以不使用同一个数据库. 比 如:项目里面有User模块和Power模块, ...

  10. JavaFX OnMouseClick

    在JavaFX开发环境中,遇到一些坑是难免的,而且资料少得可怜! 先说一下我遇到的问题 : 只是一个点击事件而已 : 首先我有这么个界面 : 接下来呢 ? 我需要点击右上角的X,然后显示遮罩,弹出对话 ...