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对象可以用来储存敏感信息,例如:密码、OAuthtoken、ssh等机密数据。Secret对象可以采用命令行或者Yaml文档声明方式创建。Secret对象是属于某个命名空间的,引用Secret对象要注意在相同的命名空间。