K8S Volumn

K8S通过Volume实现容器数据持久化,包括ConfigMap用于存储配置信息,Secret用于安全存储敏感信息,EmptyDir作为临时存储,HostPath挂载主机目录,NFS提供网络存储,以及PV和PVC实现更高级的存储管理。

容器会被频繁地创建和销毁,销毁时保存在容器中的数据也会被清除,为了持久化容器中的数据,K8S 引入了Volume的概念,通过Volume实现同一个Pod中不同容器之间的数据共享以及持久化存储,当容器终止或者重启时Volume中的数据也不会丢失

配置存储(存储配置信息)

ConfigMap

apiVersion: v1 
kind: ConfigMap 
metadata:
  namespace: ns-configMap # 命名空间 
  name: configmap # 名称
data:
  info: # 配置信息
    username: admin
    password: 123456
  • 挂载到Pod
apiVersion: v1
kind: Pod
metadata:
  namespace: ns-volume # 要与ConfigMap的namespace一致
  name: volume-configmap
spec:
  containers:
  - name: nginx 
    image: nginx
    ports:
    - name: port-nginx
      containerPort: 80
      protocol: TCP
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  volumes:
  - name: logs-volume
    configMap: 
      name: configmap # configmap名称

Secret(类似于ConfigMap,主要用于存储敏感信息)

apiVersion: v1 
kind: Secret 
metadata:
  namespace: ns-Secret # 命名空间 
  name: secret # 名称
type: Opaque
data:
  username: YWRtaW4=
  password: MTIzNDU2
  • 挂载到Pod
apiVersion: v1
kind: Pod
metadata:
  namespace: ns-volume # 要与Secret的namespace一致
  name: volume-secret
spec:
  containers:
  - name: nginx 
    image: nginx
    ports:
    - name: port-nginx
      containerPort: 80
      protocol: TCP
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  volumes:
  - name: logs-volume
    secret: 
      secretName: secret # Secret 名称

运行时数据存储

EmptyDir

当 Pod 指定到某个节点上时,首先创建的是一个 EmptyDir 卷,只要 Pod 在该节点上运行卷就一直存在。当 Pod 因为某些原因被从节点上删除时,EmptyDir 卷中的数据也会永久删除,所以EmptyDir一般用做于临时空间使用

apiVersion: v1
kind: Pod
metadata:
  namespace: ns-volume
  name: volume-emptyDir
spec:
  containers:
  - name: nginx 
    image: nginx
    ports:
    - name: port-nginx
      containerPort: 80
      protocol: TCP
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  volumes:
  - name: logs-volume
    emptyDir: {}
kubectl apply -f /home/lixing/demo/volume-emptyDir.yaml
kubectl get deployment,pods,service,ingress -n ns-volume -o wide
kubectl describe pod volume-emptyDir -n ns-volume
kubectl delete pod volume-emptyDir -n ns-volume --force --grace-period=0

HostPath

将Node主机中的一个实际目录挂载到Pod中供容器使用,但如果Pod重新创建后转移到了其它Node上,那么数据就找不到了

apiVersion: v1
kind: Pod
metadata:
  namespace: ns-volume
  name: volume-hostPath
spec:
  containers:
  - name: nginx 
    image: nginx
    ports:
    - name: port-nginx
      containerPort: 80
      protocol: TCP
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  volumes:
  - name: logs-volume
    hostPath: 
      path: /root/logs
      type: DirectoryOrCreate
kubectl apply -f /home/lixing/demo/volume-hostPath.yaml
kubectl get deployment,pods,service,ingress -n ns-volume -o wide
kubectl describe pod volume-hostPath -n ns-volume
kubectl delete pod volume-hostPath -n ns-volume --force --grace-period=0

NFS(类似于这样的文件服务器有很多)

搭建 NFS 服务器高可用集群,将Pod上的数据存储到 NFS 系统上,无论Pod怎么漂移都可以访问数据

apiVersion: v1
kind: Pod
metadata:
  namespace: ns-volume
  name: volume-nfs
