一  对于一些保密度比较高的文件,k8s又是如何存储的呢?

  针对那些保密度比较高的配置文件,例如证书以及一些认证配置不能直接存储在configmap中,而是需要存储在另外一种资源中,需要对存储在里面的数据进行加密,并且只会调度到需要的pod上面,在pod上面所在的节点上,secret卷并不会存储在硬盘等设备上,而是需要存储在node上面的内存中,这样就不需要擦拭来提高保密性,同样的secrets和configmap类似,支持两种数据渲染到pod中的容器

  • 通过将配置渲染到容器的环境变量中
  • 通过将secerts暴露为卷中的文件

  另外一点需要注意的是,对于主节点本身,secerts是按照明文的形式进行存储,这就需要保障主节点安全从而确保存储在secerts的数据安全性,同样需要保障的一点是禁止未被授权的用户访问主节点服务器,因为在没有确实授权之前,任何用户都可以通过pod拉去secerts数据并可能造成数据暴露因此是将数据存储到configmap或者secert是需要认真考虑的一件事情

  • 采用configmap存储非敏感的数据文件
  • 采用secerts存储敏感的数据文件
  • 当存储的数据里面同时包含敏感数据或者非敏感数据,也得将数据存储在secerts中

二  secrets的相关应用和创建

  

    2.1  来看一个pod中默认的令牌

[root@node01 ~]# k get secrets
NAME TYPE DATA AGE
default-token-tzwwt kubernetes.io/service-account-token 3 15d [root@node01 ~]# k describe secrets
Name: default-token-tzwwt
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: default
kubernetes.io/service-account.uid: 61b7be2c-433e-11eb-90ae-5254002a5691 Type: kubernetes.io/service-account-token Data
====
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tdHp3d3QiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjYxYjdiZTJjLTQzM2UtMTFlYi05MGFlLTUyNTQwMDJhNTY5MSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.zwEvc13whMJW7MaCcDpXkpLmQsi2qfih-OUiNAVt8gwqZ9KWmFOj7Qye_vtzeYhc1m3YyM6YkCTjCtKqTUX28P0Y50-_Pl_0fQKrm2BTb7fGIskRwB4egFiwMZmcgzqUr4CHuvINdb339mYp8eYqpf1Io51fFKmLRwE3U1zWLRFod_QP-eBxlSCq5O76BtPjkH0egWvEgScao5tYJLw-tFMdkhyeFpJCoVdjf4plxi5yFYdxP86kc0jjtW9x9Z6LBKVhTC18_cQawG24UgOAjwZW4TF4v5y25Me4G3itTTVx_IKx8M6ndK5MrerFGCZoppFeSJdFr_TFyuWgcznuTw
ca.crt: 1025 bytes
  • 系统中每个pod都会挂载一个secrets卷,存储的内容是可以直接于kubernets的api服务器进行通信的相关认证,这里也可以通过设置pod中的automountServiceAccountToken字段为false来关闭这种默认行为
  • 通过describe命令可以看到更过的关于这个secrets的信息,可以发现这个secrets数据包含了ca.crt,token以及namespace等访问kubernets的api服务器的全部信息
  • 再者通过describe pod可以看到该secrets挂载在pod上面的相关信息地址为/var/run/secrets/kubernetes.io/serviceaccount

  2.2  查看该默认的secrets挂载pod中的位置

[root@node01 ~]# k exec test-for-all-env-from-configmap -- ls -Alrt /var/run/secrets/kubernetes.io/serviceaccount
total 0
lrwxrwxrwx. 1 root root 12 Jan 4 13:51 token -> ..data/token
lrwxrwxrwx. 1 root root 16 Jan 4 13:51 namespace -> ..data/namespace
lrwxrwxrwx. 1 root root 13 Jan 4 13:51 ca.crt -> ..data/ca.crt
lrwxrwxrwx. 1 root root 31 Jan 4 13:51 ..data -> ..2021_01_04_13_51_29.048076121
drwxr-xr-x. 2 root root 100 Jan 4 13:51 ..2021_01_04_13_51_29.048076121
  • 可以看出secrets也是和configmap一样,通过创建data的软连接到指定的目录,然后data也是其中一个挂载的目录,通过对整个文件进行替换使得文件来更新
  • 该文件夹下面包含了访问kubernetsapi服务器的所有的必要文件

  2.3  创建一个secrets

