创建Secret(手动)

和创建其他类型的 API 对象(Pod、Deployment、StatefulSet、ConfigMap 等)一样,您也可以先在 yaml 文件中定义好 Secret,然后通过 kubectl apply -f 命令创建。此时,您可以通过如下两种方式在 yaml 文件中定义 Secret:

  • data:使用 data 字段时,取值的内容必须是 base64 编码的
  • stringData:使用 stringData 时,更为方便,您可以直接将取值以明文的方式写在 yaml 文件中

在 yaml 中定义 data

  • 假设您要保存假设您要保存 username=adminpassword=1f2d1e2e67df 到 Secret 中,请先将数据的值转化为 base64 编码,执行如下命令:

    sh 复制代码
    echo -n 'admin' | base64
    YWRtaW4=
    echo -n '1f2d1e2e67df' | base64
    MWYyZDFlMmU2N2Rm 
  • 创建 secret.yaml 文件,内容如下所示:

    yaml 复制代码
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: MWYyZDFlMmU2N2Rm
  • 执行命令

    sh 复制代码
    kubectl apply -f ./secret.yaml

    输出结果如下所示:

    text 复制代码
    secret/mysecret created

    此时 Secret 创建成功

在 yaml 中定义 stringData

有时,您并不想先将用户名和密码转换为 base64 编码之后再创建 Secret,则,您可以通过定义 stringData 来达成,此时 stringData 中的取值部分将被 apiserver 自动进行 base64 编码之后再保存。

  • 创建文件 secret1.yaml,内容如下所示:
yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  username: admin
  password: 1f2d1e2e67df

执行命令 kubectl apply -f ./secret1.yaml 输出结果如下所示:

复制代码
secret/mysecret configured

此时 Secret 创建成功

执行命令 kubectl get -f ./secret1.yaml -o yaml 输出结果如下所示:

yaml 复制代码
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"password":"1f2d1e2e67df","username":"admin"},"type":"Opaque"}
  creationTimestamp: "2023-10-24T15:20:19Z"
  name: mysecret
  namespace: default
  resourceVersion: "53720198"
  uid: 14321f8d-630a-4dbb-a920-b5791db67d1f
type: Opaque
  • 此时 annotation 中可以看到 password 的明文,这也许并不是您所期望的
  • 输出的 Secret 对象中,stringData 字段不再出现

同时定义了 data 和 stringData

如果您同时定义了 data 和 stringData,对于两个对象中 key 重复的字段,最终将采纳 stringData 中的 value

  • 创建文件 secret2.yaml,该文件同时定义了 data 和 stringData,内容如下所示:

    yaml 复制代码
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
    stringData:
      username: administrator
  • 执行命令 kubectl apply -f ./secret2.yaml 输出结果如下所示:

    text 复制代码
    secret/mysecret configured

    此时 Secret 创建成功

  • 执行命令 kubectl get -f ./secret2.yaml -o yaml 输出结果如下所示:

    yaml 复制代码
    apiVersion: v1
    data:
      password: MWYyZDFlMmU2N2Rm
      username: YWRtaW5pc3RyYXRvcg==
    kind: Secret
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","data":{"username":"YWRtaW4="},"kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"username":"administrator"},"type":"Opaque"}
      creationTimestamp: "2023-10-24T15:20:19Z"
      name: mysecret
      namespace: default
      resourceVersion: "53720952"
      uid: 14321f8d-630a-4dbb-a920-b5791db67d1f
    type: Opaque

此处 YWRtaW5pc3RyYXRvcg== 解码后的值是 administrator

将配置文件存入 Secret

假设您的某个应用程序需要从一个配置文件中读取敏感信息,此时,您可以将该文件的内容存入 Secret,再通过数据卷的形式挂载到容器。挂载方式未完待续

例如,您的应用程序需要读取如下配置文件内容:

yaml 复制代码
apiUrl: "https://www.api.com/api/v1"
username: user
password: password

您可以使用下面的 secret3.yaml 创建 Secret

复制代码
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  config.yaml: |-
    apiUrl: "https://www.api.com/api/v1"
    username: user
    password: password

执行命令 kubectl apply -f ./secret3.yaml 输出结果如下所示:

复制代码
secret/mysecret configured

此时 Secret 创建成功

  • 执行命令 kubectl get -f ./secret3.yaml -o yaml 输出结果如下所示:
yaml 复制代码
apiVersion: v1
data:
  config.yaml: YXBpVXJsOiAiaHR0cHM6Ly93d3cuYXBpLmNvbS9hcGkvdjEiCnVzZXJuYW1lOiB1c2VyCnBhc3N3b3JkOiBwYXNzd29yZA==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"config.yaml":"apiUrl: \"https://www.api.com/api/v1\"\nusername: user\npassword: password"},"type":"Opaque"}
  creationTimestamp: "2023-10-24T15:20:19Z"
  name: mysecret
  namespace: default
  resourceVersion: "53721752"
  uid: 14321f8d-630a-4dbb-a920-b5791db67d1f
type: Opaque
相关推荐
学传打活1 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活6 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng16814 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心16 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552722 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552723 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝24 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552724 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552725 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055271 个月前
Java实用类应用精讲
人工智能·1024程序员节