Secret详解
secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
- 用户可以创建自己的secret,系统也会有自己的secret。
- Pod需要先引用才能使用某个secret
secret仅提供有限安全
- 协作时防止机密数据泄露
- 为secret资源设置单独安全访问策略
Pod有2种方式来使用secret:
-
- 作为volume的一个域被一个或多个容器挂载
-
- 在拉取镜像的时候被kubelet引用。
创建一个secret.yaml文件,内容用base64编码:明文显示容易被别人发现,这里先转码。
echo -n 'admin' | base64
YWRtaW4=
echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rmvim secret.yml
---
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque #模糊
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm
或者
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque #模糊
stringData:username: adminpassword: 1f2d1e2e67df
kubectl apply -f secret.yml 创建
kubectl get secrets
kubectl get secret mysecret -o yaml
pod使用
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: testredisimage: daocloud.io/library/redisvolumeMounts: #挂载一个卷- name: foo #这个名字需要与定义的卷的名字一致mountPath: "/etc/foo" #挂载到容器里哪个目录下,随便写readOnly: truevolumes: #数据卷的定义- name: foo #卷的名字这个名字自定义secret: #卷是直接使用的secret。secretName: mysecret #调用刚才定义的secret
映射secret key到指定的路径
volumes:- name: foosecret:secretName: mysecretitems: #定义一个items- key: username #将那个key重新定义到那个目录下path: my-group/my-username #相对路径,相对于/etc/foo的路径
以环境变量的形式使用Secret
---
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: testredisimage: daocloud.io/library/redisenv: #定义环境变量- name: SECRET_USERNAME #创建新的环境变量名称valueFrom:secretKeyRef: #调用的key是什么name: mysecret #变量的值来自于mysecretkey: username #username里面的值
spec:containers:- name: testredisimage: daocloud.io/library/redisenvFrom: #定义环境变量- secretRef: #调用的key是什么name: mysecret #变量的值来自于mysecret- configMapRef: name: configmap1
Deployment配置
apiVersion: v1
kind: Deployment
metadata:name: myDeployment
spec:selector:matchLabels:app: redisDeployreplicas: 1template:metadata:labels:app: redisDeployspec:containers:- name: redisDeployimage: daocloud.io/library/redisenvFrom:- configMapRef:name: myconfigMap- secretRef:name: mysecret
apiVersion: v1
kind: Service
metadata:name: myService
spec:ports:- name: httpport: 8080targetPort: 8080nodePort: 31080selector:app: redisDeploytype: NodePort