[root@node01 Chapter07]# openssl genrsa -out https.key 2048
Generating RSA private key, 2048 bit long modulus [root@node01 Chapter07]# openssl req -new -x509 -key https.key -out https.cert -days 3650 -subj /CN=www.kubia-example.com [root@node01 Chapter07]# echo wxm-test>wxm-test [root@node01 Chapter07]# k create secret generic fortune-https --from-file=https.cert --from-file=https.key --from-file=wxm-test
secret/fortune-https created [root@node01 Chapter07]# k get secret
NAME TYPE DATA AGE
default-token-tzwwt kubernetes.io/service-account-token 3 15d
fortune-https Opaque 3 24s
  • 我们首先使用openssl等相关命令创建了证书以及认证以及一个附加的文件
  • 之后用这个三个文件创建了一个secret
  • 至此secret创建完成,但是有点奇怪的是,type类型内容为opaque不知道什么意思?

  2.4 对比configmap以及secret

    

    2.4.1 通过yaml的形式查看刚才创建的secret    

[root@node01 Chapter07]# k get secret fortune-https -o yaml
apiVersion: v1
data:
https.cert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQWZ1Z0F3SUJBZ0lKQU5jQk83ZW0wYk5pTUEwR0NTcUdTSWIzRFFFQkN3VUFNQ0F4SGpBY0JnTlYKQkFNTUZYZDNkeTVyZFdKcFlTMWxlR0Z0Y0d4bExtTnZiVEFlRncweU1UQXhNRFV3TkRBMk1EUmFGdzB6TVRBeApNRE13TkRBMk1EUmFNQ0F4SGpBY0JnTlZCQU1NRlhkM2R5NXJkV0pwWVMxbGVHRnRjR3hsTG1OdmJUQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdkNkUFFHRWlJaElwZ0ZDRkU2U21oZFJ5ODMKaldoRDZPZUtLcndNcms1cWMweWUrSmg5N3lqRHY4Q3NtbGFpZWJPZjZXTUN0L1Z2ajhPWVhsZUR2K2xFclNPVgo0Y0NnR3Qvd1B3SmJQSS9WcUhoR1ZPUGVHM0RTcFpGaUpPSWJOUTkyK1N5SWZyWUVUeDRYSGlNKzRQcWVVeGh2CmtqaGxUZXFqZ0wrOVJHQlFZa1ROZDBlUlJ1cnRGbkRUYnFZOFVSbmdieVVGVkVVcnM5ODB5OGtxK1pucmZIQ1cKS2Y2VjQwRUVxNlh0eXd0RElaQnlUMGJGZWlMbi9iTVF3Z1hFOEUwRzNvZmU3NFFUWjZicmFYNFNLVVovaUIxSgpiV1pQSkJVS3B3ZmdNN2Rlamo4ZGsvRW9WaXE3VnZqQTdxYTdGQkJqSURSZ2txKzNPSnQvNndCWmc0VUNBd0VBCkFhTlFNRTR3SFFZRFZSME9CQllFRkQ1Rld5VUtDZHA2SVpGaWlSQnpTclprbnpqVU1COEdBMVVkSXdRWU1CYUEKRkQ1Rld5VUtDZHA2SVpGaWlSQnpTclprbnpqVU1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFHV1pKQjZwcXZ6cmRzcDZya0dBbWVYUFpUN0tNZ3NqUktvWkdKcXhQYWw1Tnk3QXY2YlFyWEJUCnZDQ3ZtM1lUcU0vOE9RVU5WTlpUdE1kNjRiUEpBOUZwNVo4QXNHYXlFdFJ6Q3JyaDFSdzVraXdlZkhkZC9WcFQKaDNIUThnejBuclBhV1UzVEVQbzhZQ0Y5V251MUdrblZxQTFSZ2NtZExzNjROTEhQaTN6T0cvWmtJYVZzRWVVRgp6RFJyUCs3NlNIMTBMRFpoaEZGWm1HSVNDT25zYWcyTytGUGhnTWVKa1hTb2kvZ1NOdTdpVGpvVXF6dWwyc0tsCm1Tc3UvNUYwdEEyU2hYaVFrWkMzRjJXbTBZUnlUNzZOWmdXWnZTR1U2YmQ3a0o5WmNRSHAxZDRoMnNPVHdzSm8KbEp2TXVUN090emg4aFlpU283cUVhTXdkTTdGbkVGbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
https.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBcThKMDlBWVNJaUVpbUFVSVVUcEthRjFITHplTmFFUG81NG9xdkF5dVRtcHpUSjc0Cm1IM3ZLTU8vd0t5YVZxSjVzNS9wWXdLMzlXK1B3NWhlVjRPLzZVU3RJNVhod0tBYTMvQS9BbHM4ajlXb2VFWlUKNDk0YmNOS2xrV0lrNGhzMUQzYjVMSWgrdGdSUEhoY2VJejdnK3A1VEdHK1NPR1ZONnFPQXY3MUVZRkJpUk0xMwpSNUZHNnUwV2NOTnVwanhSR2VCdkpRVlVSU3V6M3pUTHlTcjVtZXQ4Y0pZcC9wWGpRUVNycGUzTEMwTWhrSEpQClJzVjZJdWY5c3hEQ0JjVHdUUWJlaDk3dmhCTm5wdXRwZmhJcFJuK0lIVWx0Wms4a0ZRcW5CK0F6dDE2T1B4MlQKOFNoV0tydFcrTUR1cHJzVUVHTWdOR0NTcjdjNG0zL3JBRm1EaFFJREFRQUJBb0lCQUZJSFRabVpLS0hhRjA1bwo0TjhDS3JVTEQwc1NpZHNveTV1QTFnWDNQR3ZBMVEzYndqZjV0UFZQLzAwQ1liZE1ZemtRL3dKRk14dnBTc3lNCkFVcGtab3YrTzM0S1A4V2g4UlBRQmhlWEFTWmtVTkFZTHNTZ3Q1UTdWYzFJQlB0aktRVVl1Y20xNm1YOVN0ZkIKREtpaWlBbkpBVUJqVUg3VWl0Q3JnM3FPNW8va0s2OHVZLzlDNWNpVHB2aXBGYjd1UUpITVJzak9lOTRNWGc1YQp6M0tsaVB2cldKT1AvUjFPeTl6T0dzNksxZDhoOXdiVWFxZTJoZmQ2b09wRU9Edlk1RC9XLzNJeDFDY2FSSnNsCk9KT1pvbWptMkZaUUFEaEFsZ0V6Tlc1UjVLcVp0dGNpN1pPZjZ4a1lnYUdTbzVnYVkvV0xRbms3YXJoMXF4V3gKT3FNWmRBVUNnWUVBMHN3TFlmZ25LY1QvRjM0cHhvUElwOVpvWjcwNHlwcktrakRLMHZWT01iQ2g5V3EwamQ2VgpMdTB4ak5rVGs5V1ZDeklXR1FRbEFZN2hzWEdLOEFhSUg0bUZqVXdMdHFLR1VSWXRKdEJoTTM0T3IvQXVxUW1RClR4RUZOTEwwYWVYWmJLUUtiYktHYjYveHlaUU5ZM2dSYlJHTm9QZzRuMmIrOXZBbytlOEplSU1DZ1lFQTBKZG4KcHgrSzY0L25WM3dqU1RUNlJ6UDRlRTFMMTFLTXJUaGwwWTQ5emlnTkw0UEZRVnU0T2pNQ2xsVmo2cmZpdWl5egpaL3I3NW9PMTRJTTFaZ2dIZGtGUXNKVytvL3JRS3Y1Y3B3ZStBNU9zdzF2ZzVTQkEvRFpKNnVGWXZrWUpsdU5mClZ6dS8wbTZ2ZEc0TVJSOGZWWE1aWWs4MHpObmpoUmh3WnBkdEJWY0NnWUFiclhqdEl5VVpRZWx3anpzeStvaTEKS056S2lqalR1V0ZSc3FCZTlLQ1F1NjE0U010dU9VU0RSZGVVczhmelNEN3FtbWYyWHVudysyNjgycml3YlZzZwpNUEZkTFJmNG9meGExenVVZGhYZEtmY0p1TktYbFU3aVlzeTVMNm9SNFlFYjE2b2EzeTd4cVR0cENVeDh1LzRsCndRRkVtbkxzMHh3MUZqRjdKNXlwdXdLQmdRQ1NOVjRaUGJuUlRjZjVnWEQyVW1VUDNiVFBGbGNQc2JRYmdzbVQKcm1GU0RLN1pYRUs2Z2tES3dwQ1FzWC9jdVZINTczVTljQ1o3T0YwVzVzRmFLRXlhcmtPUjB4U1N1aTZKeEV0TApaTmppaHZOMDZBVG1kY28zUHhKbXlkZTdYem8vZ2xhRXZjUENDNFYrVmRqUjVuTy9JSE50Zmxsak1XTVNHc1JHCmxPTjg5d0tCZ1FDMk5YTG9KeGk4OWt4aUg1Q05ENjJ5dzEwMGNvallsVEVvNVZoU1dMeFRqc1VzcUg1T0RGUTYKZ0NORVBRcHFJNWtNa1NsMUtHdVloSnY5L1ZyckpvMi9QalJ0RGMyaXdMdzFlaU5sQmZ1dDdXOHZWeHhrY21EaApNb21GRjdBUklqQ1VHc1ZnVmJWRElNZkE5VmpMSTNhTitGWGhsdVI1U1dtUWZydzloQ2Q4dWc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
wxm-test: d3htLXRlc3QK
kind: Secret
metadata:
creationTimestamp: "2021-01-05T04:08:43Z"
name: fortune-https
namespace: default
resourceVersion: "2145910"
selfLink: /api/v1/namespaces/default/secrets/fortune-https
uid: b3435209-4f0b-11eb-ae9a-5254002a5691
type: Opaque
  • 对比之前创建的configmap可以发现secret里面的数据都是通过采用base64格式编码
  • 这么做的好处很明显,可以对数据起到很好的保护
  • 但是对于开发者而言,就会多了一个编解码的步骤,但是不需要应用自己去编解码

    2.4.2  StringData字段介绍

    由于并非所有的敏感数据都是以二进制的,k8s允许Secret通过StringData设置纯文本值为条目,StringData是只写的而非只读,可以被设置为条目值,通过k get po -o yaml命令不会显示stringData字段,相反stringdata所有的条目会被Base64解析到data字段下

  2.5  在pod中使用Secret

    2.5.1 创建一个包含之前创建的emptyDir,configmap以及secret卷

