张荣宇 發表於 2025-12-22 08:45:46

Kubernetes中的存储卷配置管理方式

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、Volume 概述</a></li><li><a href="#_label1">二、Volume 的生命周期</a></li><li><a href="#_label2">三、支持的卷类型</a></li><li><a href="#_label3">四、每种卷类型的使用场景和示例</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_0">4.1 emptyDir 卷</a></li><li><a href="#_lab2_3_1">4.2 hostPath 卷</a></li><li><a href="#_lab2_3_2">4.3 NFS 卷</a></li><li><a href="#_lab2_3_3">4.4 PersistentVolumeClaim (PVC)</a></li></ul><li><a href="#_label4">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、Volume 概述</h2>
<p>在 Kubernetes 中,Volume 是一种可被 Pod 中的一个或多个容器访问的共享目录。Volume 与 Pod 的生命周期解耦,这意味着即使 Pod 被删除,Volume 中的数据也不会丢失。Volume 可以用于持久化数据存储、共享数据等场景。</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、Volume 的生命周期</h2>
<p>Volume 的生命周期可以独立于 Pod 的生命周期,这取决于 Volume 的类型:</p>
<ul><li><span><strong>非持久化 Volume(如 emptyDir)</strong></span>:当 Pod 被删除时,emptyDir 类型的 Volume 也会被删除,其中的数据也会丢失。但是,如果 Pod 被重启(容器在同一个 Pod 内重新启动),emptyDir 中的数据会保留。</li><li><span><strong>持久化 Volume(如 PersistentVolumeClaim,PVC)</strong></span>:即使 Pod 被删除,如果使用了 PVC 并且关联了 PV,那么 PV 不会被自动删除(除非设置了相应的回收策略)。因此,即使 Pod 被删除,关联的 PV 中的数据仍然存在,可以在新的 Pod 中通过 PVC 重新访问这些数据。</li></ul>
<p>Volume 的生命周期不会受到容器重启的影响,这使得 Volume 成为持久化数据存储的理想选择。</p>
<p class="maodian"><a name="_label2"></a></p><h2>三、支持的卷类型</h2>
<p>Kubernetes 支持多种类型的 Volume,每种类型适用于不同的场景:</p>
<ol><li><span><strong>emptyDir</strong></span>:在 Pod 被分配到节点时创建,只要 Pod 在该节点上运行,卷就存在。<span>当 Pod 被从节点上删除时,emptyDir 中的数据也会被永久删除</span>。</li><li><span><strong>hostPath</strong></span>:<span>将宿主机上的文件或目录挂载到 Pod 中</span>。适用于需要访问宿主机文件系统的场景。</li><li><span><strong>NFS</strong></span>:<span>允许将现有的 NFS 服务器上的目录挂载到 Kubernetes 中的 Pod 中</span>。适用于需要在多个 Pod 之间共享数据的场景。</li><li><strong><span>PersistentVolumeClaim (PVC)</span></strong>:<span>用户对持久存储的请求</span>,可以动态或静态地绑定到 PersistentVolume (PV) 上。</li></ol>
<p class="maodian"><a name="_label3"></a></p><h2>四、每种卷类型的使用场景和示例</h2>
<p class="maodian"><a name="_lab2_3_0"></a></p><h3>4.1 emptyDir 卷</h3>
<p><strong>使用场景</strong>:</p>
<ul><li>临时存储,例如缓存或会话数据。</li><li>多个容器需要共享数据时。</li></ul>
<p><strong>示例</strong>:</p>
<p>创建一个使用 <code>emptyDir</code> 的 Pod:</p>
<div class="jb51code"><pre class="brush:yaml;">apiVersion: v1# 指定 Kubernetes API 的版本
kind: Pod# 定义资源类型为 Pod
metadata:# Pod 的元数据部分
name: test-pod# 为这个 Pod 指定一个名称
spec:# Pod 的具体规格和配置
containers:# 定义 Pod 中的容器列表
- name: test-container# 为容器指定一个名称
    image: busybox# 指定容器使用的镜像为 busybox
    command: ["sh", "-c", "echo Hello &gt; /data/hello &amp;&amp; cat /data/hello &amp;&amp; sleep 3600"]# 指定容器启动后执行的命令
    volumeMounts:# 定义容器需要挂载的卷
    - name: data-volume# 引用在 volumes 中定义的卷名称
      mountPath: /data# 指定容器内部的挂载路径
