Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[csi] Add volumeCleanup #73

Draft
wants to merge 30 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/build_dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ jobs:
- name: Set vars
id: set-vars
run: |
# Slect edition for build, default EE
# Slect edition for build, default ee
if echo "${{ steps.get-labels.outputs.result }}" | grep -q "edition/ce"; then
echo "MODULE_EDITION=CE" >> "$GITHUB_OUTPUT"
echo "MODULE_EDITION=ce" >> "$GITHUB_OUTPUT"
else
echo "MODULE_EDITION=EE" >> "$GITHUB_OUTPUT"
echo "MODULE_EDITION=ee" >> "$GITHUB_OUTPUT"
fi

dev_setup_build:
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/build_prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ jobs:
- name: SET VAR
run: |
echo "MODULES_MODULE_SOURCE=$MODULES_REGISTRY/$MODULE_SOURCE_NAME/ee/modules" >> "$GITHUB_ENV"
echo "MODULE_EDITION=EE" >> "$GITHUB_ENV"
echo "MODULE_EDITION=ee" >> "$GITHUB_ENV"
- run: |
echo $MODULES_REGISTRY
echo $MODULES_MODULE_NAME
Expand Down Expand Up @@ -95,7 +95,7 @@ jobs:
- name: SET VAR
run: |
echo "MODULES_MODULE_SOURCE=$MODULES_REGISTRY/$MODULE_SOURCE_NAME/fe/modules" >> "$GITHUB_ENV"
echo "MODULE_EDITION=EE" >> "$GITHUB_ENV"
echo "MODULE_EDITION=ee" >> "$GITHUB_ENV"
- run: |
echo $MODULES_REGISTRY
echo $MODULES_MODULE_NAME
Expand Down Expand Up @@ -130,7 +130,7 @@ jobs:
- name: SET VAR
run: |
echo "MODULES_MODULE_SOURCE=$MODULES_REGISTRY/$MODULE_SOURCE_NAME/se/modules" >> "$GITHUB_ENV"
echo "MODULE_EDITION=EE" >> "$GITHUB_ENV"
echo "MODULE_EDITION=se" >> "$GITHUB_ENV"
- run: |
echo $MODULES_REGISTRY
echo $MODULES_MODULE_NAME
Expand Down Expand Up @@ -165,7 +165,7 @@ jobs:
- name: SET VAR
run: |
echo "MODULES_MODULE_SOURCE=$MODULES_REGISTRY/$MODULE_SOURCE_NAME/se-plus/modules" >> "$GITHUB_ENV"
echo "MODULE_EDITION=EE" >> "$GITHUB_ENV"
echo "MODULE_EDITION=seplus" >> "$GITHUB_ENV"
- run: |
echo $MODULES_REGISTRY
echo $MODULES_MODULE_NAME
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/go_lint.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Go linter for images

env:
GO_BUILD_TAGS: "EE CE"
GO_BUILD_TAGS: "ee ce se seplus csepro"

on:
pull_request:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/go_tests.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Go tests for images

env:
GO_BUILD_TAGS: "EE CE"
GO_BUILD_TAGS: "ee ce se seplus csepro"

on:
pull_request:
Expand Down
5 changes: 3 additions & 2 deletions .werf/choise-edition.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
---
image: choise-edition
from: {{ $.BASE_ALT_P11 }}
fromCacheVersion: 2025-01-31.1
fromCacheVersion: 2025-02-10.1
git:
- add: /
to: /
Expand All @@ -11,5 +11,6 @@ git:
shell:
setup:
- cd /openapi
- cp -v values_{{ .MODULE_EDITION }}.yaml values.yaml
# - cp -v values_{{ .MODULE_EDITION }}.yaml values.yaml
- if [[ {{ .MODULE_EDITION }} == "ce" ]]; then cp -v values_ce.yaml values.yaml; else cp -v values_ee.yaml values.yaml; fi
- rm -rf values_*.yaml
9 changes: 5 additions & 4 deletions .werf/consts.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# base images
{{- $_ := set . "BASE_GOLANG_1_23" "registry.deckhouse.io/base_images/golang:1.23.4-bookworm@sha256:a9147a48ac5e925a66764afae7cf4b1cfd37a6e94ad7519eca74c1fd8993ae45" }}
{{- $_ := set . "BASE_GOLANG_1_23" "registry.deckhouse.io/base_images/golang:1.23.6-alpine3.20@sha256:3058c63e0e2532881949c4186414baa24a0f9a8f9349b1853daa49be816f42e9" }}
{{- $_ := set . "BASE_SCRATCH" "registry.deckhouse.io/base_images/scratch@sha256:653ae76965c98c8cd1c8c9ff7725316d2983986f896655b30e0f44d2f8b2dd7e" }}
{{- $_ := set . "BASE_ALT_P11" "registry.deckhouse.io/base_images/alt:p11@sha256:e47d84424485d3674240cb2f67d3a1801b37d327e6d1eb8cc8d01be8ed3b34f3" }}
{{- $_ := set . "BASE_ALT_P11" "registry.deckhouse.io/base_images/alt:p11@sha256:b630220d83798057e1c67fe6f712a49e9c3abb377f0bd7183bba0ba541fc4081" }}
{{- $_ := set . "BASE_ALPINE_3_16" "registry.deckhouse.io/base_images/alpine:3.16.3" }}
{{- $_ := set . "BASE_ALPINE_3_20" "registry.deckhouse.io/base_images/alpine:3.20.3@sha256:41628df7c9b935d248f64542634e7a843f9bc7f2252d7f878e77f7b79a947466" }}