[root@node01 Chapter07]# cat fortune-https.yml
apiVersion: v1
kind: Pod
metadata:
name: fortune-https
spec:
containers:
- image: luksa/fortune:env
name: html-generator
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: fortune-config
key: sleep-interval
volumeMounts:
- name: html
mountPath: /var/htdocs
- image: nginx:alpine
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
- name: config
mountPath: /etc/nginx/conf.d
readOnly: true
- name: certs
mountPath: /etc/nginx/certs/
readOnly: true
ports:
- containerPort: 80
- containerPort: 443
volumes:
- name: html
emptyDir: {}
- name: config
configMap:
name: fortune-config
items:
- key: my-nginx-config.conf
path: https.conf
- name: certs
secret:
secretName: fortune-https

    

    2.5.2 我们用一张更为直观的图来展示我们创建这个pod内部对应的关系

      

  • 可以很直观的看出这个pod里面有2个容器web-server和html-generator
  • web-server上面挂载了三个卷分别是emptyDir卷html这个卷同样也挂载html-genreator,作用也是很明显,用来接受html-generator产生的html文件,同时还挂载了config的configmap用来让容器里面nginx的应用来读取配置文件,也挂载了一个certs的secret卷,用来作为https的认证
  • 这便是一种通过文件的形式将secret卷挂载到pod容器的方式下面我们来介绍与认识另一种将secret卷挂载到容器的方式

