k8s - Secret实践练习

参考文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/

这个和ConfigMap很相似,这里选两个做下测试,就不过多赘述了

简介

Secret 类似于 ConfigMap 但专门用于保存机密数据。

Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。

默认情况下,Kubernetes Secret 未加密地存储在 API 服务器的底层数据存储(etcd)中。 任何拥有 API 访问权限的人都可以检索或修改 Secret,任何有权访问 etcd 的人也可以。 此外,任何有权限在命名空间中创建 Pod 的人都可以使用该访问权限读取该命名空间中的任何 Secret; 这包括间接访问,例如创建 Deployment 的能力。

为了安全地使用 Secret,请至少执行以下步骤:

  1. 为 Secret 启用静态加密。
  2. 以最小特权访问 Secret 并启用或配置 RBAC 规则。
  3. 限制 Secret 对特定容器的访问。
  4. 考虑使用外部 Secret 存储驱动。
    有关管理和提升 Secret 安全性的指南,请参阅 Kubernetes Secret 良好实践。

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 启动引导令牌数据

可选类型参数

● generic: 通用类型

● tls:此类型仅用于存储私钥和证书

● docker-registry: 保存docker 仓库的认证信息

使用场景

● 设置容器的环境变量。

● 向 Pod 提供 SSH 密钥或密码等凭据。

● 允许 kubelet 从私有镜像仓库中拉取镜像。

Secret的使用

创建 Secret 有以下几种可选方式:

● 使用kubectl

● 使用配置文件

● 使用 Kustomize 工具

当你在 Pod 中引用 Secret 时,你可以将该 Secret 标记为可选,就像下面例子中所展示的那样。 如果可选的 Secret 不存在,Kubernetes 将忽略它。

例如:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      optional: true

使用 kubectl 编辑 Secret

yaml 复制代码
#这将打开默认编辑器,并允许你更新 data 字段中的 base64 编码的 Secret 值
kubectl edit secrets <secret-name>

#请编辑下面的对象。以"#"开头的行将被忽略,
#空文件将中止编辑。如果在保存此文件时发生错误,
#则将重新打开该文件并显示相关的失败。
apiVersion: v1
data:
  password: UyFCXCpkJHpEc2I9
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2022-06-28T17:44:13Z"
  name: db-user-pass
  namespace: default
  resourceVersion: "12708504"
  uid: 91becd59-78fa-4c85-823f-6d44436242ac
type: Opaque

#清理
kubectl delete secret db-user-pass

在 Pod 以文件形式使用 Secret

让 Kubernetes 将该 Secret 的值以 文件的形式呈现,该文件存在于 Pod 中一个或多个容器内的文件系统内。

创建一个可以通过卷访问 Secret 数据的 Pod。

yaml 复制代码
#创建Secret - 和ConfigMap使用方式是不是很像?就中间加了个类型 generic/docker-registry/...
kubectl create secret generic test-secret --from-literal='username=my-app' --from-literal='password=39528$vdg7Jb'

#pods/inject/secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      volumeMounts:
        # name 必须与下面的卷名匹配
        - name: secret-volume
          mountPath: /etc/secret-volume
          readOnly: true
  # Secret 数据通过一个卷暴露给该 Pod 中的容器
  volumes:
    - name: secret-volume
      secret:
        secretName: test-secret

#创建 Pod
kubectl apply -f https://k8s.io/examples/pods/inject/secret-pod.yaml

#确认 Pod 正在运行
kubectl get pod secret-test-pod

#获取一个 Shell 进入 Pod 中运行的容器
kubectl exec -i -t secret-test-pod -- /bin/bash

#Secret 数据通过挂载在 /etc/secret-volume 目录下的卷暴露在容器中。
#在 Shell 中,列举 /etc/secret-volume 目录下的文件:
#在容器中 Shell 运行下面命令
ls /etc/secret-volume

#在 Shell 中,显示 username 和 password 文件的内容:
#在容器中 Shell 运行下面命令
echo "$( cat /etc/secret-volume/username )"
echo "$( cat /etc/secret-volume/password )"

使用 Secret 数据定义容器变量

好,貌似中间件的账户密码什么的,是不是都可以这样玩儿了?

相关推荐
ZHOU西口28 分钟前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
牛角上的男孩1 小时前
Istio Gateway发布服务
云原生·gateway·istio
JuiceFS2 小时前
好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
运维·云原生
景天科技苑3 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge4 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇4 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试6 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!12 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis15 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
wclass-zhengge15 小时前
Docker篇(Docker Compose)
运维·docker·容器