资源对象-secret
Secret实现
作用:加密数据,存储在etcd中,让pod容器,以挂载Volume方式进行访问
场景
凭证,凭据
如:用户名,密码
常见编码格式:
base64编码:echo -n "123" | base64 //以base64编码编译123
解释
secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
用户可以创建自己的secret,系统也会有自己的secret。
Pod需要先引用才能使用某个secret
Pod使用secret方式:作为volume的一个域被一个或多个容器挂载
內建的Secrets
由ServiceAccount创建的API证书附加的秘钥k8s自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信
创建自己的Secret
方式1:使用kubectl create secret命令
方式2:yaml文件创建Secret
方式3:kuboard创建
secret 使用
创建Secret
假如某个Pod要访问数据库,需要用户名密码,现在我们分别设置这个用户名和密码
Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码显示的安全隐患。
创建一个secret.yaml文件,内容用base64编码:明文显示容易被别人发现,这里先转码。
echo -n 'admin' | base64
echo -n '0' | base64
创建一个secret.yaml文件,内容用base64编码
vim secret.yml
---
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque #模糊
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
创建:
kubectl apply -f secret.yml
解析Secret中内容,还是经过编码的—需要解码
查看secret详细信息
kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2019-10-21T03:07:56Z"
name: mysecret
namespace: default
resourceVersion: "162855"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 36bcd07d-92eb-4755-ac0a-a5843ed986dd
type: Opaque
手动base64解码方式:
echo 'MWYyZDFlMmU2N2Rm' | base64 --d
使用Secret
secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用,也可以被系统中的其他资源使用。
一个Pod中引用Secret的列子:
创建一个Secret,多个Pod可以引用同一个Secret
修改Pod的定义,在spec.volumes[]加一个volume,给这个volume起个名字,spec.volumes[].secret.secretName记录的是要引用的Secret名字
vim pod_use_secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: testredis
image: daocloud.io/library/redis
volumeMounts: #挂载一个卷
- name: foo #这个名字需要与定义的卷的名字一致
mountPath: "/etc/foo" #挂载到容器里哪个目录下,随便写
readOnly: true
volumes: #数据卷的定义
- name: foo #卷的名字这个名字自定义
secret: #卷是直接使用的secret。
secretName: mysecret #调用刚才定义的secret
创建:
kubectl apply -f pod_use_secret.yaml //创建pod
kubectl exec -it mypod /bin/bash //进入目录,再映射目录下去看base64编码的文字
结果中看到,保存在Etcd里的用户名和密码信息,已经以文件的形式出现在了容器的Volume目录里。
而这个文件的名字,就是kubectl create secret指定的Key,或者说是Secret对象的data字段指定的Key。
每一个被引用的Secret都要在spec.volumes中定义
如果Pod中的多个容器都要引用这个Secret那么每一个容器定义中都要指定自己的volumeMounts,但是Pod定义中声明一次spec.volumes就好了。
映射secret key到指定的路径
可以控制secret key被映射到容器内的路径,利用spec.volumes[].secret.items来修改被映射的具体路径
vim pod_use_secret.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: testredis
image: daocloud.io/library/redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items: #定义一个items
- key: username #将那个key重新定义到那个目录下
path: ls #相对路径,相对于/etc/foo的路径,也就是/etc/foo/ls
2.创建
kubectl apply -f pod_use_secret.yaml
3.从volume中读取secret的值
kubectl exec -it mypod /bin/bash
username被映射到了文件/etc/foo/my-group/my-username而不是/etc/foo/username,而password没有被使用,这种方式每个key的调用需要单独用key像username一样调用
被挂载的secret内容自动更新
也就是如果修改一个Secret的内容,那么挂载了该Secret的容器中也将会取到更新后的值,但是这个时间间隔是由kubelet的同步时间决定的。
vim secret.yml
---
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: cWlhbmZlbmcK #修改为qianfeng的base64加密后的
password: MWYyZDFlMmU2N2Rm
1.创建
kubectl apply -f secret.yml
2.连接pod容器
kubectl exec -it mypod /bin/bash
root@mypod:/data# cd /etc/foo/my-group
root@mypod:/etc/foo/my-group# ls
my-username
root@mypod:/etc/foo/my-group# cat my-username
qianfeng
以环境变量的形式使用Secret
kubectl delete -f pod_use_secret.yaml
vim pod_use_secret.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: testredis
image: daocloud.io/library/redis
env: #定义环境变量
- name: SECRET_USERNAME #创建新的环境变量名称
valueFrom:
secretKeyRef: #调用的key是什么
name: mysecret #变量的值来自于mysecret
key: username #username里面的值
2.创建使用secret的pod容器
kubectl apply -f pod_use_secret.yaml
3.连接
kubectl exec -it mypod /bin/bash
加密流程
创建secret加密数据
编码数据的创建
vim secret.yaml
apiVersion:v1
kind: Secret
metadata:
name:mysecret
type:Opaque
data:
username: YWRtaW4=
password: MWYyZDF1MmU2N2Rm
kubecrl create -f secret.yaml //创建加密文件
kubectl get secret //查看secret
挂载到pod容器
以变量形式挂载
vim secret-var.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env: #环境变量
- name: SECRET_USERNAME
valueFrom:
secretkeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
kubectl apply -f secret-var.yaml
kubectl exec -it mypod bash //进入镜像
echo $SECRET_USERNAME //查看用户名
echo $SECRET_PASSWORD //查看密码
以Volume数据卷形式挂载
vim secret-vol.yaml
apiversion:v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo" #挂载目录
readonly: true
volumes:
- name:foo
secret:
secretName: mysecret
kubectl apply -f secret-vol.yaml
kubectl exec -it mypod bash
cd /etc/foo
cat possword //查看密码
cat username //查看用户名
案例
1.创建数据库用户的密码secret
vim secret.yml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
password: UWlhbkZlbmdAMTIzIQ==
kubectl apply -f secret.yml
2.创建数据库并使用secret
vim mysql.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-mysql
spec:
containers:
- name: mysql
image: daocloud.io/library/mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
创建:
kubectl apply -f myslq.yaml
测试:
mysql -uroot -p'QianFeng@123!' -h 10.244.2.13 -P3306
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque #模糊
data:
password: MTIzNDU2
database: d29yZHByZXNz
db_user: eXVuamlzdWFu
user_passwd: MTIzNDU2
---
apiVersion: v1
kind: Pod
metadata:
name: database
labels:
name: database
spec:
containers:
- name: database
image: 10.12.153.250:8888/library/mysql:5.7
volumeMounts: #挂载一个卷
- name: foo #这个名字需要与定义的卷的名字一致
mountPath: "/etc/foo" #挂载到容器里哪个目录下,随便写
readOnly: true
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: mysecret
key: database
volumes: #数据卷的定义
- name: foo #卷的名字这个名字自定义
secret: #卷是直接使用的secret。
secretName: mysecret #调用刚才定义的secret
items:
- key: db_user
path: mysql/username
nodeSelector:
kubernetes.io/hostname: kube-node1
标签:kubectl,name,kubernetes,secret,yaml,Secret,linux,foo
From: https://blog.csdn.net/qq_59207739/article/details/136884454