K8S实战(十三)| Secret 对象

前言

Secret 可以用来保存密码、密钥等敏感信息,避免密钥直接放在 Pod 的YAML定义文件或容器镜像中导致的泄露问题。

密钥使用 Base64 编码形式存储于 Secret 对象中,Pod 挂载后自动解码为明文。

更新历史

通过 kubectl 创建 Secret

创建用户名/密码文件

echo -n 'username' > ./username.txt
echo -n 'password' > ./password.txt

写入 Secret 对象中

# kubectl create secret generic db-info --from-file=./username.txt --from-file=./password.txt
secret/db-info created

检查 Secret

# kubectl get secret
NAME                  TYPE                                  DATA   AGE
db-info               Opaque                                2      106s

查看刚写入的 db-info 的详细信息

# kubectl describe secret db-info
Name:         db-info
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
username.txt:  8 bytes
password.txt:  8 bytes

查看密钥的值

# kubectl get secret db-info -o yaml  

通过 YAML 创建 Secret

先将要保存的值进行 Base64 编码

# echo -n 'username' | base64 
dXNlcm5hbWU=
# echo -n 'password' | base64
cGFzc3dvcmQ=

#cat secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: base64编码
  password: base64编码

创建 secret

# kubectl apply -f secret.yaml 
secret/mysecret created

查看

# kubectl get secret
NAME                  TYPE                                  DATA   AGE
mysecret              Opaque                                2      2m5s

查看密钥的值

# kubectl get secret mysecret -o yaml  

编辑 secret

kubectl edit secrets mysecret

在 Pod 中使用 Secret

  1. 将 Secret 以卷的形式挂载到 Pod 中
  2. 卷中每一个文件名对应 Secret 中的一个 key 名称
  3. Secret 的值以 base64 解码后明文形式存储于卷文件中
  4. 支持实时动态更新
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

以上示例中,

将名为 mysecret 的 secret 对象映射为卷,卷名为 foo,

将名为 foo 的卷挂载到 Pod 中的路径 /etc/foo 下面,

mysecret 中username/password两个key,分别映射为文件。

多个 Pod 可以共享一个卷。

可以进入 Pod 中查看这两个文件内容

# kubectl exec -it mypod -- ls /etc/foo/
password  username

# kubectl exec -it mypod -- cat /etc/foo/username
admin

# kubectl exec -it mypod -- cat /etc/foo/password
password

结束语

Secret 对象将重要性高的秘钥和 Pod 进行了解耦处理。

它有如下特点:

  1. Secret 对象需先于引用它的 Pod 创建。
  2. Secret 对象和引用它的 Pod 必须位于同一命名空间。
  3. Secret 对象单个大小限制为 1M。
  4. Secret 对象中数据以纯文本的方式存储在 etcd 中。
  5. 除了以卷形式挂载外,还可以环境变量形式用于 Pod 中。
  6. 使用环境变量形式的问题是,secret无法动态实时更新。

官方安全建议:

  1. 管理员应该为集群数据开启静态加密(v1.13 以上版本)。
  2. 管理员应该限制只有 admin 用户能访问 etcd。
  3. API 服务器中的 Secret 数据位于 etcd 使用的磁盘上;应该在不再使用时擦除/粉碎 etcd 使用的磁盘。
  4. 如果 etcd 运行在集群内,管理员应该确保 etcd 之间的通信使用 SSL/TLS 进行加密。
  5. secret 的YAML中包含的 base64 编码为可逆编码,不要将其加入代码库或公开。
  6. 防止应用程序读取 secret 中数据后写入日志导致泄露。
  7. 所有可以运行该 Pod 的用户均可读取到挂载卷中的 secret 值。
  8. 任何节点的 root 用户都可以通过模拟 kubelet 来读取 API 服务器中的任何 Secret。 仅向实际需要 Secret 的节点发送 Secret 数据才能限制节点的 root 账号漏洞的影响, 该功能还在计划中。

联系我

微信公众号:zuolinux_com

微信扫码关注

### Kubernetes 实战案例:Linux 环境下的部署与管理 #### 创建并配置 Kubernetes 集群 为了在 Linux 环境下启动和运行 Kubernetes,通常会采用 Minikube 或者 kubeadm 工具来设置单节点或多节点集群。对于生产环境,则更倾向于使用 kops、RKE (Rancher Kubernetes Engine) 等自动化工具来进行安装和初始化操作。 一旦集群建立完成之后,管理员可以通过命令行界面 `kubectl` 来管理和监控整个系统状态以及执行各种维护任务[^1]。 #### 构建 Docker 镜像并与 K8S 结合 针对特定的应用程序开发完成后,可以利用 Docker 技术将其打包成独立的容器单元。以 Tomcat Web 应用为例,在构建阶段编写相应的 Dockerfile 文件定义所需依赖项和服务端口映射关系;接着借助 shell 脚本批量处理版本迭代过程中产生的不同变体镜像文件[^2]。 ```bash # Example of a simple build script for creating docker images with tags. #!/bin/bash version=$1 docker build -t myapp:$version . ``` #### WordPress 博客系统的云端迁移实践 WordPress 是一款广泛使用的开源博客平台软件包,当决定迁移到基于 Kubernetes 的架构之上时,除了要准备好官方提供的 Helm Chart 外,还需要关注数据库持久化存储方案的选择——比如 AWS EBS、GCE PD 或 CephFS 等选项。另外值得注意的是,默认情况下密码是以 Base64 编码形式保存于 Secret 对象内的,因此访问控制面板前需先解密获取真实凭证信息[^3]: ```shell echo "Username: user" echo "Password:" $(kubectl get secret --namespace default my-wordpress \ -o jsonpath="{.data.wordpress-password}" | base64 --decode) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值