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 数据定义容器变量

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

相关推荐
wenyue11211 小时前
Enhancing K8s Gateway API with Easegress Without Changing a Single Line of Code
容器·kubernetes·gateway
.Ayang2 小时前
微服务介绍
网络·安全·网络安全·微服务·云原生·架构·安全架构
hap07282 小时前
在Docker中部署osrm-backend
docker·容器·云计算
云和数据.ChenGuang4 小时前
02 DHCP搭建
运维·网络·docker·容器·运维开发
_Matthew5 小时前
学习Zookeeper
分布式·zookeeper·云原生
赫萝的红苹果6 小时前
docker容器化部署springboot项目
spring boot·docker·容器
kiddkid8 小时前
微服务02
微服务·云原生·架构
sxy1993sxy20189 小时前
k8s rainbond centos7/win10 -20241124
云原生·容器·kubernetes
运维&陈同学10 小时前
【zookeeper02】消息队列与微服务之zookeeper单机部署
linux·服务器·分布式·微服务·zookeeper·云原生·消息队列·云计算
loveLifeLoveCoding10 小时前
docker 相关组成
docker·容器