2.6  通过环境变量的形式secret的条目

  2.6.1 通过环境变量的形式暴露secret的一个例子如下所示

  

env:
- name:FOO_SECRET
valurFrom:
secretKeyRef:
name: fortune-http
key: foo
  • secretKeyRef参数标志这该环境变量的值是通过secret的条目
  • 渲染到环境变量往往会导致在出错的时候会转存环境变量,导致私密信息泄漏
  • 另外子进程会继承父进程,你也无法知晓会拿这个私密文件来干嘛

kubernets之secret资源的更多相关文章

  1. 容器编排系统K8s之ConfigMap、Secret资源

    前文我们了解了k8s上的pv/pvc/sc资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14188621.html:今天我们主要来聊一下 ...

  2. kubernets之Ingress资源

    一  Ingress集中式的kubernets服务转发控制器 1.1  认识Ingress的工作原理 注意:图片来源于kubernets in action一书,如若觉得侵权,请第一时间联系博主进行删 ...

  3. kubernets之计算资源

    一  为pod分配cpu,内存以及其他的资源 1.1  创建一个pod,同时为这个pod分配内存以及cpu的资源请求量 apiVersion: v1 kind: Pod metadata: name: ...

  4. kubernets之statefulset资源

    一  了解Statefulset 1.1  对比statefulset与RS以及RC的区别以及相同点 Statefulset是有状态的,而RC以及RS等是没有状态的 Statefulset是有序的,拥 ...

  5. kubernets之Deployment资源

    一  声明式的升级应用 1.1  回顾一下kubernets集群里面部署一个应用的形态应该是什么样子的,通过一副简单的图来描述一下 通过RC或者RS里面的模板创建了三个pod,之后通过一个servci ...

  6. kubernets之服务资源

    一  服务集群内部或者客户端与pod的通信桥梁   kubernets集群的内部pod访问为啥不能使用传统的IP:PORT的形式? pod是短暂的,它们会随时启动或者关闭,原因可能是pod所在的节点下 ...

  7. kubernets之job资源

    一  介绍job资源 1.1   前面介绍的RC,RS,DS等等,管控的pod都是需要长期持久的运行的应用,但是尝试考虑另外一种场景,在微服务的场景下,有些pod的作用就是需要 执行完一些命令之后正常 ...

  8. kubernetes 基本概念和资源对象汇总

    kubernetes 基本概念和知识点脑图 基本概念 kubernetes 中的绝大部分概念都抽象成kubernets管理的资源对象,主要有以下类别: Master : Master节点是kubern ...

  9. (十)Kubernetes ConfigMap和Secret

    ConfigMap资源 介绍 ConfigMap是让配置文件从镜像中解耦,让镜像的可移植性和可复制性.许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.这些配置信息需要与docker im ...

