<p>When I am giving hostpath it is showing that it is read-only file system since I am new to kubernetes I didn't find any other way please let me know such that is there any other way of implementation of volumes and I am doing this on GKE
here is my yaml code</p>

<pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "10"
  creationTimestamp: "2019-11-22T10:52:16Z"
  generation: 17
  labels:
    app: dataset
  name: dataset
  namespace: default
  resourceVersion: "283767"
  selfLink: /apis/apps/v1/namespaces/default/deployments/dataset
  uid: 26111fe8-0d16-11ea-a66e-42010aa00042
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: dataset
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: dataset
    spec:
      containers:
      - env:
        - name: RABBIT_MQ_HOST
          valueFrom:
            configMapKeyRef:
              key: RABBIT_MQ_HOST
              name: dataset-config
        - name: RABBIT_MQ_USER
          valueFrom:
            configMapKeyRef:
              key: RABBIT_MQ_USER
              name: dataset-config
        - name: RABBIT_MQ_PASSWORD
          valueFrom:
            configMapKeyRef:
              key: RABBIT_MQ_PASSWORD
              name: dataset-config
        - name: DATASET_DB_HOST
          valueFrom:
            configMapKeyRef:
              key: DATASET_DB_HOST
              name: dataset-config
        - name: DATASET_DB_NAME
          valueFrom:
            configMapKeyRef:
              key: DATASET_DB_NAME
              name: dataset-config
        - name: LICENSE_SERVER
          valueFrom:
            configMapKeyRef:
              key: LICENSE_SERVER
              name: dataset-config
        - name: DATASET_THUMBNAIL_SIZE
          valueFrom:
            configMapKeyRef:
              key: DATASET_THUMBNAIL_SIZE
              name: dataset-config
        - name: GATEWAY_URL
          valueFrom:
            configMapKeyRef:
              key: GATEWAY_URL
              name: dataset-config
        - name: DEFAULT_DATASOURCE_ID
          valueFrom:
            configMapKeyRef:
              key: DEFAULT_DATASOURCE_ID
              name: dataset-config
        - name: RABBIT_MQ_QUEUE_NAME
          valueFrom:
            configMapKeyRef:
              key: RABBIT_MQ_QUEUE_NAME
              name: dataset-config
        - name: RABBIT_MQ_PATTERN
          valueFrom:
            configMapKeyRef:
              key: RABBIT_MQ_PATTERN
              name: dataset-config
        image: gcr.io/gcr-testing-258008/dataset@sha256:8416ec9b023d4a4587a511b855c2735b25a16dbb1a15531d8974d0ef89ad3d73
        imagePullPolicy: IfNotPresent
        name: dataset-sha256
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: ./data/uploads
          name: dataset-volume-uploads
        - mountPath: ./data/thumbnails
          name: dataset-volume-thumbnails
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - hostPath:
          path: /build/uploads
          type: ""
        name: dataset-volume-uploads
      - hostPath:
          path: /build/thumbnails
          type: ""
        name: dataset-volume-thumbnails
status:
  availableReplicas: 2
  conditions:
  - lastTransitionTime: "2019-11-23T07:19:13Z"
    lastUpdateTime: "2019-11-23T07:19:13Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2019-11-23T06:31:03Z"
    lastUpdateTime: "2019-11-23T07:24:42Z"
    message: ReplicaSet "dataset-75b46f868f" is progressing.
    reason: ReplicaSetUpdated
    status: "True"
    type: Progressing
  observedGeneration: 17
  readyReplicas: 2
  replicas: 3
  unavailableReplicas: 1
  updatedReplicas: 1
</code></pre>

<p>Here is my description of pod</p>

<pre><code>    Path:          /build/uploads
    HostPathType:  
  dataset-volume-thumbnails:
    Type:          HostPath (bare host directory volume)
    Path:          /build/thumbnails
    HostPathType:  
  default-token-x2wmw:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-x2wmw
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  &lt;none&gt;
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason     Age                From                                              Message
  ----     ------     ----               ----                                              -------
  Normal   Scheduled  96s                default-scheduler                                 Successfully assigned default/dataset-75b46f868f-wffm7 to gke-teric-ai-default-pool-41929025-fxnx
  Warning  BackOff    15s (x6 over 93s)  kubelet, gke-teric-ai-default-pool-41929025-fxnx  Back-off restarting failed container
  Normal   Pulled     2s (x5 over 95s)   kubelet, gke-teric-ai-default-pool-41929025-fxnx  Container image "gcr.io/gcr-testing-258008/dataset@sha256:8416ec9b023d4a4587a511b855c2735b25a16dbb1a15531d8974d0ef89ad3d73" already present on machine
  Normal   Created    2s (x5 over 95s)   kubelet, gke-teric-ai-default-pool-41929025-fxnx  Created container
  Warning  Failed     1s (x5 over 95s)   kubelet, gke-teric-ai-default-pool-41929025-fxnx  Error: failed to start container "dataset-sha256": Error response from daemon: error while creating mount source path '/build/uploads': mkdir /build/uploads: read-only file system
</code></pre>

<p>So here is the problem even though I am giving chmod permissions dynamically it is not allowing to do write operations.i have tried persistent volumes it is also not worked so please tell me know in which way I have to mount volumes.</p>

<ul>
<li>First of all, do not use hostPath, go for persistence storage</li>
<li>I would use StatefulSets instead of Deployment if you need to store some data.</li>
</ul>

<p>I was able to create both hostPath on my GKE instance manually as root user. </p>

<p>I guess you have to specify type for hostPath to create request directory if it doesn't exist. <code>type: DirectoryOrCreate</code> you can read more about <a href="https://kubernetes.io/docs/concepts/storage/volumes/#hostpath" rel="nofollow noreferrer">hostPath</a> and available type values.
Moreover, if you are using hostPath permissions of your user inside a container must match ownership on the node so it makes it more complicated, of course, you could run it as root, but it is not recommended way.</p>

<p>To sum it up, just use persistent storage provisioned by google. If you encounter problems with permissions you probably need <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" rel="nofollow noreferrer">init contaner</a> to change permission or you have to set proper <a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod" rel="nofollow noreferrer">fsGroup</a> for your container.</p>