spec:
  containers:
  - name: nginx 
    image: nginx
    ports:
    - name: port-nginx
      containerPort: 80
      protocol: TCP
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  volumes:
  - name: logs-volume
    nfs: 
      server: 192.168.111.111
      path: /root/data/nfs
kubectl apply -f /home/lixing/demo/volume-nfs.yaml
kubectl get deployment,pods,service,ingress -n ns-volume -o wide
kubectl describe pod volume-nfs -n ns-volume
kubectl delete pod volume-nfs -n ns-volume --force --grace-period=0

高级存储

PV (K8S对存储资源的抽象,关联具体的存储资源)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv2
spec:
  nfs: # 存储类型,与底层真正存储对应
  capacity: # 存储能力,目前只支持存储空间的设置
    storage: 2Gi
  accessModes: # 访问模式
  storageClassName: # 存储类别
  persistentVolumeReclaimPolicy: # 回收策略

PVC(对PV资源的申请)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: ns-volume # PVC命名空间
  name: pvc # PVC名称
spec:
  accessModes: # 访问模式
  - ReadWriteMany
  selector: #采用标签对PV选择
  storageClassName: #存储类别
  resources: #请求空间
    requests:
      storage: 1Gi

挂载Pod

apiVersion: v1
kind: Pod
metadata:
  namespace: ns-volume # 要与pvc的namespace一致
  name: volume-nfs
spec:
  containers:
  - name: nginx 
    image: nginx
    ports:
    - name: port-nginx
      containerPort: 80
      protocol: TCP
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  volumes:
  - name: logs-volume
    persistentVolumeClaim: 
      claimName: pvc # PVC名称
      readOnly: false
### Namespace 和 Volume 的编程或配置中的使用 Namespace 和 Volume 是分布式文件系统(如 Hadoop Distributed File System, HDFS)以及容器化环境中非常重要的概念。以下是关于它们在编程和配置中的具体应用。 #### 1. **HDFS 中的 Namespace** HDFS 使用 NameNode 来维护整个文件系统的命名空间 (namespace),其中包括目录结构、文件元数据及其对应的块位置信息[^1]。NameNode 将这些信息存储在内存中,因此其堆大小会直接影响可支持的文件数量和总集群存储容量。为了优化资源利用并减少小文件带来的性能瓶颈,可以采取以下措施: - **增大单个文件尺寸**: 鼓励应用程序创建更大的文件而非大量小型文件,这可以通过调整业务逻辑实现。 - **归档工具的应用**: 提供专门用于压缩多个小文件到单一较大文件的功能,从而降低 NameNode 上的压力。 ```bash hdfs dfs -archive -help ``` 此命令展示了如何通过 `hadoop archive` 工具来处理大量的小文件。 #### 2. **Volume 在虚拟化环境下的作用** 在现代云计算架构下,volume 被广泛应用于持久化存储需求场景之中。无论是 Docker 容器还是 Kubernetes Pod,都可以挂载外部卷作为工作负载的数据载体。这种做法不仅提高了灵活性还增强了安全性与隔离度。 例如,在定义一个简单的Docker服务时,我们通常这样指定本地路径映射至容器内部: ```yaml version: '3' services: app: image: myapp:v1 volumes: - ./data:/var/lib/myapp/data ``` 这里 `/./data` 表示宿主机上的某个特定目录被绑定到了容器内的 `/var/lib/myapp/data` 下面去[^2]。 另外值得注意的是某些高级特性比如生命周期管理和资源配置平衡同样适用于讨论范围内[^3]: - 生命周期管理允许管理员设定自动清理策略或者迁移规则; - 对于计算密集型任务来说合理分配CPU时间片显得尤为重要;而对于I/O敏感的工作流则更应该关注磁盘吞吐量等因素的影响。 综上所述,无论是在传统的大规模数据分析平台里头还是新兴微服务体系下面,“名字空间(namespace)”同“体积(volume)”这两个术语都扮演着不可或缺的角色,并且各自有着独特而又紧密相连的意义所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大能嘚吧嘚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值