一、Secret介绍
在Kubernetes集群资源中,Secret对象与ConfigMap对象类似,但它主要是用于存储小片敏感的需要加密的数据,例如密码,token和SSH key密钥等等。这类数据当然也可以存放在Pod的定义中或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,更加安全和灵活,并减少信息暴露的风险。在secret中存储的数据都需要通过base64进行转换加密后存放。Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。用户可以创建自己的secret,系统也会有自己的secret。

Secret一旦被创建,则可以通过以下三种方式来使用:
-> 在创建Pod时,通过为pod指定Service Account来自动使用该Secret,主要用于API Server鉴权的过程;
-> 通过挂载Secret到Pod来使用它。即作为volume的一个域被一个或多个容器挂载;
-> Docker镜像下载时使用,通过指定Pod的spc.ImagePullSecret来引用。一般用于私有仓库登录拉取镜像。即在拉取镜像的时候被kubelet引用。

Kubernetes集群中有內建的Secrets:即由ServiceAccount创建的API证书附加的秘钥,Kubernetes会自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信。这是Kubernetes 默认的行为,也可以通过自定义的方式禁用或者创建我们所需要的Secret。

二、Secret 类型和使用
-> Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
-> kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
-> kubernetes.io/service-account-token (即Service Account):用于被 serviceaccount 引用。serviceaccout 创建时,Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。Service Account 是内置secret,使用 API 凭证自动创建和附加secret。Kubernetes 自动创建包含访问API凭据的secret,并自动修改pod以使用此类型的secret。如果需要,可以禁用或覆盖自动创建和使用API凭据。但是,如果需要的只是安全地访问apiserver,则推荐这样的工作流程。

第一种类型: Opaque Secret
Opaque类型的Secret,其value为base64编码后的值。

1)从文件中创建Secret:分别创建两个名为username.txt和password.txt的文件

[root@k8s-master01 ~]# echo -n "shibo" > ./username.txt
[root@k8s-master01 ~]# echo -n "shibo@123" > ./password.txt

使用kubectl create secret命令创建secret,该命令将这些文件打包到一个Secret中并在API server中创建了一个对象。

[root@k8s-master01 ~]# kubectl create secret generic shibo-secret --from-file=./username.txt --from-file=./password.txt
secret/shibo-secret created

2)使用描述文件创建Secret:  首先使用base64对数据进行编码

[root@k8s-master01 ~]# echo -n 'kevin_bo' | base64
a2V2aW5fYm8=
[root@k8s-master01 ~]# echo -n 'kevin@123' | base64
a2V2aW5AMTIz

创建一个类型为Secret的描述文件

[root@k8s-master01 ~]# cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: a2V2aW5fYm8=
password: a2V2aW5AMTIz

执行创建

[root@k8s-master01 ~]# kubectl create -f secret.yaml
secret/mysecret created

查看此Secret

[root@k8s-master01 ~]# kubectl get secret|grep "shibo"
shibo-secret Opaque 2 2m27s [root@k8s-master01 ~]# kubectl get secret shibo-secret -o yaml
apiVersion: v1
data:
password.txt: c2hpYm9AMTIz
username.txt: c2hpYm8=
kind: Secret
metadata:
creationTimestamp: "2019-06-26T11:20:17Z"
name: shibo-secret
namespace: default
resourceVersion: "1152263"
selfLink: /api/v1/namespaces/default/secrets/shibo-secret
uid: 607ea323-9804-11e9-90d4-005056ac7c81
type: Opaque [root@k8s-master01 ~]# kubectl describe secret/shibo-secret
Name: shibo-secret
Namespace: default
Labels: <none>
Annotations: <none> Type: Opaque Data
====
username.txt: 5 bytes
password.txt: 9 bytes

需要注意:默认情况下,get 和 describe 命令都不会显示文件的内容。这是为了防止将secret中的内容被意外暴露给从终端日志记录中刻意寻找它们的人。

3)Secret的使用
创建好Secret之后,可以通过两种方式使用:
-> 以Volume方式
-> 以环境变量方式

Secret 可以作为数据卷被挂载,或作为环境变量暴露出来以供 pod 中的容器使用。它们也可以被系统的其他部分使用,而不直接暴露在 pod 内。例如,它们可以保存凭据,系统的其他部分应该用它来代表您与外部系统进行交互。

