# 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源文件
- 服務升級
- 筆記
- 鏡像