Kubernetes项目中的Projected Volumes详解
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
概述
在Kubernetes中,Projected Volumes(投射卷)是一种特殊的卷类型,它允许将多个不同类型的卷源映射到同一个目录中。这种设计为容器提供了统一访问多种配置和敏感数据的方式,同时保持了Kubernetes资源管理的灵活性。
核心概念
Projected Volume本质上是一个虚拟目录,它将以下类型的卷源合并到同一个挂载点:
- Secret:用于存储敏感信息,如密码、OAuth令牌等
- DownwardAPI:用于将Pod和容器元数据暴露给容器
- ConfigMap:用于存储非敏感的配置数据
- ServiceAccountToken:用于注入服务账户令牌
- ClusterTrustBundle:用于注入集群信任包(需要特定功能门控)
所有源必须与Pod位于同一命名空间中,这是Kubernetes安全模型的基本要求。
配置示例
基础配置示例
下面是一个典型的Projected Volume配置示例,它同时包含了Secret、DownwardAPI和ConfigMap:
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox:1.28
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
权限模式设置
Projected Volume支持设置文件权限模式:
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox:1.28
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
mode: 511
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
mode: 511
defaultMode: 0755
注意:
defaultMode
设置整个投射卷的默认权限- 每个源可以单独设置
mode
覆盖默认值 - 权限值使用八进制表示(如511对应八进制0777)
ServiceAccountToken投射卷
ServiceAccountToken是一种特殊类型的投射卷,用于将服务账户令牌注入Pod:
apiVersion: v1
kind: Pod
metadata:
name: sa-token-test
spec:
containers:
- name: container-test
image: busybox:1.28
volumeMounts:
- name: token-vol
mountPath: "/service-account"
readOnly: true
serviceAccountName: default
volumes:
- name: token-vol
projected:
sources:
- serviceAccountToken:
audience: api
expirationSeconds: 3600
path: token
关键参数说明:
audience
:令牌的目标受众,默认为API服务器expirationSeconds
:令牌有效期(默认1小时,最小10分钟)path
:令牌文件在卷中的相对路径
ClusterTrustBundle投射卷
ClusterTrustBundle是Kubernetes中用于管理集群信任证书的高级功能:
apiVersion: v1
kind: Pod
metadata:
name: pod-with-cluster-trust-bundle
spec:
containers:
- name: test-container
image: registry.k8s.io/busybox
volumeMounts:
- name: cluster-trust-bundle
mountPath: "/etc/cluster-trust-bundle"
readOnly: true
volumes:
- name: cluster-trust-bundle
projected:
sources:
- clusterTrustBundle:
name: example.com:mysigner:foo
signerName: "example.com/mysigner"
labelSelector:
matchLabels:
environment: production
path: "foo.pem"
optional: false
特点:
- 支持按名称或签名者名称选择证书包
- 自动合并和更新证书文件
- 可设置
optional
控制启动行为
安全上下文交互
Linux系统
在Linux Pod中,当设置了RunAsUser
时:
- 投射文件将具有正确的所有权设置
- 服务账户令牌文件权限默认为0600
- 临时容器必须使用相同的
runAsUser
才能访问令牌
Windows系统
Windows系统有所不同:
- 由于SAM数据库隔离,所有权设置不被强制执行
- 默认情况下,管理员用户具有完全控制权,普通用户具有读取和执行权限
- 不建议在Windows Pod中使用
RunAsUser
最佳实践
- 合理设置文件权限,遵循最小权限原则
- 敏感数据应使用Secret而非ConfigMap
- 服务账户令牌应设置适当的有效期
- 避免在Windows Pod中使用Linux特有的安全设置
- 使用
optional
字段处理可能缺失的资源
通过合理使用Projected Volumes,可以简化容器配置管理,提高安全性,同时保持配置的灵活性和可维护性。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考