在 Pod 中的 volume 里使用 Secret:
-> 创建一个 secret 或者使用已有的 secret。多个 pod 可以引用同一个 secret。
-> 修改您的 pod 的定义在 spec.volumes[] 下增加一个 volume。可以给这个 volume 随意命名,它的 spec.volumes[].secret.secretName 必须等于 secret 对象的名字。
-> 将下面的配置

spec.containers[].volumeMounts[]

加到需要用到该 secret 的容器中。指定下面的配置

spec.containers[].volumeMounts[].readOnly = true

并设置下面内容为想要该 secret 出现的尚未使用的目录。

spec.containers[].volumeMounts[].mountPath

-> 修改镜像并且/或者命令行让程序从该目录下寻找文件。Secret的data映射中的每一个键都成为了mountPath下的一个文件名。

3.1   将Secret挂载到Volume中 (下面是一个在pod中使用volume挂载secret的例子)

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: data
mountPath: "/etc/data"
readOnly: true
volumes:
- name: data
secret:
secretName: shibo-secret

进入Pod查看挂载的Secret:

# ls /etc/data
password.txt username.txt
# cat /etc/data/username.txt
kevin
# cat /etc/data/password.txt
kevin@123

想要用的每个secret都需要在spec.volumes 中指明。如果pod中有多个容器,每个容器都需要自己的volumeMounts配置块,但是每个secret只需要一个spec.volumes。还可以打包多个文件到一个secret中,或者使用的多个secret,怎样方便就怎样来。也可以向特性路径映射secret密钥。

还可以控制Secret key映射在 volume 中的路径,可以使用 spec.volumes[].secret.items字段修改每个key的目标路径。也就是说可以只挂载Secret中特定的key:

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: data
mountPath: "/etc/data"
readOnly: true
volumes:
- name: data
secret:
secretName: shibo-secret
items:
- key: username
path: my-group/my-username

需要注意,在这种情况下:
username 存储在 /etc/data/my-group/my-username中
password 未被挂载

如果使用了 spec.volumes[].secret.items,只有在 items 中指定的 key 被影射。要使用 secret 中所有的 key,所有这些都必须列在 items 字段中。所有列出的密钥必须存在于相应的 secret 中。否则,不会创建卷。

3.2   将Secret设置为环境变量

apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: shibo-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: shibo-secret
key: password
restartPolicy: Never

第二种类型:kubernetes.io/dockerconfigjson
kubernetes.io/dockerconfigjson用于存储docker registry的认证信息,可以直接使用kubectl create secret命令创建:

[root@k8s-master01 ~]# kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret/myregistrykey created

查看secret的内容:

[root@k8s-master01 ~]# kubectl get secret|grep myregistrykey
myregistrykey kubernetes.io/dockerconfigjson 1 54s [root@k8s-master01 ~]# kubectl get secret myregistrykey -o yaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJET0NLRVJfUkVHSVNUUllfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0=
kind: Secret
metadata:
creationTimestamp: "2019-06-26T11:35:22Z"
name: myregistrykey
namespace: default
resourceVersion: "1153734"
selfLink: /api/v1/namespaces/default/secrets/myregistrykey
uid: 7b769a8a-9806-11e9-90d4-005056ac7c81
type: kubernetes.io/dockerconfigjson

通过 base64 对 secret 中的内容解码:

[root@k8s-master01 ~]# echo "eyJhdXRocyI6eyJET0NLRVJfUkVHSVNUUllfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0=" | base64 --decode
{"auths":{"DOCKER_REGISTRY_SERVER":{"username":"DOCKER_USER","password":"DOCKER_PASSWORD","email":"DOCKER_EMAIL","auth":"RE9DS0VSX1VTRVI6RE9DS0VSX1BBU1NXT1JE"}}}

在创建 Pod 的时候,通过 imagePullSecrets 来引用刚创建的 myregistrykey:

apiVersion: v1
kind: Pod
metadata:
name: data
spec:
containers:
- name: data
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey

第三种类型:kubernetes.io/service-account-token
用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