随机推荐

  1. ADF 第五篇:转换数据

    映射数据流(Mapping Data Flow)的核心功能是转换数据,数据流的结构分为Source.转换和Sink(也就是Destination),这种结构非常类似于SSIS的数据流. 在数据流中,数 ...

  2. [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵

    今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...

  3. Liunx运维(五)-信息显示与搜索文件命令

    文档目录: 一.uname:显示系统信息 二.hostname:显示或设置系统的主机名 三.dmesg:系统启动异常诊断 四.stat:显示文件或文件系统状态 五.du:统计磁盘空间使用情况 六.da ...

  4. C++libcurl的使用

    一.libcurl描述: 在curl的官方网站 **http://curl.haxx.se/download.html** 提供编译好libcurl包,  最后写一个demod工程,演示下libcur ...

  5. Python3和高性能全文检索引擎Redisearch进行交互

    安装 pip install redisearch 使用 from redisearch import Client, TextField # 创建一个客户端与给定索引名称 client = Clie ...

  6. .Net Core的简单单元测试基于Mock和自定义

    首先创建 使用mock 外部依赖一般用Mock 模拟 下载包 例如 3.1:首先先要使用MOCk来模拟测试方法需要的参数,这一步为 Arrange; 简单的模拟 var mock = new Mock ...

  7. [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更

    [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更 目录 [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更 0x00 摘要 0x02 引子 0x03 业务范畴 3.1 ...

  8. 基础才是重中之重~BouncyCastle实现的DES3加密~java通用

    对于BouncyCastle类库(包)来说,他提供了很多加密算法,在与.net和java进行相互加解密过程中,得到了不错的应用,本文以DES3为例,来说一下DES3加解密的过程. 加密过程 明文字符转 ...

  9. 使用pdf2htmlEX将pdf文件转为html

    https://github.com/coolwanglu/pdf2htmlEX 参考github文档,转换出来的的效果貌似很好,可以参考OFFICE 文档转换为html在线预览. pdf2swf 和 ...

  10. Centos7对外开放端口

    (1)查看对外开放的端口状态 查询已开放的端口 netstat -anp 查询指定端口是否已开 firewall-cmd --query-port=666/tcp 提示 yes,表示开启:no表示未开 ...