# hostPath

<mark style="color:blue;">**hostPath为在Pod上挂载宿主机上的文件或目录**</mark>，它通常可以用于以下几方面：

* 容器应用程序生成的**日志文件**需要永久保存时，可以使用宿主机的高速文件系统进行存储。
* 需要**访问宿主机上Docker引擎内部数据结构**的容器应用时，可以通过**定义hostPath为宿主机/var/lib/docker目录，使容器内部应用可以直接访问Docker的文件系统**。

## **示例**

以下为使用 hostPath 卷的示例，实现**将主机的/etc/timezone文件挂载到Pod的/etc/timezone：**

<details>

<summary>nginx-hostPath.yaml</summary>

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hostpath
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-hostpath
  template:
    metadata:
      labels:
        app: nginx-hostpath
    spec:
      volumes:
      - hostPath:
          path: /etc/timezone
        name: timezone
      containers:
      - name: nginx-hostpath
        image: nginx:1.25.3
        volumeMounts:
        - mountPath: /etc/timezone
          name: timezone
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
```

</details>

{% hint style="warning" %}
在使用这种类型的Volume时，需要注意以下几点：

* <mark style="color:orange;">**在不同的Node上具有相同配置的Pod，可能会因为宿主机上的目录和文件不同而导致对Volume上目录和文件的访问结果不一致**</mark><mark style="color:orange;">。</mark>
* **如果使用了资源配额管理，则Kubernetes无法将hostPath在宿主机上使用的资源纳入管理。**
{% endhint %}

{% hint style="info" %}
在配置HostPath时，有一个type的参数，用于表达不同的挂载类型，HostPath卷常用的type（类型）如下：

* type为<mark style="color:blue;">**空字符串**</mark>：**默认选项**，意味着挂载hostPath卷之前不会执行任何检查。
* <mark style="color:blue;">**DirectoryOrCreate**</mark>：如果给定的path**不存在任何东西**，那么将根据需要**创建**一个权限为0755的**空目录**，和Kubelet具有相同的组和权限。
* <mark style="color:blue;">**Directory**</mark>：目录必须存在于给定的路径下。
* <mark style="color:blue;">**FileOrCreate**</mark>：如果给定的路径**不存在任何东西**，则会根据需要**创建一个空文件**，权限设置为0644，和Kubelet具有相同的组和所有权。
* <mark style="color:blue;">**File**</mark>：文件，必须存在于给定路径中。
* <mark style="color:blue;">**Socket**</mark>：UNIX套接字，必须存在于给定路径中。
* <mark style="color:blue;">**CharDevice**</mark>：字符设备，必须存在于给定路径中。
* <mark style="color:blue;">**BlockDevice**</mark>：块设备，必须存在于给定路径中。
{% endhint %}
