在Kubenetes中使用Secret

在Kubenetes中使用Secret

Posted by Brian on Monday, October 30, 2023

简介

Secret 在kubernetes 中主要用来存储敏感的信息。 我们可以把应用程序的机密信息都以Secret的方式存入到ectd中。

使用方式

文件挂载

使用隐藏文件的方式挂载到Pod中。示例如下:

创建 dot-secret.yaml

kubectl create namespace secret-demo
apiVersion: v1
kind: Secret
metadata:
  name: dotfile-secret
  namespace: secret-demo
data:
  .secret-file: dmFsdWUtMg0KDQo=
  username: YWRtaW4=
  password: YWRtaW4zMjE=
kubectl create -f dot-secret.yaml

创建 dot-secret-pod.yaml,并将 dotfile-secret 挂载到容器/etc/secret-volume目录下

apiVersion: v1	
kind: Pod
metadata:
  name: secret-dot-pod
  namespace: secret-demo
spec:
  volumes:
  - name: secret-volume
    secret:
      # 从 Secret 中读取名为 dotfile-secret 的 secret
      secretName: dotfile-secret
  containers:
  - name: dotfile-test-container
    image: nginx
    volumeMounts:
    - name: secret-volume
      readOnly: true
      mountPath: "/etc/secret-volume"
kubectl create -f dot-secret-pod.yaml

稍等一会创建后进入容器查看 /etc/secret-volume 目录:

kubectl exec -it -n secret-demo secret-dot-pod /bin/sh

# ls -al /etc/secret-volume

不出意外在该目录下会有一个 .secret-file,username,password 的三个文件。

环境变量

修改 dot-secret-pod.yaml如下:

apiVersion: v1	
kind: Pod
metadata:
  name: secret-dot-pod
  namespace: secret-demo
spec:
  volumes:
  - name: secret-volume
    secret:
      # 从 Secret 中读取名为 dotfile-secret 的 secret
      secretName: dotfile-secret
  containers:
  - name: dotfile-test-container
    image: nginx
    env:
    # 从 Secret 中读取名为 dotfile-secret 的 username 字段
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: dotfile-secret
          key: username
    # 从 Secret 中读取名为 dotfile-secret 的 password 字段
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: dotfile-secret
          key: password
    volumeMounts:
    - name: secret-volume
      readOnly: true
      mountPath: "/etc/secret-volume"

我们在 pod 中增加了 USERNAME 和 PASSWORD两个环境变量。它们的值分别是从 dotfile-secret.username 与 dotfile-secret.password 中读取。

kubectl apply -f dot-secret-pod.yaml

进入容器验证:

kubectl exec -it -n secret-demo secret-dot-pod /bin/sh                                                                                                                                                                                                                                                                                                            

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# echo $USERNAME
admin
# echo $PASSWORD
admin321

Secret VS ConfigMap

相同点:

  • key/value的形式
  • 属于某个特定的namespace
  • 可以导出到环境变量
  • 可以通过目录/文件形式挂载
  • 通过 volume 挂载的配置信息均可热更新

不同点:

  • Secret 可以被 ServerAccount 关联
  • Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
  • Secret 支持 Base64 加密

Secret 的类型

内置类型用法
Opaque用户定义的任意数据
kubernetes.io/service-account-token服务账号令牌
kubernetes.io/dockercfg~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth用于基本身份认证的凭据
kubernetes.io/ssh-auth用于 SSH 身份认证的凭据
kubernetes.io/tls用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token启动引导令牌数据

这里我们暂时只需要掌握如何挂载到容器中进行使用就行。对应的数据类型在使用时查查官方文档即可。

清理资源

kubectl delete -f dot-secret-pod.yaml
kubectl delete -f dot-secret.yaml
kubectl delete namespace secret-demo