# Edition module settings, default EE
{{- $_ := set . "MODULE_EDITION" (env "MODULE_EDITION" "EE") }}
# Edition module settings, default ee
{{- $_ := set . "MODULE_EDITION" (env "MODULE_EDITION" "ee") }}

# component versions
{{- $versions := dict }}
Expand All @@ -19,4 +19,5 @@
# custom constants
{{- $_ := set $ "DEV_PACKAGES" "make automake pkg-config gcc libtool git curl" }}
{{- $_ := set $ "DECKHOUSE_UID_GID" "64535" }}
{{- $_ := set $ "ALT_BASE_PACKAGES" "openssl libtirpc tzdata" }}
{{- $_ := set $ "ALT_CLEANUP_CMD" "rm -rf /var/lib/apt/lists/* /var/cache/apt/* && mkdir -p /var/lib/apt/lists/partial /var/cache/apt/archives/partial" }}
1 change: 1 addition & 0 deletions api/v1alpha1/nfs_storage_class.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ type NFSStorageClassSpec struct {
ReclaimPolicy string `json:"reclaimPolicy"`
VolumeBindingMode string `json:"volumeBindingMode"`
WorkloadNodes *NFSStorageClassWorkloadNodes `json:"workloadNodes,omitempty"`
VolumeCleanup string `json:"volumeCleanup,omitempty"`
}

// +k8s:deepcopy-gen=true
Expand Down
23 changes: 23 additions & 0 deletions crds/nfsstorageclass.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ spec:
- connection
- reclaimPolicy
- volumeBindingMode
x-kubernetes-validations:
- rule: "self.reclaimPolicy != 'Retain' || !has(self.volumeCleanup)"
message: "If reclaimPolicy is 'Retain', volumeCleanup must be omitted."
- rule: "self.connection.nfsVersion == '4.2' || !has(self.volumeCleanup)|| self.volumeCleanup != 'Discard'"
message: "Discard mode is only available when connection.nfsVersion is '4.2'."
properties:
connection:
type: object
Expand Down Expand Up @@ -191,6 +196,24 @@ spec:
type: array
items:
type: string
volumeCleanup:
type: string
x-doc-d8editions: [ee,fe]
description: |
**This feature is available in EE and FE.**

Specifies the cleanup method to be applied to the PV’s subdirectory content before deletion.
By default, the NFS CSI driver simply deletes the directory created for the Persistent Volume (PV) on the NFS server without performing any data cleanup.
When volumeCleanup is enabled, the driver will erase each file in the PV directory.

Valid options are:
- **Discard**: Uses the filesystem’s discard (trim) functionality to free data blocks. (This option is available only when supported, for example with NFSv4.2.)
- **RandomFillSinglePass**: Overwrites the content of each file once with random data before deletion. This is implemented by invoking the utility `shred`.
- **RandomFillThreePass**: Overwrites the content of each file three times with random data before deletion. This is implemented by invoking the utility `shred`.
enum:
- Discard
- RandomFillSinglePass
- RandomFillThreePass
status:
type: object
description: |
Expand Down
45 changes: 44 additions & 1 deletion docs/README_RU.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,47 @@ EOF

### Проверка работоспособности модуля

