目录
一、Secret配置管理介绍
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。 敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
Pod 可以用两种方式使用 secret:
• 作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里;
• 当 kubelet 为 pod 拉取镜像时使用。
Secret的类型:
• Service Account:Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改 pod 以使用此类型的 secret。对应的 secret 会自动挂载到Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中
• Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据, 因此安全性弱。
• kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
对于每一个namespace的sa都有一个默认的default用来使得pod连接apiserver;每个namespace下有一个名为default的默认的ServiceAccount对象;
ServiceAccount里有一个名为Tokens的可以作为Volume一样被Mount到Pod里的Secret,当Pod启动时这个Secret会被自动Mount到Pod的指定目录下,用来协助完成Pod中的进程访问API Server时的身份鉴权过程。
二、创建一个Secret
2.1 从文件创建
##创建用户和密码的文件
[root@server1 secret]# echo -n 'admin' > ./username.txt
[root@server1 secret]# echo -n 'password' > ./password.txt
[root@server1 secret]# ls -a
. .. password.txt username.txt
###通过文件创建
[root@server1 secret]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
##查看秘密内容
[root@server1 secret]# kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 18s
default-token-drfsm kubernetes.io/service-account-token 3 36d
##含有特殊字符时的创建
[root@server1 secret]# kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\!B\\*d\$zDsb
secret/dev-db-secret created
##创建过程中使用BSAER64对内容进行一定的转义
[root@server1 secret]# echo 'admin' | base64
YWRtaW4K
[root@server1 secret]# echo 'password' | base64
cGFzc3dvcmQK
##secret查看
[root@server1 secret]# kubectl get secret db-user-pass -o yaml
默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容,可以 通过以下方式查看:
2.2 编写一个Secret对象
##创建secret的对象文件
[root@server1 secret]# vim secret.yml
[root@server1 secret]# cat secret.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: cmVkaGF0
##文件应用并查看创建结果
[root@server1 secret]# kubectl apply -f secret.yml
secret/mysecret created
[root@server1 secret]# kubectl get secret
三、将Secret挂载到volume中
##编写pod文件
[root@server1 secret]# vim sa-volume.yml
admin[root@server1 secret]# cat sa-volume.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: cmVkaGF0
---
apiVersion: v1
kind: Pod
metadata:
name: mysecret
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret"
readOnly: true
volumes: ##挂载的内容
- name: secrets
secret:
secretName: mysecret
##查看当前pod
[root@server1 secret]# kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 36d
##文件应用
[root@server1 secret]# kubectl apply -f sa-volume.yml
secret/mysecret unchanged
pod/mysecret created
##查看创建的secret
[root@server1 secret]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 27m
default-token-drfsm kubernetes.io/service-account-token 3 36d
dev-db-secret Opaque 2 25m
mysecret Opaque 2 8m16s
##查看配置文件中的内容
[root@server1 secret]# kubectl exec mysecret -- ls /secret
password
username
[root@server1 secret]# kubectl exec mysecret -- cat /secret/password
redhat[root@server1 secret]# kubectl exec mysecret -- cat /secret/username
四、向指定路径映射Secret
##编写映射文件
[root@server1 secret]# vim sa-morror.yml
[root@server1 secret]# cat sa-morror.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: cmVkaGF0
---
apiVersion: v1
kind: Pod
metadata:
name: sa-nginx
spec:
containers:
- name: sa-nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret" ##映射到该目录下
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
items:
- key: username ##将mysecret中的username 映射到路径path下《主路径下》
path: my-group/my-username
##使文件生效
[root@server1 secret]# kubectl apply -f sa-morror.yml
secret/mysecret unchanged
pod/sa-nginx created
##查看创建的POD
[root@server1 secret]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysecret 1/1 Running 0 11m
sa-nginx 1/1 Running 0 10s
##查看映射路径中的文件
[root@server1 secret]# kubectl exec sa-nginx -- ls /secret/my-group
my-username
[root@server1 secret]# kubectl exec sa-nginx -- cat /secret/my-group/my-username
admin
五、将Secret设置为环境变量
##编写配置文件
[root@server1 secret]# vim sa-env.yml
[root@server1 secret]# cat sa-env.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: cmVkaGF0
---
apiVersion: v1
kind: Pod
metadata:
name: secret-env
spec:
containers:
- name: nginx
image: nginx
env: ##设置环境变量
- name: SECRET_USERNAME ##名字:key
valueFrom: ##值的来源:value
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@server1 secret]# kubectl apply -f sa-env.yml
secret/mysecret unchanged
pod/secret-env created
[root@server1 secret]# kubectl exec secret-env -- env
六、创建私有仓库的认证
当个人私有仓库不公开时,若没有登陆,则此时无法进行镜像下载。使用kubernetes.io/dockerconfigjson 可以用于存储docker registry的认证信息。在镜像下载时进行认证。
##创建认证
[root@server1 secret]# kubectl create secret docker-registry myregistrykey --docker-server=www.linux.org --docker-username=admin --docker-password=redhat --docker-email=root@server1.com
[root@server1 secret]# kubectl get secret
NAME TYPE DATA AGE
myregistrykey kubernetes.io/dockerconfigjson 1 10s
[root@server1 secret]# vim sa-registry.yml
[root@server1 secret]# cat sa-registry.yml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: game2048
image: yakexi007/game2048
imagePullSecrets: ##设置镜像拉取时所需的认证资源
- name: myregistrykey
[root@server1 secret]# kubectl apply -f sa-registry.yml
pod/mypod created