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

Merged
merged 40 commits into from
Feb 21, 2025
Merged
Show file tree
Hide file tree
Changes from 37 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
39469fb
first commit
AleksZimin Feb 1, 2025
24007be
some fixes
AleksZimin Feb 1, 2025
62a7554
test
AleksZimin Feb 1, 2025
e273359
prepare for tests
AleksZimin Feb 2, 2025
d66bd0b
Вариант документации.
asergunov Feb 7, 2025
9b02809
Punch or zero out
asergunov Feb 11, 2025
08333d1
fix
AleksZimin Feb 7, 2025
f20f0c3
fix
AleksZimin Feb 7, 2025
54fc655
fix
AleksZimin Feb 13, 2025
7fcb624
add shred
AleksZimin Feb 13, 2025
486d81d
some changes
AleksZimin Feb 13, 2025
1198d9e
fix
AleksZimin Feb 13, 2025
e5c53c6
fixes
AleksZimin Feb 13, 2025
1305c3a
fix
AleksZimin Feb 13, 2025
f4464f2
fix
AleksZimin Feb 13, 2025
081dd90
bump deps
AleksZimin Feb 13, 2025
664da6d
some changes
AleksZimin Feb 13, 2025
a54942b
fix
AleksZimin Feb 13, 2025
2e59e5d
fix
AleksZimin Feb 13, 2025
ff4d6ef
fix
AleksZimin Feb 14, 2025
4bcd465
fix
AleksZimin Feb 14, 2025
c27c088
fix
AleksZimin Feb 14, 2025
84682a4
fix
AleksZimin Feb 14, 2025
915aa1e
fix
AleksZimin Feb 14, 2025
8895f0f
fix nsc
AleksZimin Feb 14, 2025
3e4266e
fix
AleksZimin Feb 14, 2025
7b752b5
some fixes
AleksZimin Feb 14, 2025
df0585d
fix
AleksZimin Feb 14, 2025
25c0b2a
fix
AleksZimin Feb 14, 2025
dd32f7e
fixes after review
AleksZimin Feb 14, 2025
b53a2db
some commit
AleksZimin Feb 16, 2025
567df94
finish refactoring
AleksZimin Feb 16, 2025
461ad60
add vsclass
AleksZimin Feb 16, 2025
e1f4a13
fix linter
AleksZimin Feb 16, 2025
5439265
fix rbac
AleksZimin Feb 16, 2025
bfc2df1
fix
AleksZimin Feb 16, 2025
23db42c
remove ZERO_RANGE from doc
asergunov Feb 18, 2025
0c6eae4
Apply suggestions from code review
duckhawk Feb 20, 2025
dfc0b60
docs: add volumeCleanup description (ru CRD) and Selects the method t…
Feb 20, 2025
56c0f7d
Apply suggestions from code review
duckhawk Feb 21, 2025
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`, а остальное место будет перезаписано нулями.

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

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

<!-- 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
40 changes: 20 additions & 20 deletions images/controller/src/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@ 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/google/go-cmp v0.6.0
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.2
)

// Do not combine multiple replacements into a single block,
Expand All @@ -29,7 +30,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 @@ -40,9 +41,8 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/btree v1.1.3 // indirect
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