Как проверить работоспособность модуля описано [в FAQ](./faq.html#как-проверить-работоспособность-модуля).
Проверить работоспособность модуля можно [так](./faq.html#как-проверить-работоспособность-модуля)

### Затирание остаточных данных

Перед удалением на томе могут остаться файлы с пользовательскими данными. Эти файлы будут удалены и не будут доступны другим пользователям через NFS.

Однако данные удаленных файлов могут оказаться доступными другим клиентам, если сервер предоставит доступ к своему хранилищу на уровне блочных устройств.

Настроить процедуру очистки файлов перед удалением поможет опция `???`.

> **Внимание!** Эта опция не влияет на файлы уже удаленные клиентским приложением.

> **Внимание!** Эта опция влияет только на команды отправляемые по протоколу NFS. Проведение этих команд на стороне сервера определено
>
> - сервисом NFS сервера
> - файловой системой
> - уровнем блочных устройств и их виртуализации (например LVM)
> - самими физическими устройствами
>
> Убедитесь в доверенности сервера. Не отправляйте деликатные данные на сервера, в которых нет уверенности.

#### Опция `SinglePass`

Перезаписывает содержимое файлов случайной последовательностью перед удалением. Случайная последовательность передается по сети.

#### Опция `ThreePass`

Трижды перезаписывает содержимое файлов случайной последовательностью перед удалением. Три случайных последовательности передаются по сети.
<!-- Имеет смысл только если сервер хранит данные на жестком диске, и есть риск, что у злоумышленника появится физический доступ к устройству. -->

#### Опция `Discard`

Многие файловые системы реализуют поддержку твердотельных накопителей, позволяя освободить место, занятое файлом, на блочном уровне без записи новых данных для увеличения срока службы твердотельного накопителя. Однако не все накопители гарантируют недоступность данных освобожденных блоков.

Опция `Discard` помечает содержимое файлов, как свободное через системный вызов `falloc` с флагом `FALLOC_FL_PUNCH_HOLE`. Файловая система освободит полностью используемые файлом блоки, через вызов `blkdiscard`, а остальное место будет перезаписано нулями. Если сервер сообщит, что `FALLOC_FL_PUNCH_HOLE` не поддерживается, то будет вызвана `FALLOC_FL_ZERO_RANGE`, которая занулит содержимое файла.

Преимущества этого метода:

- объем трафика не зависит от размера файлов, а только от их количества
- метод может обеспечить недоступность старых данных при некоторых конфигурациях сервера
- работает как для жестких дисков, так и твердотельных накопителей
- позволяет увеличить время жизни твердотельного накопителя

<!-- TODO: Может разделим на две или три (PunchHole, ZeroOut, PunchHoleOrZeroOut)? -->
2 changes: 1 addition & 1 deletion images/controller/src/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func main() {
log.Info(fmt.Sprintf("[main] Go Version:%s ", goruntime.Version()))
log.Info(fmt.Sprintf("[main] OS/Arch:Go OS/Arch:%s/%s ", goruntime.GOOS, goruntime.GOARCH))

log.Info(fmt.Sprintf("[main] Feature TLSEnabled:%v", commonfeature.TLSEnabled))
log.Info(fmt.Sprintf("[main] Feature TLSEnabled:%t", commonfeature.TLSEnabled()))

log.Info("[main] CfgParams has been successfully created")
log.Info(fmt.Sprintf("[main] %s = %s", config.LogLevelEnvName, cfgParams.Loglevel))
Expand Down
38 changes: 19 additions & 19 deletions images/controller/src/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ module d8-controller
go 1.23.4

require (
github.com/deckhouse/csi-nfs/api v0.0.0-20250116103144-d23aedd591a3
github.com/deckhouse/csi-nfs/lib/go/common v0.0.0-20250116103144-d23aedd591a3
github.com/deckhouse/csi-nfs/api v0.0.0-20250213115525-4785a9da80db
github.com/deckhouse/csi-nfs/lib/go/common v0.0.0-20250213115525-4785a9da80db
github.com/go-logr/logr v1.4.2
github.com/kubernetes-csi/external-snapshotter/client/v8 v8.2.0
github.com/onsi/ginkgo/v2 v2.22.2
github.com/onsi/gomega v1.36.2
k8s.io/api v0.32.1
k8s.io/apiextensions-apiserver v0.32.1
k8s.io/apimachinery v0.32.1
k8s.io/client-go v0.32.1
k8s.io/api v0.32.2
k8s.io/apiextensions-apiserver v0.32.2
k8s.io/apimachinery v0.32.2
k8s.io/client-go v0.32.2
k8s.io/klog/v2 v2.130.1
k8s.io/utils v0.0.0-20241210054802-24370beab758
sigs.k8s.io/controller-runtime v0.20.0
sigs.k8s.io/controller-runtime v0.20.1
)

// Do not combine multiple replacements into a single block,
Expand All @@ -29,7 +29,7 @@ require (
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
Expand All @@ -42,7 +42,7 @@ require (
github.com/google/gnostic-models v0.6.9 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
Expand All @@ -56,18 +56,18 @@ require (
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/x448/float16 v0.8.4 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/term v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.9.0 // indirect
golang.org/x/tools v0.29.0 // indirect
golang.org/x/net v0.35.0 // indirect
golang.org/x/oauth2 v0.26.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.29.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/time v0.10.0 // indirect
golang.org/x/tools v0.30.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
google.golang.org/protobuf v1.36.3 // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
Expand Down
Loading
Loading