Volume attributes

A read-only volume is described by its volumeAttributes, in the csi block of an inline volume or of a ReadOnlyMany PersistentVolume. The driver refuses an unknown attribute, a malformed value, and a volume without readOnly: true, with a message that names the attribute.

Attribute Values Default
url A URL git accepts: https://, ssh://, git://, file://, or user@host:path. Required. none
ref A branch or tag name. main
pull A Go duration such as 5m or 30s, on-demand, or never. 5m
depth A whole number of commits, or 0 for a full clone. It applies to the first fetch of a repository on a node. 0
offline refuse or allowStale. refuse
webhookSecret The name of a Secret in the claim’s namespace. The controller verifies a forge’s push against its secret key before it demands a pull on this volume. none

pull takes one of three values.

Value Meaning
never No timer and no demand. The volume holds the commit it staged for its whole life.
on-demand No timer. The volume pulls only when something demands it. An inline volume refuses this value, because a demand is an annotation on a PersistentVolume and an inline volume has none.
A duration such as 5m The volume pulls at least that often, and it pulls when something demands it.

Two URL shapes are refused before git sees them. A URL that starts with a dash reads as an option to git. A URL of the form <transport>::<address> names a helper program git runs. The driver fetches as root on the node and the URL comes from a pod spec, so neither is accepted.

Access modes

The access mode of a PersistentVolume decides what the driver stages. The kubelet sends ReadWriteOncePod as the CSI mode SINGLE_NODE_SINGLE_WRITER, and ReadOnlyMany as MULTI_NODE_READER_ONLY. The driver also stages a read-only claim under SINGLE_NODE_READER_ONLY, which the kubelet does not send. It refuses every other mode, and the message names the modes it serves. An inline volume carries no access mode and is always read-only.

Access mode What the driver stages
ReadWriteOncePod A writeable volume.
ReadOnlyMany A read-only claim, published to every pod on the node that mounts it.

A read-only claim takes pull, depth, offline, and webhookSecret. A writeable volume refuses all four, because it follows its ref at stage alone. A pod mounts a read-only claim with readOnly: true on its persistentVolumeClaim volume, or the publish is refused.

Credentials

An inline volume names its Secret with nodePublishSecretRef, in the pod’s namespace. A PersistentVolume names one Secret in both nodeStageSecretRef and nodePublishSecretRef. The stage fetches with the first. The kubelet sends the second with every publish, and again on each pod sync, which is how a restarted driver takes the credential back. A publish whose Secret differs from the stage’s is refused. The driver reads these keys:

Key Use
ssh-privatekey The private key for an SSH URL.
known_hosts The host keys ssh accepts. With it, the host key must match. Without it, ssh accepts the first key and refuses a change.
token The password for an HTTPS URL.
username The user for the token. Default git.

A Secret with neither ssh-privatekey nor token is refused.

Events

Reason When
GitVolumeRefused The publish was refused. The message says why.
GitVolumeStale The fetch failed and offline: allowStale published the node’s copy.
GitFetchFailed A fetch failed after one that worked. Posted once, until a fetch succeeds.
GitFetchRecovered A fetch worked after a GitFetchFailed or a GitVolumeStale. A Normal event, which shows when the fault ended.
GitVolumeNoPublishSecret The PersistentVolume names nodeStageSecretRef and no nodePublishSecretRef, so a restart of the driver loses the credential. Posted once for each stage and for each restart.

A repeat of the same event on the same object, with the same message, within 10 minutes of the last one, increases the count of the event already posted and posts no new one. The kubelet retries a refused mount with a backoff that grows to about two minutes, so a pod that is refused for an hour carries one GitVolumeRefused line, such as (x37 over 1h). The API server deletes an event one hour after its last change.

The gauge

git_csi_volume_abnormal, labeled namespace and volume, is one after a stale publish and after a failed fetch, until a fetch succeeds. The driver’s log says what went wrong when the gauge rises and when it falls. NodeGetVolumeStats reports the tree’s size as used.