# 1. 作用
> k8s secret用于存储密码、秘钥等敏感信息,将加密信息存储到etcd中,有三种实现形式
**1. Opaque**
base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。Opaque 类型的数据是一个 map 类型,要求value是base64编码。
> 手动创建base64加密
```
$ echo -n 'admin' | base64
YWRtaW4=
```
```
$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
```
解密
```
$ echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
1f2d1e2e67df
```
这里需要注意的是,像这样创建的 Secret 对象,它里面的内容仅仅是经过了转码,而并没有被加密。在真正的生产环境中,你需要在 Kubernetes 中开启 Secret 的加密插件,增强数据的安全性。
**2. Service Account**
> 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 **/run/secrets/kubernetes.io/serviceaccount** 目录中。
> Service Account是k8s的一种账户,用于访问Api server时候进行登录和鉴权
**3. kubernetes.io/dockerconfigjson**
用来存储私有docker registry的认证信息。如果想要访问私有镜像仓库
`kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL`
```
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: 192.168.1.100:5000/test:v1
imagePullSecrets:
- name: myregistry
```
# 2. 创建
## 2.1 通过命令创建
`kubectl create secret`
**1. 本地文件**
user.txt和password.txt文件内容如下:
```
[root@master secretDir]# echo 'admin' > user.txt
[root@master secretDir]# echo 'admin' > password.txt
[root@master secretDir]# kubectl create secret generic user --from-file=./user.txt
secret/user created
[root@master secretDir]# kubectl create secret generic pass --from-file=./password.txt
secret/pass created
[root@master secretDir]# kubectl get secret
NAME TYPE DATA AGE
default-token-fb8rp kubernetes.io/service-account-token 3 8d
pass Opaque 1 33s
user Opaque 1 54s
[root@master secretDir]#
```
**2. literal(键值对)**
```
$ kubectl create secret generic user --from-literal=username=admin
$ kubectl create secret generic pass --from-literal=password=1f2d1e2e67df
```
**3. 通过yaml文件创建**
#secret.yaml
```
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
user: YWRtaW4=
pass: MWYyZDFlMmU2N2Rm
```
> 注:通过yaml创建Opaque类型的Secret值需要base64编码
创建secret
`kubectl create -f secret.yaml`
# 3. 使用
## 3.1 通过Volume挂载的方式
```
#test-projected-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-projected-volume
spec:
containers:
- name: test-secret-volume
image: busybox
args:
- sleep
- "86400"
volumeMounts:
- name: mysql-cred
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: mysql-cred
projected:
sources:
- secret:
name: user
- secret:
name: pass
```
创建pod对象
`$ kubectl create -f test-projected-volume.yaml`
当 Pod 变成 Running 状态之后,我们再验证一下这些 Secret 对象是不是已经在容器里了:
```
$ kubectl exec -it test-projected-volume -- /bin/sh
$ ls /projected-volume/
user
pass
$ cat /projected-volume/user
admin
$ cat /projected-volume/pass
1f2d1e2e67df
```
## 3.2 通过环境变量
```
#pod-secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-env
spec:
containers:
- name: myapp
image: busybox
args:
- sleep
- "86400"
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: user
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: pass
restartPolicy: Never
```
创建pod
$kubectl create -f pod-secret-env.yaml
pod运行成功后:
$ kubectl exec -it pod-secret-env -- /bin/sh
进入容器中查看环境变量
不同点:
Secret 可以被 ServerAccount 关联
Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
Secret 支持 Base64 加密
Secret 分为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型,而 Configmap 不区分类型
- docker
- docker安装
- 数据持久化
- 镜像管理
- Dockerfile
- 镜像的分层
- add copy
- 构建实例
- 镜像的导入导出
- 清理构建空间
- 配置阿里云加速器
- docker网络模型
- 本地仓库
- registry
- harbor
- IDEA部署docker
- 软件安装
- 安装es
- 安装MongoDB
- 安装rabbitmq
- 安装redis
- 安装nacos
- 安装mysql
- Minio
- 镜像中心
- kubernetes
- 1. 安装k8s
- 2.主要组件
- 3.污点
- 4.pod
- 5.控制器
- 6.网络
- 7.探针
- 8.安装Dashbord
- 9.secret
- 9.serviceAccount
- 10.service
- 资源清单
- kube-proxy
- flannel源文件
- 服务升级
- 笔记
- 镜像