跳转至

Kubernetes Secret 存储机密数据


2020-04-03 by dongnan

开始之前

在前面的三篇文章中,至此我们已经准备好了K8S集群环境。

接下来我们将以在K8S集群运行一个真实的项目为目标,依次介绍项目所使用的K8S资源对象。

这个项目是一个典型的Web系统,使用 Java Spring Boot框架开发,需要使用 MySqlRedis数据库、NFS共享存储(多个Pod容器间共享文件)。

由于K8S环境部署在阿里云上,所以这里使用了阿里云提供的 RDS-MysqlRDS-Redis 数据库服务、NAS(NFS) 网络附加存储等中间件产品,对于K8S集群来说,我们需要将这些服务映射为K8S的资源对象。

项目使用的K8S的资源对象包括:

环境

测试的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 tokenssh等。

有如下几种使用场景:

  • 作为 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 tokenssh等机密数据。
  • Secret对象可以采用命令行或者Yaml文档声明方式创建。
  • Secret对象是属于某个命名空间的,引用 Secret对象要注意在相同的命名空间。

参考

回到页面顶部