volumes:# 定义 Pod 可以使用的卷列表
- name: data-volume# 为卷指定一个名称
    emptyDir: {}# 使用 emptyDir 类型的卷,它将在 Pod 所在的节点上创建一个临时目录</pre></div>
<p><strong>操作步骤</strong>:</p>
<p>保存上述 YAML 到 <code>test-pod.yaml</code> 文件。</p>
<p>应用 YAML 文件创建 Pod:</p>
<div class="jb51code"><pre class="brush:bash;">kubectl apply -f test-pod.yaml</pre></div>
<p>查看 Pod 的日志,验证 <code>emptyDir</code> 是否工作:</p>
<div class="jb51code"><pre class="brush:bash;">kubectl logs test-pod</pre></div>
<p><strong>预期输出</strong>:</p>
<blockquote><p>Hello</p></blockquote>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122208425115.png" /></p>
<p class="maodian"><a name="_lab2_3_1"></a></p><h3>4.2 hostPath 卷</h3>
<p><strong>使用场景</strong>:</p>
<p>需要访问宿主机上的文件或目录,例如日志文件、配置文件等。</p>
<p><strong>示例</strong>:</p>
<p>创建一个使用 <code>hostPath</code> 的 Pod:</p>
<div class="jb51code"><pre class="brush:yaml;">apiVersion: v1# 指定 Kubernetes API 的版本
kind: Pod# 定义资源类型为 Pod
metadata:# Pod 的元数据
name: test-pod-hostpath# 为 Pod 指定一个名称
spec:# Pod 的具体配置
containers:# 定义 Pod 中的容器列表
- name: test-container# 为容器指定一个名称
    image: busybox# 指定容器使用的镜像
    command: ["sh", "-c", "echo Hello &gt; /data/hello &amp;&amp; cat /data/hello &amp;&amp; sleep 3600"]# 指定容器启动后执行的命令
    volumeMounts:# 定义容器需要挂载的卷
    - name: data-volume# 引用在 volumes 中定义的卷名称
      mountPath: /data# 指定容器内部的挂载入路径
volumes:# 定义 Pod 级别的卷
- name: data-volume# 为卷指定一个名称
    hostPath:# 指定卷的类型为 hostPath
      path: /data# 指定宿主机上的路径,容器会将此路径挂载到 mountPath 指定的位置
      type: DirectoryOrCreate# 如果指定的路径不存在,则创建目录</pre></div>
<p><strong>操作步骤</strong>:</p>
<p>保存上述 YAML 到 <code>test-pod-hostpath.yaml</code> 文件。</p>
<p>应用 YAML 文件创建 Pod:</p>
<div class="jb51code"><pre class="brush:bash;">kubectl apply -f test-pod-hostpath.yaml</pre></div>
<p>验证宿主机上的 <code>/data</code> 目录,查看是否创建了 <code>hello</code> 文件:</p>
<div class="jb51code"><pre class="brush:bash;">kubectl exec -it test-pod-hostpath -- /bin/sh
cat /data/hello</pre></div>
<p><strong>预期输出</strong>:</p>
<blockquote><p>Hello</p></blockquote>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122208425155.png" /></p>
<p class="maodian"><a name="_lab2_3_2"></a></p><h3>4.3 NFS 卷</h3>
<p><strong>使用场景</strong>:</p>
<ul><li>需要在多个 Pod 之间共享数据。</li><li>数据需要持久化存储。</li></ul>
<p><strong>示例</strong>:</p>
<p>假设您已经有一个 NFS 服务器,其路径为 <code>/nfsdata</code>。</p>
<p>创建一个使用 <code>NFS</code> 的 Pod:</p>
<div class="jb51code"><pre class="brush:yaml;">apiVersion: v1
kind: Pod
metadata:
name: test-pod-nfs
spec:
containers:
- name: test-container
    image: busybox
    command: ["sh", "-c", "echo Hello &gt; /data/hello &amp;&amp; cat /data/hello &amp;&amp; sleep 3600"]
    volumeMounts:
    - name: data-volume
      mountPath: /data
