Secret介绍

k8s secrets用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了。

Secret有三种类型

Opaque

1
base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。

Service Account(暂时没用过)

1
用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。

kubernetes.io/dockerconfigjson

1
用来拉取私有库镜像的认证信息(比如nexus或者habor等)

Opaque类型

  • base64加密(--wrap=0表示不换行输出)
    echo -n 'xiaowu' | base64 --wrap=0
  • base64解密
    echo 'eGlhb3d1' | base64 --decode

k3s中配置EncryptionConfig 以加强安全性

k8s中配置EncryptionConfig 以加强安全性

  • 在yaml中使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 声明一个secret
---
apiVersion: v1
data:
username: YWRtaW4=
password: eGlhb3d1
token: MTIzMTIz
kind: Secret
metadata:
name: docker-demo-secret
namespace: test
type: Opaque
---
# 环境变量引入
---
apiVersion: apps/v1
kind: Deployment
...
envFrom:
- secretRef:
name: docker-demo-secret
---
# 挂在卷方式引入
---
apiVersion: apps/v1
kind: Deployment
...
volumeMounts:
- name: secret #指定名称必须与下面一致
mountPath: /build/config
volumes:
- name: secret #指定名称必须与上面一致
secret:
secretName: docker-demo-secret
# items: # 此方法一般适用于configmap/secret有多组配置文件,想要单一引用的情况. 此方式会导致mountPath目录中所有先前的文件都被删除。
# - key: xx # 指定configmap/secret中的某一个配置的key
# path: xx # 拼接mountPath,且不能以/开头
---

Service Account类型

1
Service Account 对象的作用,就是 Kubernetes 系统内置的一种“服务账户”,它是 Kubernetes 进行权限分配的对象。比如,Service Account A,可以只被允许对 Kubernetes API 进行 GET 操作,而 Service Account B,则可以有 Kubernetes API 的所有操作权限。

kubernetes.io/dockerconfigjson类型

  • 直接使用kubectl create命令创建即可,如果是多个namespace,可以拼接多个-n参数
1
kubectl create secret docker-registry <secret_name> --docker-server=<docker.io> --docker-username=<username> --docker-password=<password> --docker-email=<email> -n <namespace1> -n <namespace2>
  • 需要拉取私有仓库中的docker镜像的话就需要使用到上面的这个Secret
1
2
3
4
apiVersion: v1
...
imagePullSecrets:
- name: <secret_name>

创建/更新

格式

1
kubectl create secret <type> <name> <data> <options>

其中,指定secret对象的类型,可以是generic、docker-registry、tls等。指定secret对象的名称,是secret对象的数据,是secret对象的其他选项。

常见指令

generic类型的secret,用于存储任意类型的数据:

1
2
3
kubectl create secret generic <name> --from-literal=<key>=<value>
OR
kubectl create secret generic filebeat-ca --from-file=ca.crt -n sopei-utils

其中,是secret对象的名称,是数据的键名,是数据的值。

docker-registry类型的secret,用于存储Docker镜像仓库的认证信息:

1
kubectl create secret docker-registry <name> --docker-username=<username> --docker-password=<password> --docker-email=<email> --docker-server=<server>

其中,是secret对象的名称,和是Docker镜像仓库的认证信息。

tls类型的secret,用于存储TLS证书和私钥:

1
kubectl create secret tls <name> --cert=<cert_file> --key=<key_file>

其中,是secret对象的名称,是TLS证书和私钥的文件路径。

更新Secret

1
2
3
4
5
6
eg:
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key --dry-run -o yaml |kubectl apply -f -

OR

先删再创建