Kubernetes Secret 存储机密数据
2020-04-03 by dongnan
开始之前
在前面的三篇文章中,至此我们已经准备好了K8S
集群环境。
接下来我们将以在K8S
集群运行一个真实的项目为目标,依次介绍项目所使用的K8S
资源对象。
这个项目是一个典型的Web
系统,使用 Java Spring Boot
框架开发,需要使用 MySql
、Redis
数据库、NFS
共享存储(多个Pod
容器间共享文件)。
由于K8S
环境部署在阿里云上,所以这里使用了阿里云提供的 RDS-Mysql
、RDS-Redis
数据库服务、NAS(NFS)
网络附加存储等中间件产品,对于K8S
集群来说,我们需要将这些服务映射为K8S
的资源对象。
项目使用的K8S
的资源对象包括:
- PV&PVC,用于Pod数据卷(NFS)。
- Pod (volumeMounts、readinessProbe),挂载数据卷、健康检查。
- Secret,存储机密数据。
- Service,服务-外部域名(ExternalName)。
- NetworkPolicy,网络策略。
- LimitRange,限制资源。
- Ingress
环境
测试的k8s
集群由一个Master
管理节点、两个Worker
计算节点组成,详细请参考这里。
目标
使用Secret
对象保存Docker
私有镜像仓库的账密信息。
举个栗子
命令行方式
使用 kubectl
命令创建 secret
对象:
kubectl -n yyi-prod create secret docker-registry docker-repo \
--docker-server=hub.xyc.com \
--docker-username=dongnan \
--docker-password=mypassword
需要注意的-n
参数指定了命名空间,因为secret
对象也是属于某个命名空间的。
查看 Secrets
详细信息:
kubectl -n yyi-prod get secrets docker-repo -o yaml | head -n4
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJodW...省略...OiJkb25nbmFuIn19fQ==
kind: Secret
除了kubectl
命令方式,也可以采用 yaml
文档方式创建 secret
对象。
Yaml文档
定义 Secret
,名字为 docker-repo
:
apiVersion: v1
kind: Secret
metadata:
name: docker-repo
namespace: yyi-prod
data:
.dockerconfigjson: eyJhdXRocyI6eyJodW...省略...OiJkb25nbmFuIn19fQ==
type: kubernetes.io/dockerconfigjson
这与 Kubernetes Pod 数据卷与健康检查 Deployment
定义的 imagePullSecrets
相对应:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: yii-prod
#...省略
imagePullSecrets:
- name: docker-repo # 这里
containers:
#...省略
创建Secret
kubectl apply -f yii-secret.yaml
验证
查看 Secrets
详细信息:
kubectl -n yyi-prod describe secrets docker-repo
Name: docker-repo
Namespace: yyi-prod
Labels: <none>
Annotations:
Type: kubernetes.io/dockerconfigjson
Data
====
.dockerconfigjson: 118 bytes
Secret
Kubernetes 的 Secret
对象可以用来储存敏感信息,例如:密码
、OAuth
token
、ssh
等。
有如下几种使用场景:
- 作为
Pod
的数据卷挂载。 - 作为
Pod
的环境变量。 kubelet
在下载镜像时作为docker
镜像仓库的凭证使用(用户名、密码等)。
使用base64编码
Secret
对象中 data
子域的值需要使用base64
进行编码,例如:
echo -n 'mypassword' | base64
bXlwYXNzd29yZA==
# 解码
echo -n 'your_secret' | base64 --decode
mypassword
作为环境变量使用
定义 Secret
对象:
---
apiVersion: v1
kind: Secret
metadata:
namespace: abc-test
name: secret-rds
type: Opaque
data:
spwd: VGhpc015UGFzc3dvcmQ=
作为Pod
的环境变量使用:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: abc-test
#...省略
env:
- name: SPWD
valueFrom:
secretKeyRef:
name: secret-rds
key: spwd
#...省略
在Pod
中为大写的环境变量:
kubectl -n abc-test exec -ti abc-web-xxx-2r5fg env | grep SPWD
SPWD=ThisMyPassword # 注意这里
小结
Secret
对象可以用来储存敏感信息,例如:密码
、OAuth
token
、ssh
等机密数据。Secret
对象可以采用命令行或者Yaml
文档声明方式创建。Secret
对象是属于某个命名空间的,引用Secret
对象要注意在相同的命名空间。