什么是 Kubernetes Secret?

Secret 是 Kubernetes 中用来存储敏感信息的对象,它可以用来存储密码、OAuth 令牌或 ssh key 等。

Secret 有三种类型:

  1. Opaque: 默认类型,用来存储任意数据,一般用来存储密码等。
  2. kubernetes.io/service-account-token: 用于 service account,由 Kubernetes 自动创建和管理。
  3. kubernetes.io/dockercfg: 用于保存 Docker CLI 的自动登录授权信息。

例如,我们可以创建一个 Opaque 类型的 Secret 来存储 MySQL 的密码:

yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret 
type: Opaque
data:
  password: bXkgcGFzc3dvcmQ=

这里我们将密码编码为 base64 后存储在 Secret 的 data 字段中。要使用这个密码,需要先将其解码:

echo 'bXkgcGFzc3dvcmQ=' | base64 --decode
# my password

然后我们可以在 Pod 中以文件或环境变量的形式使用这个 Secret:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-secret
          key: password

这里我们将 Secret 设置为环境变量,Pod 启动后就可以使用这个环境变量来访问数据库。

我们也可以将 Secret 挂载为数据卷使用:

yaml 
apiVersion: v1
kind: Pod 
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: mysql
    volumeMounts:
    - name: mysql-secret-volume
      mountPath: /etc/secret-data
      readOnly: true
  volumes:
  - name: mysql-secret-volume
    secret:
      secretName: mysql-secret

然后 Secret 中的数据就可以在 /etc/secret-data 路径下访问。

所以总结来说,Secret 有以下主要用途:

  1. 存储敏感数据:如密码、密钥等。
  2. 以环境变量或数据卷的形式在 Pod 中使用。
  3. 主要有 Opaque、kubernetes.io/service-account-token 和 kubernetes.io/dockercfg 三种类型。