[root@k8s-master01 ~]# kubectl run kevin_nginx --image nginx
deployment "nginx" created [root@k8s-master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
kevin_nginx-3137573019-md1u2 1/1 Running 0 13s [root@k8s-master01 ~]# kubectl exec kevin_nginx-3137573019-md1u2 ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token

Docker启动出现"No space left on device" 或者 docker日志太多导致磁盘占满问题的更多相关文章

  1. Docker cgroup.procs no space left on device

    环境:centos6 运行docker 时 错误提示: System error: write /sys/fs/cgroup/docker/01f5670fbee1f6687f58f3a943b1e1 ...

  2. 【Docker】Docker启动停止重启 Redirecting to /bin/systemctl start docker.service

    [root@liuawen local]# docker -v Docker version 1.13.1, build cccb291/1.13.1 [root@liuawen local]# 启动 ...

  3. docker save提示no space left on device错误

    使用df -h看了看,硬盘的确是够用的,于是排除了是硬盘容量的问题. 再细看错误提示: 目录是/var/lib/docker/tmp/docker-export-xxxx/xxxxx,猜测是docke ...

  4. [bug] docker:write /var/lib/docker/tmp/GetImageBlob613162680: no space left on device

    原因 分区空间不够,无法安装镜像 参考 https://www.cnblogs.com/elizwy/p/7722898.html https://blog.csdn.net/TinyJian/art ...

  5. Linux磁盘占满 no space left on device

    假如当前文件删除了,如果还有其他进程还在使用这个文件,这个文件删不干净:https://www.cnblogs.com/heyonggang/p/3644736.html 在Linux下查看磁盘空间使 ...

  6. docker 启动失败 Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

    CentOS7安装docker,安装成功后,启动失败 提示: 我们可以看到此处它提示是Failed to start Docker Application Container Engine. 于是在网 ...

  7. eBPF+Ftrace 合璧剑指:no space left on device?

    本文地址:https://www.ebpf.top/post/no_space_left_on_devices 最近在生产环境中遇到了几次创建容器报错 "no space left on d ...

  8. MySQL Crash Errcode: 28 - No space left on device

    一台MySQL服务器突然Crash了,检查进程 ps -ef | grep -i mysql 发现mysqld进程已经没有了, 检查错误日志时发现MySQL确实Crash了.具体如下所示: 注意日志中 ...

  9. docker启动centos7后sudo不能使用

    docker启动centos7后sudo不能使用 过程 使用docker -it xxx /bin/sh进入centos镜像,然后安装了docker,想使用systemctl start docker ...

随机推荐

  1. MySQL(数据类型和完整约束)

    MySQL数据类型 MySQL支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. 1.数值数据类型 包括整数类型TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT. ...

  2. ORM初识和数据库操作

    ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使用描述对象和数据库之 ...

  3. [SoapUI] 检查测试步骤的类型或者或者某种特定类型的步骤列表

    SoapUI Groovy : Check if test step is of specific type, such as : Wsdl, Rest, Jdbc, HTTP, Groovy etc ...

  4. windows Sql server performance monitor

    对于sql server 性能的监控主要从2个方面: 1. sql server自带的监控 Management->SQL Server Logs->Activity Monitor 在这 ...

  5. TensorFlow数据读取

    TensorFlow高效读取数据的方法 TF Boys (TensorFlow Boys ) 养成记(二): TensorFlow 数据读取 Tensorflow从文件读取数据 极客学院-数据读取 十 ...

  6. django学习第一天

    class ModelAdmin(BaseModelAdmin): """Encapsulate all admin options and functionality ...

  7. 12. The Biggest Safety Threat Facing Airlines 航空公司面临的最大安全威胁

    12. The Biggest Safety Threat Facing Airlines 航空公司面临的最大安全威胁 (1) The biggest safety threat facing air ...

  8. 移动设备输入Touch类及相关API

    Touch:[结构体]存储移动端手指触摸屏幕的信息.根据触摸信息,可以在移动端实现各种功能. Input.multiTouchEnabled:是否开启触控.true:表示多点触控:false:表示单点 ...

  9. Ubuntu 14.04 LTS 初装成

    原先博客放弃使用,几篇文章搬运过来 Windows 7下使用win32diskimager 制作启动盘,安装Ubuntu OS安装完成后,安装DrclientLinux. 安装搜狗输入法 Linux下 ...

  10. UML系统建模的分析和应用

    一.基本信息 标题:UML系统建模的分析和应用 时间:2016 出版源:无线互联科技 领域分类:统一建模语言 二.研究背景 问题定义:统一建模语言的分析应用 难点:掌握和理解相关系统的业务环境,掌握良 ...