kubernetes系列(十二) - 存储之Secret
1. Secret简介
Secret
解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec
中。
Secret
可以以以下两种方式使用:
volume
挂载- 环境变量
2. Secret类型
Secret有四种类型:
注:一些教程说只有三种,经过笔者kubectl create secret --help
查看,且回顾之前ingress
七层代理的知识点,发现其他教程都漏了一种secret是tsl
Service Account
用来访问Kubernetes API,由Kubernetes 自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中
Opaque
base64编码
格式的Secret,用来存储密码、密钥等.
kubernetes.io/dockerconfigjson
用来存储私有
docker registry
的认证信息
kubernetes.io/tls
用来存储
tsl
证书。一般是用来配合ingress实现https
证书的配置,具体见ingress
那章
3. Service Account
- 用来访问
Kubernetes API Service
,由Kubernetes 自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount
目录中 - 即不是所有的pod都有权访问
api service
,不然会给api service
造成很大的压力。 service account
不需要我们自己管理!
示例
如下,因为kube-proxy
肯定会跟api-servie
交互,所以查看他的service account
4. Opaque
4.1 Opaque类型说明
Opaque类型的数据是一个 map类型,要求value是base64编码格式
示例
- 如下是base64编码和解码的:
4.2 Opaque创建方式
4.2.1 命令行创建
- 使用字面值创建
- 通过命令行创建不用将value指定为
base64
,但是yaml
形式必须指定,不然创建会失败!
kubectl create secret generic my-sec --from-literal=key1=value1
如下,类型为Opaque
:
- 使用文件或者文件夹创建
跟configmap一样,都是使用
--from-file
kubectl create secret generic my-sec --from-file=/一个文件夹或者一个文件
4.2.2 yaml资源清单创建
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWYyZDF1MmU2N2Rm
username: YWRtaW4=
4.3 Opaque使用方式
4.3.1 将Secret挂载到Volume
- 使用方式跟
configMap
差不多
apiVersion: v1
kind: Pod
metadata:
labels:
name: seret-test
name: seret-test
spec:
# volume中导入secret
volumes:
- name: secrets
secret:
secretName: mysecret
containers:
- image: lzw5399/tocgenerator
name: db
# mounts中使用volume中的secret
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
4.3.2 将Secret导出到环境变量中
- 使用方式跟
configMap
差不多
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: pod-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- name: pod-1
image: lzw5399/tocgenerator
ports:
- containerPort: 80
# 将secret的值赋给环境变量
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
5. Dockerconfigjson
用来存储私有docker registry
的认证信息
5.1 创建docker-registry类型的secret
kubectl create secret docker-registry myregistrykey --docker-server=hub.codepie.fun --docker-username=baoshu --docker-password=yourpwd --docker-email=baoshu@test.com
如下可以看到,创建出来的类型是kubernetes.io/dockerconfigjson
5.2 yaml中使用dockerconfigjson
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: lzw5399/tocgenerator
# 引用创建出来的dockerconfigjson
imagePullSecrets:
- name: myregistrykey
6. Tsl
用来存储tsl
证书。一般是用来配合ingress实现https
证书的配置,可以参见ingress
那篇
6.1 创建tsl
6.1.1 直接指定文件创建
kubectl create secret tls toc-secret --key tls.key --cert tls.crt
6.1.2 以yaml资源清单方式创建
apiVersion: v1
kind: Secret
metadata:
name: mywebsite-secret
data:
tls.crt: **************************
tls.key: **************************
6.2. 使用tsl secret
- 这里演示的是配置
ingress
,实现https域名访问
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tocgenerator-ingress
spec:
tls:
- hosts:
- toc.codepie.fun
# 使用tsl
secretName: toc-secret
rules:
- host: toc.codepie.fun
http:
paths:
- path: /
backend:
serviceName: tocgenerator-svc
servicePort: 80