k8s中volumeMounts.subPath的巧妙用法
在 Kubernetes (k8s) 中,volumeMounts.subPath 是一个非常有用的功能,它允许你指定一个卷(volume)的子路径而不是其根路径来挂载到容器中。
这在多种场景下非常有用,以下是一些使用 subPath 的巧妙用法:
1、共享卷的不同用途:当一个 Pod 中有多个容器需要挂载同一个持久卷(PersistentVolume,PV),但是每个容器需要访问不同的路径时,可以使用 subPath 来实现。
2、ConfigMap 和 Secret 的特定键值挂载:当需要将 ConfigMap 或 Secret 的特定键值对挂载为文件,而不是整个 ConfigMap 或 Secret 内容时,可以使用 subPath 来指定。
3、避免覆盖现有文件:如果容器内部的挂载点已经存在文件,直接挂载卷可能会覆盖这些文件。使用 subPath 可以避免这种情况,因为它允许你指定挂载到特定子目录。
4、动态创建子目录:当使用 subPath 时,如果指定的子路径在宿主机上不存在,Kubernetes 会自动为你创建这个子目录。
5、使用环境变量构造子路径:通过 subPathExpr 属性,可以使用 Downward API 环境变量来动态构造子路径,这在需要基于环境变量动态设置挂载路径时非常有用。
6、减少存储资源的浪费:使用 subPath 可以减少创建多个持久卷声明(PersistentVolumeClaim,PVC)和持久卷(PV)的需要,从而节省存储资源。
7、存储卷的灵活使用:可以在同一个存储卷上挂载不同的子路径,为不同的容器提供所需的数据,而无需为每个容器单独配置存储卷。
8、与存储类(StorageClass)配合使用:当使用动态存储供应时,subPath 可以与存储类(StorageClass)配合使用,以便在 Pod 级别动态地请求和挂载存储。
9、安全性:使用 subPath 可以限制对卷的访问,只暴露容器所需的文件或目录,从而提高安全性。
10、易于管理:使用 subPath 可以简化 Pod 配置,使得存储卷的使用更加直观和易于管理。
这些用法展示了 volumeMounts.subPath 在 Kubernetes 中的灵活性和实用性,它为 Pod 的存储卷挂载提供了更多的控制和选择。
在实际应用中,根据具体需求选择合适的用法,可以提高效率并优化资源的使用。
demo
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
namespace: ftintserv
labels:
app: ui
spec:
replicas: 1
selector:
matchLabels:
app: ui
strategy:
rollingUpdate:
maxSurge: 70%
maxUnavailable: 30%
type: RollingUpdate
template:
metadata:
labels:
app: ui
spec:
terminationGracePeriodSeconds: 60
containers:
- name: ui
image: reg-hub.gzeport.com/ftintserv/ui:1.0.1.RELEASE
imagePullPolicy: Always
ports:
- containerPort: 82
env:
- name: TZ
value: "Asia/Shanghai"
resources:
requests:
cpu: 0.1
memory: 128Mi
limits:
cpu: 1
memory: 1024Mi
volumeMounts:
- mountPath: /etc/localtime
name: localtime
- mountPath: /var/log/nginx
subPath: ui-web
name: ftintserv-log-data
- mountPath: /etc/nginx/conf.d
name: config
volumes:
- name: localtime
hostPath:
path: /etc/localtime
- name: ftintserv-log-data
persistentVolumeClaim:
claimName: ftintserv-log-data-pvc
- name: config
configMap:
name: ui-config
defaultMode: 420
---
apiVersion: v1
kind: Service
metadata:
name: ftintserv-ui-svc
namespace: ftintserv
spec:
type: NodePort
ports:
- port: 82
protocol: TCP
targetPort: 82
nodePort: 48082
selector:
app: ui
参考
1.https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#using-subpath
2.https://mp.weixin.qq.com/s/ftAcGOJ5qpdko54d8q8pTQ