volumes:
- name: data-volume
    nfs:
      server: &lt;NFS_SERVER_IP&gt;# NFS 服务器 IP 地址
      path: /nfsdata          # NFS 服务器路径</pre></div>
<p><strong>操作步骤</strong>:</p>
<ul><li>替换 <code>&lt;NFS_SERVER_IP&gt;</code> 为实际的 NFS 服务器 IP 地址。</li><li>保存上述 YAML 到 <code>test-pod-nfs.yaml</code> 文件。</li><li>应用 YAML 文件创建 Pod:</li></ul>
<div class="jb51code"><pre class="brush:bash;">kubectl apply -f test-pod-nfs.yaml</pre></div>
<p>验证 NFS 服务器上的 <code>/nfsdata</code> 目录,查看是否创建了 <code>hello</code> 文件:</p>
<div class="jb51code"><pre class="brush:bash;">kubectl exec -it test-pod-nfs -- /bin/sh
cat /data/hello</pre></div>
<p><strong>预期输出</strong>:</p>
<blockquote><p>Hello</p></blockquote>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122208425287.png" /></p>
<p class="maodian"><a name="_lab2_3_3"></a></p><h3>4.4 PersistentVolumeClaim (PVC)</h3>
<p><strong>使用场景</strong>:</p>
<ul><li>需要持久化存储数据。</li><li>数据需要在多个 Pod 之间共享。</li></ul>
<p><strong>示例</strong>:</p>
<p>首先,创建一个 PersistentVolume (PV):</p>
<div class="jb51code"><pre class="brush:yaml;">apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
    storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
    path: /nfsdata
    server: &lt;NFS_SERVER_IP&gt;</pre></div>
<p><strong>操作步骤</strong>:</p>
<ul><li>替换 <code>&lt;NFS_SERVER_IP&gt;</code> 为实际的 NFS 服务器 IP 地址。</li><li>保存上述 YAML 到 <code>pv-nfs.yaml</code> 文件。</li><li>应用 YAML 文件创建 PV:</li></ul>
<div class="jb51code"><pre class="brush:bash;">kubectl apply -f pv-nfs.yaml</pre></div>
<p>接下来,创建一个 PersistentVolumeClaim (PVC):</p>
<div class="jb51code"><pre class="brush:bash;">apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
storageClassName: nfs
accessModes:
- ReadWriteMany
resources:
    requests:
      storage: 1Gi</pre></div>
<p><strong>操作步骤</strong>:</p>
<ul><li>保存上述 YAML 到 <code>pvc-nfs.yaml</code> 文件。</li><li>应用 YAML 文件创建 PVC:</li></ul>
<div class="jb51code"><pre class="brush:bash;">kubectl apply -f vc-nfs.yaml</pre></div>
<p>最后,创建一个使用 PVC 的 Pod:</p>
<div class="jb51code"><pre class="brush:yaml;">apiVersion: v1
kind: Pod
metadata:
name: test-pod-pvc
spec:
containers:
- name: test-container
    image: busybox
    command: ["sh", "-c", "echo Hello &gt; /data/hello &amp;&amp; cat /data/hello &amp;&amp; sleep 3600"]
    volumeMounts:
    - name: data-volume
      mountPath: /data
volumes:
- name: data-volume
    persistentVolumeClaim:
      claimName: pvc-nfs</pre></div>
<p><strong>操作步骤</strong>:</p>
<ul><li>保存上述 YAML 到 <code>test-pod-pvc.yaml</code> 文件。</li><li>应用 YAML 文件创建 Pod:</li></ul>
<div class="jb51code"><pre class="brush:bash;">kubectl apply -f test-pod-pvc.yaml</pre></div>
<ul><li>验证 NFS 服务器上的 <code>/nfsdata</code> 目录,查看是否创建了 <code>hello</code> 文件:</li></ul>
<div class="jb51code"><pre class="brush:bash;">kubectl exec -it test-pod-pvc -- /bin/sh
cat /data/hello</pre></div>
<p><strong>预期输出</strong>:</p>
<blockquote><p>Hello</p></blockquote>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁: [1]
查看完整版本: Kubernetes中的存储卷配置管理方式