kubernetes/storage/gcsfuse-nodemount/k8s/daemonset.yaml (118 lines of code) (raw):
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: v1
kind: ConfigMap
metadata:
name: gcsfuse-config
namespace: gcs-node-mount
data:
gcs_config.yaml: |-
app-name: "fuse-node-mount"
write:
create-empty-file: true
logging:
format: json
severity: INFO
file-cache:
max-size-mb: -1 # grow until it occupies all the available capacity in your cache directory.
cache-file-for-range-read: true # Helpful for small files, avoids full downloads
enable-parallel-downloads: true # Helps if SOME files are larger
parallel-downloads-per-file: 8 # Tune based on network/GCS limits
max-parallel-downloads: 64 # Node-wide limit, balance concurrency
download-chunk-size-mb: 8 # Align with GCS optimal chunk size
metadata-cache:
enable-nonexistent-type-cache: true # Reduces 'stat' calls for missing files
stat-cache-max-size-mb: 32
ttl-secs: 600 # 10 mins balance freshess vs cache hits (Tune depending on how often files change)
type-cache-max-size-mb: 4
cache-dir: "/tmp/cache"
# only-dir: "# Only needed if restricting access to a subpath
gcs-connection:
max-conns-per-host: 128 # High, to handle many pods concurrently
max-idle-conns-per-host: 64 # Keep some alive to reduce connection overhead
sequential-read-size-mb: 32 # Good for sequential reads if they occur
implicit-dirs: true # Helps with 'mkdir -p', but has consistency caveats
file-system:
kernel-list-cache-ttl-secs: 60 # Cache dir listings moderately
ignore-interrupts: true # For better stability under load
dir-mode: "755" # Permissions, adjust as needed
file-mode: "644" # Same as above
fuse-options: "allow_other,nonempty,auto_unmount" # Add specific FUSE options if required
# gid: # If needed for ownership mapping
# uid: # If needed for ownership mapping
# rename-dir-limit: # Tune based on rename behaviour
temp-dir: "/tmp/gcsfuse" # Mapped to tmpfs
foreground: true
gcs-retries:
max-retry-sleep: 30 # Defaults
multiplier: "2" # Defaults
metrics:
stackdriver-export-interval: 60 # Export metrics every 60 seconds for performance monitoring
debug:
log-mutex: false # Only enable if debugging locking issues
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: gcsfuse-node-sa
namespace: gcs-node-mount
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: gcs-fuse-daemonset
namespace: gcs-node-mount
spec:
selector:
matchLabels:
app: gcs-fuse
template:
metadata:
labels:
app: gcs-fuse
spec:
terminationGracePeriodSeconds: 60 # Time to tidy up mounts
containers:
- name: gcs-fuse
lifecycle:
preStop:
exec:
command: ["fusermount", "-u", "/data"]
image: us-central1-docker.pkg.dev/fsi-research-5/research-images/gcsfuse
command: ["gcsfuse"]
args:
- "-o"
- "allow_other"
- "--config-file"
- "/config/gcs_config.yaml"
- "fuse-mount-testing"
- "/data"
imagePullPolicy: Always
resources:
requests:
cpu: "500m"
memory: "512Mi"
volumeMounts:
- name: gcsfuse-config
mountPath: /config
- name: gcsfuse-storage
mountPath: /data
mountPropagation: Bidirectional
- name: gcsfuse-cache
mountPath: /tmp/cache
- name: tmp-dir
mountPath: /tmp/gcsfuse
- name: fuse-device
mountPath: /dev/fuse
securityContext:
privileged: true
volumes:
- name: gcsfuse-config
configMap:
name: gcsfuse-config
- name: gcsfuse-cache
emptyDir: {}
- name: tmp-dir
emptyDir: {}
- name: fuse-device
hostPath:
path: /dev/fuse
- name: gcsfuse-storage
hostPath:
path: /mnt/disks/gcsfuse-storage
type: DirectoryOrCreate
serviceAccountName: gcsfuse-node-sa