diff --git a/.docforge/config.yaml b/.docforge/config.yaml
index af5ab1730..cedafda78 100644
--- a/.docforge/config.yaml
+++ b/.docforge/config.yaml
@@ -19,6 +19,7 @@ content-files-formats:
- ".gif"
- ".ico"
- ".webmanifest"
+- ".webp"
resources-download-path: content/__resources
github-oauth-env-map:
"github.com": GITHUB_OAUTH_TOKEN
diff --git a/Makefile b/Makefile
index b6226ca22..253cf7239 100644
--- a/Makefile
+++ b/Makefile
@@ -105,6 +105,26 @@ docker-preview:
install: ## Install npm dependencies
npm ci
+
+OPTIMIZE_DIR ?= website
+OPTIMIZE_MIN_KB ?= 200
+OPTIMIZE_SKIP ?= favicon.png,favicon-16x16.png,favicon-32x32.png,favicon-96x96.png,apple-touch-icon.png,web-app-manifest-192x192.png,web-app-manifest-512x512.png,2025-07.png,og-gardener.png
+
+.PHONY: optimize-assets
+optimize-assets: ## Dry run: show which PNG images would be converted to WebP
+ node scripts/optimize-assets.mjs \
+ --dir $(OPTIMIZE_DIR) \
+ --min-kb $(OPTIMIZE_MIN_KB) \
+ --skip $(OPTIMIZE_SKIP)
+
+.PHONY: optimize-assets-write
+optimize-assets-write: ## Convert large PNG images to WebP and update references
+ node scripts/optimize-assets.mjs \
+ --dir $(OPTIMIZE_DIR) \
+ --min-kb $(OPTIMIZE_MIN_KB) \
+ --skip $(OPTIMIZE_SKIP) \
+ --write
+
.PHONY: dev
dev:
npx vitepress dev
diff --git a/package-lock.json b/package-lock.json
index b6ae7240c..2a4f85a9d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,7 @@
"gray-matter": "4.0.3",
"js-yaml": "4.1.1",
"lodash-es": "4.18.1",
+ "sharp": "^0.34.5",
"vitepress": "1.6.4",
"vitepress-sidebar": "1.33.1",
"vue": "3.5.16"
@@ -18,7 +19,8 @@
"@types/js-yaml": "4.0.9",
"@types/lodash-es": "4.17.12",
"@types/markdown-it": "12.2.3",
- "@types/node": "20.11.27"
+ "@types/node": "20.11.27",
+ "sharp": "^0.34.5"
}
},
"node_modules/@algolia/autocomplete-core": {
@@ -340,6 +342,17 @@
}
}
},
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@esbuild/aix-ppc64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
@@ -723,6 +736,496 @@
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
"license": "MIT"
},
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
"node_modules/@isaacs/cliui": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz",
@@ -1772,6 +2275,16 @@
"node": ">=6"
}
},
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/devlop": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
@@ -2529,6 +3042,64 @@
"node": ">=4"
}
},
+ "node_modules/semver": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
+ "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -2663,6 +3234,14 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
"node_modules/typescript": {
"version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
diff --git a/package.json b/package.json
index 3b2045f9b..d08108417 100644
--- a/package.json
+++ b/package.json
@@ -6,6 +6,7 @@
"gray-matter": "4.0.3",
"js-yaml": "4.1.1",
"lodash-es": "4.18.1",
+ "sharp": "^0.34.5",
"vitepress": "1.6.4",
"vitepress-sidebar": "1.33.1",
"vue": "3.5.16"
@@ -17,6 +18,7 @@
"@types/js-yaml": "4.0.9",
"@types/lodash-es": "4.17.12",
"@types/markdown-it": "12.2.3",
- "@types/node": "20.11.27"
+ "@types/node": "20.11.27",
+ "sharp": "^0.34.5"
}
}
diff --git a/post-processing/part-1.js b/post-processing/part-1.js
index 518119505..d4739902c 100644
--- a/post-processing/part-1.js
+++ b/post-processing/part-1.js
@@ -212,7 +212,7 @@ async function renameImagesToLowercase(basePath){
try {
// Match any file with uppercase letters and image extensions
- const regex = /[A-Z]+.*\.(png|jpg|jpeg|svg)$/i;
+ const regex = /[A-Z]+.*\.(png|jpg|jpeg|svg|webp)$/i;
const files = await fs.readdir(directory);
for (const file of files) {
diff --git a/scripts/optimize-assets.mjs b/scripts/optimize-assets.mjs
new file mode 100644
index 000000000..e5c22e4cc
--- /dev/null
+++ b/scripts/optimize-assets.mjs
@@ -0,0 +1,182 @@
+/**
+ * Converts large PNG images to WebP and updates all references.
+ * Fully configurable via CLI arguments — no project-specific defaults.
+ *
+ * Usage:
+ * node scripts/optimize-assets.mjs --dir website --min-kb 200 ← dry run
+ * node scripts/optimize-assets.mjs --dir website --min-kb 200 --write
+ *
+ * Arguments:
+ * --dir Target directory to scan for images (required)
+ * --min-kb Only convert files above this size in KB (default: 0 = all)
+ * --skip Comma-separated list of filenames to skip
+ * --write Apply changes (default is dry run)
+ */
+
+import sharp from 'sharp'
+import { readdir, stat, unlink, readFile, writeFile } from 'fs/promises'
+import { join, extname, basename, dirname } from 'path'
+import { fileURLToPath } from 'url'
+
+const __dirname = dirname(fileURLToPath(import.meta.url))
+const ROOT = join(__dirname, '..')
+
+// parse args
+const args = process.argv.slice(2)
+const DRY_RUN = !args.includes('--write')
+
+function getArg(flag) {
+ const i = args.indexOf(flag)
+ return i !== -1 ? args[i + 1] : null
+}
+
+const dirArg = getArg('--dir')
+if (!dirArg) {
+ console.error('Error: --dir argument is required')
+ console.error('Usage: node scripts/optimize-assets.mjs --dir website --min-kb 200')
+ process.exit(1)
+}
+
+const TARGET_DIR = join(ROOT, dirArg)
+const MIN_SIZE_KB = parseFloat(getArg('--min-kb') ?? '0')
+const skipArg = getArg('--skip')
+const SKIP_FILENAMES = new Set(skipArg ? skipArg.split(',') : [])
+
+//config
+
+// Directories to search for references to update
+const REF_DIRS = [
+ TARGET_DIR,
+ join(ROOT, '.vitepress', 'theme'),
+]
+
+const CONVERTIBLE = new Set(['.png'])
+const REF_EXTENSIONS = new Set(['.md', '.vue', '.html', '.js', '.ts'])
+
+//helpers
+
+async function fileSizeKB(p) {
+ return ((await stat(p)).size / 1024).toFixed(1)
+}
+
+async function* walk(dir) {
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
+ const full = join(dir, entry.name)
+ if (entry.isDirectory()) yield* walk(full)
+ else yield full
+ }
+}
+
+/**
+ * Find and optionally replace partialOld → partialNew in all ref files.
+ * Uses partial path (e.g. "images/foo.png") for more precise matching.
+ * Returns list of affected files.
+ */
+async function updateRefs(partialOld, partialNew) {
+ const affected = []
+ for (const refDir of REF_DIRS) {
+ for await (const file of walk(refDir)) {
+ if (!REF_EXTENSIONS.has(extname(file))) continue
+ const content = await readFile(file, 'utf8')
+ if (!content.includes(partialOld)) continue
+ if (!DRY_RUN) {
+ await writeFile(file, content.replaceAll(partialOld, partialNew), 'utf8')
+ }
+ affected.push(file.replace(ROOT + '/', ''))
+ }
+ }
+ return affected
+}
+
+//main
+
+async function main() {
+ if (DRY_RUN) {
+ console.log('DRY RUN — nothing will be changed. Pass --write to convert.\n')
+ }
+
+ console.log(`Scanning: ${TARGET_DIR}`)
+ console.log(`Threshold: files over ${MIN_SIZE_KB}KB`)
+ if (SKIP_FILENAMES.size > 0) {
+ console.log(`Skipping: ${[...SKIP_FILENAMES].join(', ')}`)
+ }
+ console.log()
+
+ let converted = 0
+ let skippedSize = 0
+ let skippedName = 0
+ let totalBefore = 0
+ let totalAfter = 0
+
+ for await (const src of walk(TARGET_DIR)) {
+ if (!CONVERTIBLE.has(extname(src).toLowerCase())) continue
+
+ const name = basename(src)
+
+ if (SKIP_FILENAMES.has(name)) {
+ skippedName++
+ continue
+ }
+
+ const kb = parseFloat(await fileSizeKB(src))
+
+ if (kb < MIN_SIZE_KB) {
+ skippedSize++
+ continue
+ }
+
+ const dest = src.replace(/\.png$/i, '.webp')
+ const relSrc = src.replace(ROOT + '/', '')
+ const partialOld = `images/${name}`
+ const partialNew = `images/${basename(dest)}`
+ totalBefore += kb
+
+ if (DRY_RUN) {
+ console.log(` CONVERT ${relSrc} (${kb}KB) → ${basename(dest)}`)
+ const refs = await updateRefs(partialOld, partialNew)
+ for (const r of refs) {
+ console.log(` ref in: ${r}`)
+ }
+ continue
+ }
+
+ // Convert PNG → WebP
+ await sharp(src).webp({ quality: 85 }).toFile(dest)
+
+ const kbAfter = parseFloat(await fileSizeKB(dest))
+ totalAfter += kbAfter
+ const saved = (((kb - kbAfter) / kb) * 100).toFixed(0)
+
+ // Update references only for converted files
+ const refs = await updateRefs(partialOld, partialNew)
+
+ // Delete original
+ await unlink(src)
+
+ console.log(`${relSrc}`)
+ console.log(` ${kb}KB → ${kbAfter}KB (-${saved}%)`)
+ for (const r of refs) {
+ console.log(` ref: ${r}`)
+ }
+
+ converted++
+ }
+
+ console.log('\n' + '─'.repeat(60))
+
+ if (DRY_RUN) {
+ console.log(`Skipped ${skippedSize} files under ${MIN_SIZE_KB}KB.`)
+ console.log(`Skipped ${skippedName} files by name.`)
+ console.log('\nRun with --write to apply changes.')
+ } else {
+ const savedMB = ((totalBefore - totalAfter) / 1024).toFixed(1)
+ console.log(`Converted: ${converted} file(s)`)
+ console.log(`Skipped: ${skippedSize} under ${MIN_SIZE_KB}KB + ${skippedName} by name`)
+ console.log(`Saved: ~${savedMB}MB (${totalBefore.toFixed(0)}KB → ${totalAfter.toFixed(0)}KB)`)
+ }
+}
+
+main().catch(err => {
+ console.error('Error:', err.message)
+ process.exit(1)
+})
\ No newline at end of file
diff --git a/website/adopter/_index.md b/website/adopter/_index.md
index 79abe264d..2f88034e5 100644
--- a/website/adopter/_index.md
+++ b/website/adopter/_index.md
@@ -11,23 +11,21 @@ aside: false
| | |
| --- | ----------- |
-|
| SAP BTP, Kubernetes environment (internal) uses Gardener to deploy and manage Kubernetes clusters at scale in a uniform way across infrastructures (AWS, Azure, GCP, Alicloud, as well as generic interfaces to OpenStack and vSphere). Workloads include Databases (SAP HANA Cloud), Big Data (SAP Data Intelligence), Kyma, many other cloud native applications, and diverse business workloads. |
-|
| Gardener can now be run by customers on the Public Cloud Platform of the leading European Cloud Provider OVHcloud. |
-|
| ScaleUp Technologies runs Gardener within their public Openstack Clouds (Hamburg, Berlin, Düsseldorf). Their clients run all kinds of workloads on top of Gardener maintained Kubernetes clusters ranging from databases to Software-as-a-Service applications. |
-|
| Finanz Informatik Technologie Services GmbH uses Gardener to offer k8s as a service for customers in the financial industry in Germany. It is built on top of a "metal as a service" infrastructure implemented from scratch for k8s workloads in mind. The result is k8s on top of bare metal in minutes. |
-|
| Beezlabs uses Gardener to deliver Intelligent Process Automation platform, on multiple cloud providers and reduce costs and lock-in risks. |
+|
| SAP BTP, Kubernetes environment (internal) uses Gardener to deploy and manage Kubernetes clusters at scale in a uniform way across infrastructures (AWS, Azure, GCP, Alicloud, as well as generic interfaces to OpenStack and vSphere). Workloads include Databases (SAP HANA Cloud), Big Data (SAP Data Intelligence), Kyma, many other cloud native applications, and diverse business workloads. |
+|
| Gardener can now be run by customers on the Public Cloud Platform of the leading European Cloud Provider OVHcloud. |
+|
| ScaleUp Technologies runs Gardener within their public Openstack Clouds (Hamburg, Berlin, Düsseldorf). Their clients run all kinds of workloads on top of Gardener maintained Kubernetes clusters ranging from databases to Software-as-a-Service applications. |
+|
| Finanz Informatik Technologie Services GmbH uses Gardener to offer k8s as a service for customers in the financial industry in Germany. It is built on top of a "metal as a service" infrastructure implemented from scratch for k8s workloads in mind. The result is k8s on top of bare metal in minutes. |
+|
| Beezlabs uses Gardener to deliver Intelligent Process Automation platform, on multiple cloud providers and reduce costs and lock-in risks. |
|
| b’nerd uses Gardener as the core technology for its own managed Kubernetes as a Service solution and operates multiple Gardener installations for several cloud hosting service providers. |
-|
| STACKIT is a digital brand of Europe's biggest retailer, the Schwarz Group, which includes Lidl, Kaufland, but also production and recycling companies. It uses Gardener to offer public and private Kubernetes as a service in own data centers in Europe and targets to become the cloud provider for German and European small and mid-sized companies. |
-|
| Supporting and managing multiple application landscapes on-premises and across different hyperscaler infrastructures can be painful. At T-Systems we use Gardener both for internal usage and to manage clusters for our customers. We love the openness of the project, the flexibility and the architecture that allows us to manage clusters around the world with only one team from one single pane of glass and to meet industry specific certification standards. The sovereignty by design is another great value, the technology implicitly brings along. |
-|
| The German-based company 23 Technologies uses Gardener to offer an enterprise-class Kubernetes engine for industrial use cases as well as cloud service providers and offers managed and professional services for it. 23T is also the team behind okeanos.dev, a public service that can be used by anyone to try out Gardener. |
-|
| B1 Systems GmbH is a international provider of Linux & Open Source consulting, training, managed service & support. We are founded in 2004 and based in Germany. Our team of 140 Linux experts offers tailor-made solutions based on cloud & container technologies, virtualization & high availability as well as monitoring, system & configuration management. B1 is using Gardener internally and also set up solutions/environments for customers. |
-|
| Codesphere is a Cloud IDE with integrated and automated deployment of web apps. It uses Gardener internally to manage clusters that host customer deployments and internal systems all over the world.
-|
| plusserver combines its own cloud offerings with hyperscaler platforms to provide individually tailored multi-cloud solutions. The plusserver Kubernetes Engine (PSKE) based on Gardener reduces the complexity in managing multi-cloud environments and enables companies to orchestrate their containers and cloud-native applications across a variety of platforms such as plusserver's pluscloud open or hyperscalers such as AWS, either by mouseclick or via an API. With PSKE, companies remain vendor-independent and profit from guaranteed data sovereignty and data security due to GDPR-compliant cloud platforms in the certified plusserver data centers in Germany.
-|
| Cyso Cloud uses Gardener as the basis for its Managed Kubernetes, a platform that simplifies the management of your k8s and provides insight into usage and performance. The other Cyso Cloud service can be added with a mouse click, and the choice of another cloud provider is a negotiable option. Cyso stands for Digital Sovereignty, Data Portability and GDPR compatibility.
-|
| metalstack.cloud uses Gardener and is based on the open-source software metal-stack.io, which is developed for regulated financial institutions. The focus here is on the highest possible security and compliance conformity. This makes metalstack.cloud perfect for running enterprise-grade container applications and provides your workloads with the highest possible performance.
-|
| Cleura uses Gardener to power its Container Orchestration Engine for Cleura Public Cloud and Cleura Compliant Cloud. Cleura Container Orchestration Engine simplifies the creation and management of Kubernetes clusters through their user-friendly Cleura Cloud Management Panel or API, allowing users to focus on deploying applications instead of maintaining the underlying infrastructure.
-|| PITS Globale Datenrettungsdienste is a data recovery company located in Germany specializing in recovering lost or damaged files from hard drives, solid-state drives, flash drives, and other storage media. Gardener is used to handle highly-loaded internal infrastructure and provide reliable, fully-managed K8 cluster solutions.
-|
| exigo is a Swiss cloud provider with over 25 years of experience, offering secure, high-performance IT solutions from its Swiss-based data centers.
To enhance its Kubernetes services, exigo developed exikube, a fully managed Kubernetes platform powered by Gardener. Running exclusively on exigo’s Swiss infrastructure, exikube ensures automated cluster management, scalability, and security, allowing businesses to deploy and manage applications with ease while staying compliant.
-|
| **[noris network](https://www.noris.de/)** delivers premium IT from high-security German data centers: colocation, networks, managed services and sovereign cloud platforms.
[noris Sovereign Cloud (nSC)](https://www.noris.de/noris-sovereign-cloud-2/) combines OpenStack + Gardener into a 100% open source platform compliant with the German Administrative Cloud Strategy. |
+|
| STACKIT is a digital brand of Europe’s biggest retailer, the Schwarz Group, which includes Lidl, Kaufland, but also production and recycling companies. It uses Gardener to offer public and private Kubernetes as a service in own data centers in Europe and targets to become the cloud provider for German and European small and mid-sized companies. |
+|
| Supporting and managing multiple application landscapes on-premises and across different hyperscaler infrastructures can be painful. At T-Systems we use Gardener both for internal usage and to manage clusters for our customers. We love the openness of the project, the flexibility and the architecture that allows us to manage clusters around the world with only one team from one single pane of glass and to meet industry specific certification standards. The sovereignty by design is another great value, the technology implicitly brings along. |
+|
| The German-based company 23 Technologies uses Gardener to offer an enterprise-class Kubernetes engine for industrial use cases as well as cloud service providers and offers managed and professional services for it. 23T is also the team behind okeanos.dev, a public service that can be used by anyone to try out Gardener. |
+|
| B1 Systems GmbH is a international provider of Linux & Open Source consulting, training, managed service & support. We are founded in 2004 and based in Germany. Our team of 140 Linux experts offers tailor-made solutions based on cloud & container technologies, virtualization & high availability as well as monitoring, system & configuration management. B1 is using Gardener internally and also set up solutions/environments for customers. |
+|
| Codesphere is a Cloud IDE with integrated and automated deployment of web apps. It uses Gardener internally to manage clusters that host customer deployments and internal systems all over the world.
+|
| plusserver combines its own cloud offerings with hyperscaler platforms to provide individually tailored multi-cloud solutions. The plusserver Kubernetes Engine (PSKE) based on Gardener reduces the complexity in managing multi-cloud environments and enables companies to orchestrate their containers and cloud-native applications across a variety of platforms such as plusserver's pluscloud open or hyperscalers such as AWS, either by mouseclick or via an API. With PSKE, companies remain vendor-independent and profit from guaranteed data sovereignty and data security due to GDPR-compliant cloud platforms in the certified plusserver data centers in Germany.|
| Cyso Cloud uses Gardener as the basis for its Managed Kubernetes, a platform that simplifies the management of your k8s and provides insight into usage and performance. The other Cyso Cloud service can be added with a mouse click, and the choice of another cloud provider is a negotiable option. Cyso stands for Digital Sovereignty, Data Portability and GDPR compatibility.
+|
| metalstack.cloud uses Gardener and is based on the open-source software metal-stack.io, which is developed for regulated financial institutions. The focus here is on the highest possible security and compliance conformity. This makes metalstack.cloud perfect for running enterprise-grade container applications and provides your workloads with the highest possible performance.
+|
| Cleura uses Gardener to power its Container Orchestration Engine for Cleura Public Cloud and Cleura Compliant Cloud. Cleura Container Orchestration Engine simplifies the creation and management of Kubernetes clusters through their user-friendly Cleura Cloud Management Panel or API, allowing users to focus on deploying applications instead of maintaining the underlying infrastructure.|| PITS Globale Datenrettungsdienste is a data recovery company located in Germany specializing in recovering lost or damaged files from hard drives, solid-state drives, flash drives, and other storage media. Gardener is used to handle highly-loaded internal infrastructure and provide reliable, fully-managed K8 cluster solutions.
+|
| exigo is a Swiss cloud provider with over 25 years of experience, offering secure, high-performance IT solutions from its Swiss-based data centers.
To enhance its Kubernetes services, exigo developed exikube, a fully managed Kubernetes platform powered by Gardener. Running exclusively on exigo’s Swiss infrastructure, exikube ensures automated cluster management, scalability, and security, allowing businesses to deploy and manage applications with ease while staying compliant.
+|
| **[noris network](https://www.noris.de/)** delivers premium IT from high-security German data centers: colocation, networks, managed services and sovereign cloud platforms.
[noris Sovereign Cloud (nSC)](https://www.noris.de/noris-sovereign-cloud-2/) combines OpenStack + Gardener into a 100% open source platform compliant with the German Administrative Cloud Strategy. |
### If you’re using Gardener and you aren’t on this list, [submit a pull request!](https://github.dev/gardener/documentation/blob/master/website/adopter/_index.md)
diff --git a/website/adopter/images/23technologies.png b/website/adopter/images/23technologies.png
deleted file mode 100644
index 6fcf407c4..000000000
Binary files a/website/adopter/images/23technologies.png and /dev/null differ
diff --git a/website/adopter/images/23technologies.webp b/website/adopter/images/23technologies.webp
new file mode 100644
index 000000000..7f375fc8f
Binary files /dev/null and b/website/adopter/images/23technologies.webp differ
diff --git a/website/adopter/images/b1-systems.png b/website/adopter/images/b1-systems.png
deleted file mode 100644
index 694a6b615..000000000
Binary files a/website/adopter/images/b1-systems.png and /dev/null differ
diff --git a/website/adopter/images/b1-systems.webp b/website/adopter/images/b1-systems.webp
new file mode 100644
index 000000000..71e4b24da
Binary files /dev/null and b/website/adopter/images/b1-systems.webp differ
diff --git a/website/adopter/images/beezlab.png b/website/adopter/images/beezlab.png
deleted file mode 100644
index 410f1775a..000000000
Binary files a/website/adopter/images/beezlab.png and /dev/null differ
diff --git a/website/adopter/images/beezlab.webp b/website/adopter/images/beezlab.webp
new file mode 100644
index 000000000..97d37b962
Binary files /dev/null and b/website/adopter/images/beezlab.webp differ
diff --git a/website/adopter/images/cleura-log-black.png b/website/adopter/images/cleura-log-black.png
deleted file mode 100644
index 16951f802..000000000
Binary files a/website/adopter/images/cleura-log-black.png and /dev/null differ
diff --git a/website/adopter/images/cleura-log-black.webp b/website/adopter/images/cleura-log-black.webp
new file mode 100644
index 000000000..d0568cea2
Binary files /dev/null and b/website/adopter/images/cleura-log-black.webp differ
diff --git a/website/adopter/images/codesphere.png b/website/adopter/images/codesphere.png
deleted file mode 100644
index a34ead5d9..000000000
Binary files a/website/adopter/images/codesphere.png and /dev/null differ
diff --git a/website/adopter/images/codesphere.webp b/website/adopter/images/codesphere.webp
new file mode 100644
index 000000000..1198f7f17
Binary files /dev/null and b/website/adopter/images/codesphere.webp differ
diff --git a/website/adopter/images/cyso-cloud-logo-transparent.png b/website/adopter/images/cyso-cloud-logo-transparent.png
deleted file mode 100644
index 3dd79f50a..000000000
Binary files a/website/adopter/images/cyso-cloud-logo-transparent.png and /dev/null differ
diff --git a/website/adopter/images/cyso-cloud-logo-transparent.webp b/website/adopter/images/cyso-cloud-logo-transparent.webp
new file mode 100644
index 000000000..79f6996dd
Binary files /dev/null and b/website/adopter/images/cyso-cloud-logo-transparent.webp differ
diff --git a/website/adopter/images/exigo.png b/website/adopter/images/exigo.png
deleted file mode 100644
index 7ff879879..000000000
Binary files a/website/adopter/images/exigo.png and /dev/null differ
diff --git a/website/adopter/images/exigo.webp b/website/adopter/images/exigo.webp
new file mode 100644
index 000000000..82dc1b14f
Binary files /dev/null and b/website/adopter/images/exigo.webp differ
diff --git a/website/adopter/images/fits.png b/website/adopter/images/fits.png
deleted file mode 100644
index 952d8f531..000000000
Binary files a/website/adopter/images/fits.png and /dev/null differ
diff --git a/website/adopter/images/fits.webp b/website/adopter/images/fits.webp
new file mode 100644
index 000000000..c8633707a
Binary files /dev/null and b/website/adopter/images/fits.webp differ
diff --git a/website/adopter/images/metalstack.cloud.png b/website/adopter/images/metalstack.cloud.png
deleted file mode 100644
index fb4412017..000000000
Binary files a/website/adopter/images/metalstack.cloud.png and /dev/null differ
diff --git a/website/adopter/images/metalstack.cloud.webp b/website/adopter/images/metalstack.cloud.webp
new file mode 100644
index 000000000..0905ba64f
Binary files /dev/null and b/website/adopter/images/metalstack.cloud.webp differ
diff --git a/website/adopter/images/noris_network.png b/website/adopter/images/noris_network.png
deleted file mode 100644
index 81bc1598e..000000000
Binary files a/website/adopter/images/noris_network.png and /dev/null differ
diff --git a/website/adopter/images/noris_network.webp b/website/adopter/images/noris_network.webp
new file mode 100644
index 000000000..48b3d4499
Binary files /dev/null and b/website/adopter/images/noris_network.webp differ
diff --git a/website/adopter/images/ovhcloud_master_logo_fullcolor_cmyk.png b/website/adopter/images/ovhcloud_master_logo_fullcolor_cmyk.png
deleted file mode 100644
index 199d8e673..000000000
Binary files a/website/adopter/images/ovhcloud_master_logo_fullcolor_cmyk.png and /dev/null differ
diff --git a/website/adopter/images/ovhcloud_master_logo_fullcolor_cmyk.webp b/website/adopter/images/ovhcloud_master_logo_fullcolor_cmyk.webp
new file mode 100644
index 000000000..8d83d9459
Binary files /dev/null and b/website/adopter/images/ovhcloud_master_logo_fullcolor_cmyk.webp differ
diff --git a/website/adopter/images/pingcap.png b/website/adopter/images/pingcap.png
deleted file mode 100644
index b8c95bc9b..000000000
Binary files a/website/adopter/images/pingcap.png and /dev/null differ
diff --git a/website/adopter/images/pingcap.webp b/website/adopter/images/pingcap.webp
new file mode 100644
index 000000000..5c71cb691
Binary files /dev/null and b/website/adopter/images/pingcap.webp differ
diff --git a/website/adopter/images/plusserver.png b/website/adopter/images/plusserver.png
deleted file mode 100644
index 90cb0b72a..000000000
Binary files a/website/adopter/images/plusserver.png and /dev/null differ
diff --git a/website/adopter/images/plusserver.webp b/website/adopter/images/plusserver.webp
new file mode 100644
index 000000000..2b96e4fc3
Binary files /dev/null and b/website/adopter/images/plusserver.webp differ
diff --git a/website/adopter/images/sap.png b/website/adopter/images/sap.png
deleted file mode 100644
index 571705781..000000000
Binary files a/website/adopter/images/sap.png and /dev/null differ
diff --git a/website/adopter/images/sap.webp b/website/adopter/images/sap.webp
new file mode 100644
index 000000000..6e56a792e
Binary files /dev/null and b/website/adopter/images/sap.webp differ
diff --git a/website/adopter/images/scaleup.png b/website/adopter/images/scaleup.png
deleted file mode 100644
index fd3c437e4..000000000
Binary files a/website/adopter/images/scaleup.png and /dev/null differ
diff --git a/website/adopter/images/scaleup.webp b/website/adopter/images/scaleup.webp
new file mode 100644
index 000000000..b34302b3d
Binary files /dev/null and b/website/adopter/images/scaleup.webp differ
diff --git a/website/adopter/images/stackit.png b/website/adopter/images/stackit.png
deleted file mode 100644
index 9e88150a0..000000000
Binary files a/website/adopter/images/stackit.png and /dev/null differ
diff --git a/website/adopter/images/stackit.webp b/website/adopter/images/stackit.webp
new file mode 100644
index 000000000..7a6f5b54f
Binary files /dev/null and b/website/adopter/images/stackit.webp differ
diff --git a/website/adopter/images/tsystems.png b/website/adopter/images/tsystems.png
deleted file mode 100644
index 7250d8f14..000000000
Binary files a/website/adopter/images/tsystems.png and /dev/null differ
diff --git a/website/adopter/images/tsystems.webp b/website/adopter/images/tsystems.webp
new file mode 100644
index 000000000..36887a675
Binary files /dev/null and b/website/adopter/images/tsystems.webp differ
diff --git a/website/archived/blog/2018/06.11-Frontend-HTTPS.md b/website/archived/blog/2018/06.11-Frontend-HTTPS.md
index c01f34fb5..9ba33406a 100644
--- a/website/archived/blog/2018/06.11-Frontend-HTTPS.md
+++ b/website/archived/blog/2018/06.11-Frontend-HTTPS.md
@@ -8,7 +8,7 @@ publishdate: 2018-06-11
archivedate: 2018-07-11
---
-
+
For encrypted communication between the client and the load balancer, you need to specify a TLS private key and certificate to be used by the ingress controller.
diff --git a/website/blog/2018/06/06.11-anti-patterns.md b/website/blog/2018/06/06.11-anti-patterns.md
index b66434e59..bc043f9fe 100644
--- a/website/blog/2018/06/06.11-anti-patterns.md
+++ b/website/blog/2018/06/06.11-anti-patterns.md
@@ -10,7 +10,7 @@ tags:
- technical-deep-dive
- node-management
---
-
+
## Running as Root User
diff --git a/website/blog/2018/06/06.11-big-things-come-in-small-packages.md b/website/blog/2018/06/06.11-big-things-come-in-small-packages.md
index fe8fb4912..3214c99e8 100644
--- a/website/blog/2018/06/06.11-big-things-come-in-small-packages.md
+++ b/website/blog/2018/06/06.11-big-things-come-in-small-packages.md
@@ -15,7 +15,7 @@ Switching your architecture from a monolith to microservices has many advantages
## General Purpose Technology Stack
-
+
There is a tendency to be more generalized in development and to apply this pattern to all services. One feels that a homogeneous image of the technology stack is good if it is the same for all services.
@@ -25,6 +25,6 @@ One forgets, however, that a large percentage of the integrated infrastructure i
Due to the lightweight nature of your service, you can run more containers on a physical server and virtual machines. The result is higher resource utilization.
-
+
Additionally, microservices are developed and deployed as containers independently of each another. This means that a development team can develop, optimize, and deploy a microservice without impacting other subsystems.
diff --git a/website/blog/2018/06/06.11-kubernetes-is-available-in-docker-for-mac-17-12-ce.md b/website/blog/2018/06/06.11-kubernetes-is-available-in-docker-for-mac-17-12-ce.md
index fe2191270..7dc561f64 100644
--- a/website/blog/2018/06/06.11-kubernetes-is-available-in-docker-for-mac-17-12-ce.md
+++ b/website/blog/2018/06/06.11-kubernetes-is-available-in-docker-for-mac-17-12-ce.md
@@ -12,7 +12,7 @@ tags:
-
+
|
diff --git a/website/blog/2018/06/06.11-namespace-isolation.md b/website/blog/2018/06/06.11-namespace-isolation.md
index c58b8d3a3..6af10d0c4 100644
--- a/website/blog/2018/06/06.11-namespace-isolation.md
+++ b/website/blog/2018/06/06.11-namespace-isolation.md
@@ -18,6 +18,6 @@ You can configure a **NetworkPolicy** to deny all traffic from other namespaces
- Regulatory compliance
- Ensure containers assigned to different environments (e.g. dev/staging/prod) cannot interfere with each another
-
+
Learn more on [Namespace Isolation](https://github.com/gardener/documentation/blob/master/website/documentation/guides/applications/network-isolation.md).
diff --git a/website/blog/2018/06/06.11-readwritemany-dynamically-provisioned-persistent-volumes-using-amazon-efs.md b/website/blog/2018/06/06.11-readwritemany-dynamically-provisioned-persistent-volumes-using-amazon-efs.md
index 33b8e02f2..2ecacca4b 100644
--- a/website/blog/2018/06/06.11-readwritemany-dynamically-provisioned-persistent-volumes-using-amazon-efs.md
+++ b/website/blog/2018/06/06.11-readwritemany-dynamically-provisioned-persistent-volumes-using-amazon-efs.md
@@ -14,7 +14,7 @@ tags:
The efs-provisioner allows you to mount EFS storage as PersistentVolumes in Kubernetes. It consists of a container that has access to an AWS EFS resource. The container reads a configmap containing the EFS filesystem ID, the AWS region and the name identifying the efs-provisioner. This name will be used later when you create a storage class.
-
+
## Why EFS
diff --git a/website/blog/2018/06/06.11-shared-storage-with-s3-backend.md b/website/blog/2018/06/06.11-shared-storage-with-s3-backend.md
index 3a2299ffd..64794e24d 100644
--- a/website/blog/2018/06/06.11-shared-storage-with-s3-backend.md
+++ b/website/blog/2018/06/06.11-shared-storage-with-s3-backend.md
@@ -15,7 +15,7 @@ The storage is definitely the most complex and important part of an application
Mounting an S3 bucket into a pod using [FUSE](https://github.com/libfuse/libfuse) allows you to access data stored in S3 via the filesystem. The mount is a pointer to an S3 location, so the data is never synced locally. Once mounted, any pod can read or even write from that directory without the need for explicit keys.
-
+
Additionally, it can be used to import and parse large amounts of data into a database.
diff --git a/website/blog/2018/06/06.11-watching-logs-of-several-pods.md b/website/blog/2018/06/06.11-watching-logs-of-several-pods.md
index 6ec1eddb8..8adce5fb5 100644
--- a/website/blog/2018/06/06.11-watching-logs-of-several-pods.md
+++ b/website/blog/2018/06/06.11-watching-logs-of-several-pods.md
@@ -13,6 +13,6 @@ One thing that always bothered me was that I couldn't get the logs of several po
This is something you really need a lot, at least if you run several instances of a pod behind a `deployment`and you don't have a log viewer service like Kibana set up.
-
+
In that case, kubetail comes to the rescue. It is a small bash script that allows you to aggregate the log files of several pods at the same time in a simple way. The script is called `kubetail` and is available at [GitHub](https://github.com/johanhaleby/kubetail).
diff --git a/website/blog/2018/06/images/blog-antipattern.png b/website/blog/2018/06/images/blog-antipattern.png
deleted file mode 100644
index 8b45098ea..000000000
Binary files a/website/blog/2018/06/images/blog-antipattern.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-antipattern.webp b/website/blog/2018/06/images/blog-antipattern.webp
new file mode 100644
index 000000000..02d6e2751
Binary files /dev/null and b/website/blog/2018/06/images/blog-antipattern.webp differ
diff --git a/website/blog/2018/06/images/blog-aws-efs.png b/website/blog/2018/06/images/blog-aws-efs.png
deleted file mode 100644
index 9fd2f2069..000000000
Binary files a/website/blog/2018/06/images/blog-aws-efs.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-aws-efs.webp b/website/blog/2018/06/images/blog-aws-efs.webp
new file mode 100644
index 000000000..3b4528572
Binary files /dev/null and b/website/blog/2018/06/images/blog-aws-efs.webp differ
diff --git a/website/blog/2018/06/images/blog-https.png b/website/blog/2018/06/images/blog-https.png
deleted file mode 100644
index 8c8a286ee..000000000
Binary files a/website/blog/2018/06/images/blog-https.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-https.webp b/website/blog/2018/06/images/blog-https.webp
new file mode 100644
index 000000000..989c1065b
Binary files /dev/null and b/website/blog/2018/06/images/blog-https.webp differ
diff --git a/website/blog/2018/06/images/blog-kubernetes-enable.png b/website/blog/2018/06/images/blog-kubernetes-enable.png
deleted file mode 100644
index 72a102871..000000000
Binary files a/website/blog/2018/06/images/blog-kubernetes-enable.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-kubernetes-enable.webp b/website/blog/2018/06/images/blog-kubernetes-enable.webp
new file mode 100644
index 000000000..4e93b46b2
Binary files /dev/null and b/website/blog/2018/06/images/blog-kubernetes-enable.webp differ
diff --git a/website/blog/2018/06/images/blog-kubetail.png b/website/blog/2018/06/images/blog-kubetail.png
deleted file mode 100644
index 4c49d99dd..000000000
Binary files a/website/blog/2018/06/images/blog-kubetail.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-kubetail.webp b/website/blog/2018/06/images/blog-kubetail.webp
new file mode 100644
index 000000000..3c84874da
Binary files /dev/null and b/website/blog/2018/06/images/blog-kubetail.webp differ
diff --git a/website/blog/2018/06/images/blog-namespaceisolation.png b/website/blog/2018/06/images/blog-namespaceisolation.png
deleted file mode 100644
index f236c7872..000000000
Binary files a/website/blog/2018/06/images/blog-namespaceisolation.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-namespaceisolation.webp b/website/blog/2018/06/images/blog-namespaceisolation.webp
new file mode 100644
index 000000000..3ae76cbdc
Binary files /dev/null and b/website/blog/2018/06/images/blog-namespaceisolation.webp differ
diff --git a/website/blog/2018/06/images/blog-s3-shared-storage.png b/website/blog/2018/06/images/blog-s3-shared-storage.png
deleted file mode 100644
index 3f80b6b5b..000000000
Binary files a/website/blog/2018/06/images/blog-s3-shared-storage.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-s3-shared-storage.webp b/website/blog/2018/06/images/blog-s3-shared-storage.webp
new file mode 100644
index 000000000..774744179
Binary files /dev/null and b/website/blog/2018/06/images/blog-s3-shared-storage.webp differ
diff --git a/website/blog/2018/06/images/blog-service-common-stack.png b/website/blog/2018/06/images/blog-service-common-stack.png
deleted file mode 100644
index 187402452..000000000
Binary files a/website/blog/2018/06/images/blog-service-common-stack.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-service-common-stack.webp b/website/blog/2018/06/images/blog-service-common-stack.webp
new file mode 100644
index 000000000..32d11ab9f
Binary files /dev/null and b/website/blog/2018/06/images/blog-service-common-stack.webp differ
diff --git a/website/blog/2018/06/images/blog-service-service-stack.png b/website/blog/2018/06/images/blog-service-service-stack.png
deleted file mode 100644
index e4b0ca34f..000000000
Binary files a/website/blog/2018/06/images/blog-service-service-stack.png and /dev/null differ
diff --git a/website/blog/2018/06/images/blog-service-service-stack.webp b/website/blog/2018/06/images/blog-service-service-stack.webp
new file mode 100644
index 000000000..6d6dd11fe
Binary files /dev/null and b/website/blog/2018/06/images/blog-service-service-stack.webp differ
diff --git a/website/blog/2019/06/images/teaser-1.png b/website/blog/2019/06/images/teaser-1.png
deleted file mode 100644
index 0d0b12a8a..000000000
Binary files a/website/blog/2019/06/images/teaser-1.png and /dev/null differ
diff --git a/website/blog/2019/06/images/teaser-1.webp b/website/blog/2019/06/images/teaser-1.webp
new file mode 100644
index 000000000..be1c1697c
Binary files /dev/null and b/website/blog/2019/06/images/teaser-1.webp differ
diff --git a/website/blog/2019/06/images/teaser-2.png b/website/blog/2019/06/images/teaser-2.png
deleted file mode 100644
index ad4579b9d..000000000
Binary files a/website/blog/2019/06/images/teaser-2.png and /dev/null differ
diff --git a/website/blog/2019/06/images/teaser-2.webp b/website/blog/2019/06/images/teaser-2.webp
new file mode 100644
index 000000000..a1e0076a8
Binary files /dev/null and b/website/blog/2019/06/images/teaser-2.webp differ
diff --git a/website/blog/2020/05/05.11-new-website-same-green-flower.md b/website/blog/2020/05/05.11-new-website-same-green-flower.md
index c2dbaf9e5..ef05a942b 100644
--- a/website/blog/2020/05/05.11-new-website-same-green-flower.md
+++ b/website/blog/2020/05/05.11-new-website-same-green-flower.md
@@ -31,5 +31,5 @@ I hope you will like it. Let us know what you think about it. Feel free to leave
**Go ahead and help us spread the word: https://gardener.cloud**
-
+
diff --git a/website/blog/2020/05/images/website-screen-L.png b/website/blog/2020/05/images/website-screen-L.png
deleted file mode 100644
index 65e7c07e8..000000000
Binary files a/website/blog/2020/05/images/website-screen-L.png and /dev/null differ
diff --git a/website/blog/2020/05/images/website-screen-l.webp b/website/blog/2020/05/images/website-screen-l.webp
new file mode 100644
index 000000000..dcdf78468
Binary files /dev/null and b/website/blog/2020/05/images/website-screen-l.webp differ
diff --git a/website/blog/2020/05/images/website-screen.png b/website/blog/2020/05/images/website-screen.png
deleted file mode 100644
index 19f180154..000000000
Binary files a/website/blog/2020/05/images/website-screen.png and /dev/null differ
diff --git a/website/blog/2020/05/images/website-screen.webp b/website/blog/2020/05/images/website-screen.webp
new file mode 100644
index 000000000..9380285d5
Binary files /dev/null and b/website/blog/2020/05/images/website-screen.webp differ
diff --git a/website/blog/2020/10/10.19-gardener-integrates-with-kubevirt.md b/website/blog/2020/10/10.19-gardener-integrates-with-kubevirt.md
index e098e1093..5dbfb1d3d 100644
--- a/website/blog/2020/10/10.19-gardener-integrates-with-kubevirt.md
+++ b/website/blog/2020/10/10.19-gardener-integrates-with-kubevirt.md
@@ -29,21 +29,21 @@ Gardener enables Kubernetes consumers to centralize and operate efficiently homo
Gardener is based on the idea of three types of clusters – *Garden cluster*, *Seed cluster* and *Shoot cluster* (see **Figure 1**). The Garden cluster is used to control the entire Kubernetes environment centrally in a highly scalable design. The highly available seed clusters are used to host the end users (shoot) clusters’ control planes. Finally, the shoot clusters consist only of worker nodes to host the cloud native applications.
-
+
+
+
+
+
+
+
+
+
+
+
In a [community call](https://www.youtube.com/watch?v=pGlHpJle7Zk) last summer, we gave an overview of what we are building:
diff --git a/website/blog/2021/02/images/gardener-01.png b/website/blog/2021/02/images/gardener-01.png
deleted file mode 100644
index 979ed5fa9..000000000
Binary files a/website/blog/2021/02/images/gardener-01.png and /dev/null differ
diff --git a/website/blog/2021/02/images/gardener-01.webp b/website/blog/2021/02/images/gardener-01.webp
new file mode 100644
index 000000000..fa53e3d96
Binary files /dev/null and b/website/blog/2021/02/images/gardener-01.webp differ
diff --git a/website/blog/2021/02/images/gardener-02.png b/website/blog/2021/02/images/gardener-02.png
deleted file mode 100644
index a4f92f1bc..000000000
Binary files a/website/blog/2021/02/images/gardener-02.png and /dev/null differ
diff --git a/website/blog/2021/02/images/gardener-02.webp b/website/blog/2021/02/images/gardener-02.webp
new file mode 100644
index 000000000..174006780
Binary files /dev/null and b/website/blog/2021/02/images/gardener-02.webp differ
diff --git a/website/blog/2021/02/images/gardener-03.png b/website/blog/2021/02/images/gardener-03.png
deleted file mode 100644
index ac06b08ef..000000000
Binary files a/website/blog/2021/02/images/gardener-03.png and /dev/null differ
diff --git a/website/blog/2021/02/images/gardener-03.webp b/website/blog/2021/02/images/gardener-03.webp
new file mode 100644
index 000000000..4b36fc7bb
Binary files /dev/null and b/website/blog/2021/02/images/gardener-03.webp differ
diff --git a/website/blog/2024/04/04-05-kubecon-cloudnativecon-europe-2024-highlights.md b/website/blog/2024/04/04-05-kubecon-cloudnativecon-europe-2024-highlights.md
index ed6338e95..179d2de26 100644
--- a/website/blog/2024/04/04-05-kubecon-cloudnativecon-europe-2024-highlights.md
+++ b/website/blog/2024/04/04-05-kubecon-cloudnativecon-europe-2024-highlights.md
@@ -12,7 +12,7 @@ tags:
- community-event
- security
---
-
+
KubeCon + CloudNativeCon Europe 2024, recently held in Paris, was a testament to the robustness of the open-source community and its pivotal role in driving advancements in AI and cloud-native technologies. With a record attendance of over +12,000 participants, the conference underscored the ubiquity of cloud-native architectures and the business opportunities they provide.
diff --git a/website/blog/2024/04/04-22-gardener's-registry-cache-extension-another-cost-saving-win-and-more.md b/website/blog/2024/04/04-22-gardener's-registry-cache-extension-another-cost-saving-win-and-more.md
index f45070dec..c2a6edba8 100644
--- a/website/blog/2024/04/04-22-gardener's-registry-cache-extension-another-cost-saving-win-and-more.md
+++ b/website/blog/2024/04/04-22-gardener's-registry-cache-extension-another-cost-saving-win-and-more.md
@@ -34,7 +34,7 @@ A pull-through cache registry is a registry that caches container images in its
Imagine that you have a DaemonSet in your Kubernetes cluster. In a cluster without a pull-through cache, every Node must pull the same container image from the upstream registry. In a cluster with a pull-through cache, the image is pulled once from the upstream registry and served later for all Nodes.
-
+
A Shoot cluster setup with a registry cache for Docker Hub (docker.io). diff --git a/website/blog/2024/04/images/kubecon-eu2024.png b/website/blog/2024/04/images/kubecon-eu2024.png deleted file mode 100644 index 72e4ae534..000000000 Binary files a/website/blog/2024/04/images/kubecon-eu2024.png and /dev/null differ diff --git a/website/blog/2024/04/images/kubecon-eu2024.webp b/website/blog/2024/04/images/kubecon-eu2024.webp new file mode 100644 index 000000000..4af4b3da6 Binary files /dev/null and b/website/blog/2024/04/images/kubecon-eu2024.webp differ diff --git a/website/blog/2024/04/images/shoot-cluster-with-registry-cache.png b/website/blog/2024/04/images/shoot-cluster-with-registry-cache.png deleted file mode 100644 index 5d22c66ee..000000000 Binary files a/website/blog/2024/04/images/shoot-cluster-with-registry-cache.png and /dev/null differ diff --git a/website/blog/2024/04/images/shoot-cluster-with-registry-cache.webp b/website/blog/2024/04/images/shoot-cluster-with-registry-cache.webp new file mode 100644 index 000000000..f82b5edc6 Binary files /dev/null and b/website/blog/2024/04/images/shoot-cluster-with-registry-cache.webp differ diff --git a/website/blog/2025/06/06-17-taking-gardener-to-the-next-level-highlights-from-the-7th-gardener-community-hackathon-in-schelklingen.md b/website/blog/2025/06/06-17-taking-gardener-to-the-next-level-highlights-from-the-7th-gardener-community-hackathon-in-schelklingen.md index 1894cdfa0..d269eaf48 100644 --- a/website/blog/2025/06/06-17-taking-gardener-to-the-next-level-highlights-from-the-7th-gardener-community-hackathon-in-schelklingen.md +++ b/website/blog/2025/06/06-17-taking-gardener-to-the-next-level-highlights-from-the-7th-gardener-community-hackathon-in-schelklingen.md @@ -19,7 +19,7 @@ The latest "Hack The Garden" event, held in June 2025 at [Schlosshof in Schelkli The hackathon focused on a wide array of topics aimed at enhancing Gardener's capabilities, modernizing its stack, and improving user experience. You can find a [full summary of all topics on GitHub](https://github.com/gardener-community/hackathon/blob/main/2025-06_Schelklingen/README.md) and watch the [wrap-up presentations on YouTube](https://youtu.be/TCLXovw43HA). - + Here's a look at some of the key achievements and ongoing efforts: diff --git a/website/blog/2025/06/06-30-getting-started-with-opentelemetry-on-gardener-shoot-cluster.md b/website/blog/2025/06/06-30-getting-started-with-opentelemetry-on-gardener-shoot-cluster.md index 8c3636c41..dfbfdb79d 100644 --- a/website/blog/2025/06/06-30-getting-started-with-opentelemetry-on-gardener-shoot-cluster.md +++ b/website/blog/2025/06/06-30-getting-started-with-opentelemetry-on-gardener-shoot-cluster.md @@ -29,13 +29,13 @@ To follow along with this guide, you will need: ## Component Overview of the Sample OpenTelemetry Stack - + ## Setting Up a Gardener Shoot for mTLS Certificate Management Here we use a self managed mTLS architecture with an illustration purpose. In a production environment, you would typically use a managed certificate authority (CA) or a service mesh to handle mTLS certificates and encryption. However, there might be cases where you want to have flexibility in authentication and authorization mechanisms, for example, by leveraging Kubernetes RBAC to determine whether a service is authorized to connect to a backend or not. In our illustration, we will use a `kube-rbac-proxy` as a sidecar to the backends, to enforce the mTLS authentication and authorization. The `kube-rbac-proxy` is a reverse proxy that uses Kubernetes RBAC to control access to services, allowing us to define fine-grained access control policies. - + The `kube-rbac-proxy` extracts the identity of the client (OpenTelemetry collector) from the CommonName (CN) field of the TLS certificate and uses it to perform authorization checks against the Kubernetes API server. This enables fine-grained access control policies based on client identity, ensuring that only authorized clients can connect to the backends. @@ -167,7 +167,7 @@ In this example, we use 2 receivers: - [k8s_cluster receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/k8sclusterreceiver) to collect Kubernetes cluster metrics. Here is an example of Kubernetes events persited in the `victoria-logs` backend. It filters logs which represents events from `kube-system` namesapce related to a rollout restart of the target statefulset. Then it formats the UI to show the event reason and object name. - + The collector features few important configurations related to reliability and performance. The collected metrics points are are sent in batches to the Prometheus backend using the corresponding OTLP exporter and the memory consumption of the collector is also limited. In general, it is always a good practice to set a memory limiter and batch processing in the collector pipeline. @@ -285,7 +285,7 @@ transform/metrics: ``` Here is a visualization of `container_network_transmit_bytes_total` metric collected from the `cadvisor` endpoint of the `kubelet` service, showing the network traffic in bytes transmitted by the `vpn-shoot` containers. - + Similarly to the `k8s-events` collector, the `shoot-metrics` collector also emits its own telemetry data, including metrics and logs. The collector is configured to push its own metrics to the Prometheus backend using the `periodic` reader, avoiding the need for a separate Prometheus scrape configuration. It requires a corresponding set of permissions defined at [shoot-metrics rbac](./manifests/otel-collectors/shoot-metrics-rbac.yaml) manifest. diff --git a/website/blog/2025/06/images/group-picture.png b/website/blog/2025/06/images/group-picture.png deleted file mode 100644 index d445e0729..000000000 Binary files a/website/blog/2025/06/images/group-picture.png and /dev/null differ diff --git a/website/blog/2025/06/images/group-picture.webp b/website/blog/2025/06/images/group-picture.webp new file mode 100644 index 000000000..9d44c7daa Binary files /dev/null and b/website/blog/2025/06/images/group-picture.webp differ diff --git a/website/blog/2025/06/images/otel-gardener-shoot.png b/website/blog/2025/06/images/otel-gardener-shoot.png deleted file mode 100644 index 4d4803c0f..000000000 Binary files a/website/blog/2025/06/images/otel-gardener-shoot.png and /dev/null differ diff --git a/website/blog/2025/06/images/otel-gardener-shoot.webp b/website/blog/2025/06/images/otel-gardener-shoot.webp new file mode 100644 index 000000000..9ef5c5e08 Binary files /dev/null and b/website/blog/2025/06/images/otel-gardener-shoot.webp differ diff --git a/website/blog/2025/06/images/otel-mtls-kube-rbac-proxy.png b/website/blog/2025/06/images/otel-mtls-kube-rbac-proxy.png deleted file mode 100644 index 38e81de5d..000000000 Binary files a/website/blog/2025/06/images/otel-mtls-kube-rbac-proxy.png and /dev/null differ diff --git a/website/blog/2025/06/images/otel-mtls-kube-rbac-proxy.webp b/website/blog/2025/06/images/otel-mtls-kube-rbac-proxy.webp new file mode 100644 index 000000000..cbb0f65e0 Binary files /dev/null and b/website/blog/2025/06/images/otel-mtls-kube-rbac-proxy.webp differ diff --git a/website/blog/2025/06/images/otel-prometheus.png b/website/blog/2025/06/images/otel-prometheus.png deleted file mode 100644 index d312e584f..000000000 Binary files a/website/blog/2025/06/images/otel-prometheus.png and /dev/null differ diff --git a/website/blog/2025/06/images/otel-prometheus.webp b/website/blog/2025/06/images/otel-prometheus.webp new file mode 100644 index 000000000..609a344ba Binary files /dev/null and b/website/blog/2025/06/images/otel-prometheus.webp differ diff --git a/website/blog/2025/06/images/otel-victoria-logs.png b/website/blog/2025/06/images/otel-victoria-logs.png deleted file mode 100644 index bd657ecb6..000000000 Binary files a/website/blog/2025/06/images/otel-victoria-logs.png and /dev/null differ diff --git a/website/blog/2025/06/images/otel-victoria-logs.webp b/website/blog/2025/06/images/otel-victoria-logs.webp new file mode 100644 index 000000000..b30e36b0a Binary files /dev/null and b/website/blog/2025/06/images/otel-victoria-logs.webp differ diff --git a/website/blog/2025/08/08-13-keeping-track-of-your-resources-with-inventory.md b/website/blog/2025/08/08-13-keeping-track-of-your-resources-with-inventory.md index 1d0e859e3..3a7b9659f 100644 --- a/website/blog/2025/08/08-13-keeping-track-of-your-resources-with-inventory.md +++ b/website/blog/2025/08/08-13-keeping-track-of-your-resources-with-inventory.md @@ -181,7 +181,7 @@ First, we will configure Inventory and grant it access to our Gardener Project. In order to do that, navigate to the Gardener Dashboard, select your project and go to the `Members` section. Then add a new service account. - + After the service account has been created, you should download its `kubeconfig`, which we will configure in the next step. This snippet represents @@ -477,7 +477,7 @@ also comes with a [pgadmin](https://www.pgadmin.org/) service, which you can use to query and inspect the schema, which is handy when you need to familiarize yourself with the existing schema. - + In order to get better insights of the data collected by Inventory, you can connect your Inventory database with [Metabase](https://www.metabase.com/), @@ -497,23 +497,23 @@ about its inner workings, which can be scraped, for example, by The following screenshot shows a summary of some of the data collected from a Gardener landscape. - + This screenshot here displays a map of resources identified by Inventory as being orphaned. - + And here we can see some of the `worker` metrics, showing us information about the AWS-related tasks. - + Hooking up Inventory with your alerting system allows for early notification of orphan resources as soon as they are being discovered. Here we can see Inventory posting an alert about orphan EC2 instances in Slack. - + Ever since our team started using Inventory to track our hyperscaler resources, we have identified a significant number of virtual machines @@ -525,7 +525,7 @@ Reserved, but unused public IP addresses are also part of resources which we are actively tracking, and we've discovered more than a hundred public IPs in one of our environments, which we've cleaned up well. - + Inventory helped with keeping our garden clean and cut some cloud costs. diff --git a/website/blog/2025/08/images/inventory/aws-leaked-map.png b/website/blog/2025/08/images/inventory/aws-leaked-map.png deleted file mode 100644 index f6e86d98c..000000000 Binary files a/website/blog/2025/08/images/inventory/aws-leaked-map.png and /dev/null differ diff --git a/website/blog/2025/08/images/inventory/aws-leaked-map.webp b/website/blog/2025/08/images/inventory/aws-leaked-map.webp new file mode 100644 index 000000000..e3b98af5c Binary files /dev/null and b/website/blog/2025/08/images/inventory/aws-leaked-map.webp differ diff --git a/website/blog/2025/08/images/inventory/aws-schema.png b/website/blog/2025/08/images/inventory/aws-schema.png deleted file mode 100644 index 93c270981..000000000 Binary files a/website/blog/2025/08/images/inventory/aws-schema.png and /dev/null differ diff --git a/website/blog/2025/08/images/inventory/aws-schema.webp b/website/blog/2025/08/images/inventory/aws-schema.webp new file mode 100644 index 000000000..a1d7d82f4 Binary files /dev/null and b/website/blog/2025/08/images/inventory/aws-schema.webp differ diff --git a/website/blog/2025/08/images/inventory/gardener-stats.png b/website/blog/2025/08/images/inventory/gardener-stats.png deleted file mode 100644 index 83e706c05..000000000 Binary files a/website/blog/2025/08/images/inventory/gardener-stats.png and /dev/null differ diff --git a/website/blog/2025/08/images/inventory/gardener-stats.webp b/website/blog/2025/08/images/inventory/gardener-stats.webp new file mode 100644 index 000000000..c779d54c0 Binary files /dev/null and b/website/blog/2025/08/images/inventory/gardener-stats.webp differ diff --git a/website/blog/2025/08/images/inventory/inventory-sa.png b/website/blog/2025/08/images/inventory/inventory-sa.png deleted file mode 100644 index 07e263e24..000000000 Binary files a/website/blog/2025/08/images/inventory/inventory-sa.png and /dev/null differ diff --git a/website/blog/2025/08/images/inventory/inventory-sa.webp b/website/blog/2025/08/images/inventory/inventory-sa.webp new file mode 100644 index 000000000..814641884 Binary files /dev/null and b/website/blog/2025/08/images/inventory/inventory-sa.webp differ diff --git a/website/blog/2025/08/images/inventory/lbs-ips.png b/website/blog/2025/08/images/inventory/lbs-ips.png deleted file mode 100644 index 81b356a4a..000000000 Binary files a/website/blog/2025/08/images/inventory/lbs-ips.png and /dev/null differ diff --git a/website/blog/2025/08/images/inventory/lbs-ips.webp b/website/blog/2025/08/images/inventory/lbs-ips.webp new file mode 100644 index 000000000..d424b21ec Binary files /dev/null and b/website/blog/2025/08/images/inventory/lbs-ips.webp differ diff --git a/website/blog/2025/08/images/inventory/slack-alert.png b/website/blog/2025/08/images/inventory/slack-alert.png deleted file mode 100644 index 4072c16b6..000000000 Binary files a/website/blog/2025/08/images/inventory/slack-alert.png and /dev/null differ diff --git a/website/blog/2025/08/images/inventory/slack-alert.webp b/website/blog/2025/08/images/inventory/slack-alert.webp new file mode 100644 index 000000000..6108d2e13 Binary files /dev/null and b/website/blog/2025/08/images/inventory/slack-alert.webp differ diff --git a/website/blog/2025/08/images/inventory/worker-metrics.png b/website/blog/2025/08/images/inventory/worker-metrics.png deleted file mode 100644 index f254ccd20..000000000 Binary files a/website/blog/2025/08/images/inventory/worker-metrics.png and /dev/null differ diff --git a/website/blog/2025/08/images/inventory/worker-metrics.webp b/website/blog/2025/08/images/inventory/worker-metrics.webp new file mode 100644 index 000000000..e86b5f919 Binary files /dev/null and b/website/blog/2025/08/images/inventory/worker-metrics.webp differ diff --git a/website/community/hackathons/2025-06.md b/website/community/hackathons/2025-06.md index b55b64f54..c5faa06e5 100644 --- a/website/community/hackathons/2025-06.md +++ b/website/community/hackathons/2025-06.md @@ -11,7 +11,7 @@ weight: -202506 - 📘 **Topics:** https://hackmd.io/ugrWYptbRAi9NPi78G-B9g - 🎤 **Review Meeting Summary:** https://gardener.cloud/community/review-meetings/2025-reviews/#_2025-06-11-hack-the-garden-wrap-up - + ## ⚡️ Replace OpenVPN with Wireguard @@ -84,9 +84,9 @@ The OpenTelemetry collector instance can be configured to filter and fine tune t Introducing OpenTelemetry collector on shoot nodes is now part of the implementation plan for Observability 2.0. The community is invited to participate in this or any future initiative part of Gardener Observability 2.0 concept. - + - + ## 🔬 Cluster Network Observability @@ -112,7 +112,7 @@ https://github.com/microsoft/retina/issues/1654 **Code/Pull Requests:** https://github.com/microsoft/retina/pull/1657 - + ## 📝 Signing of `ManagedResource` Secrets diff --git a/website/community/hackathons/2025-07.md b/website/community/hackathons/2025-07.md index db8aeacf5..c2de53758 100644 --- a/website/community/hackathons/2025-07.md +++ b/website/community/hackathons/2025-07.md @@ -10,7 +10,7 @@ weight: -202507 - 👤 **Organizer:** [SAP](https://www.sap.com/) - 📘 **Topics:** / - + ## 🛡️ Viewer kubeconfigs expose requestor's identity (potential privilege leak) diff --git a/website/community/hackathons/2025-11.md b/website/community/hackathons/2025-11.md index bd17e4a0a..2ec52f9a4 100644 --- a/website/community/hackathons/2025-11.md +++ b/website/community/hackathons/2025-11.md @@ -250,7 +250,7 @@ Although we will not continue with this after the hackathon, this artifact can s * Hollow `gardenlet` WIP implementation: [acumino/gardener#hollow-gardenlet](https://github.com/acumino/gardener/tree/hollow-gardenlet) - + ## ❤️🩹 `force-restore` Operation Annotation For `Shoot`s @@ -331,7 +331,7 @@ user 64m51.059s sys 6m42.249s ``` - + ### kind e2e tests with cache @@ -341,7 +341,7 @@ user 2m33.118s sys 1m0.021s ``` - + ## 🛠️ MCM: Update Machines Updates During In-Place Updates diff --git a/website/community/hackathons/2026-05.md b/website/community/hackathons/2026-05.md index 134fbc041..88e9c6321 100644 --- a/website/community/hackathons/2026-05.md +++ b/website/community/hackathons/2026-05.md @@ -13,7 +13,7 @@ outline: 2 - 🎤 **Review Meeting Summary:** https://gardener.cloud/community/review-meetings/2026-reviews/#_2026-05-13-hack-the-garden-wrap-up
-
diff --git a/website/community/hackathons/images/2023-05/masterful-shoot/MasterfulShoot.png b/website/community/hackathons/images/2023-05/masterful-shoot/MasterfulShoot.png
deleted file mode 100644
index 4b2fa3f9a..000000000
Binary files a/website/community/hackathons/images/2023-05/masterful-shoot/MasterfulShoot.png and /dev/null differ
diff --git a/website/community/hackathons/images/2023-05/masterful-shoot/MasterfulShoot.webp b/website/community/hackathons/images/2023-05/masterful-shoot/MasterfulShoot.webp
new file mode 100644
index 000000000..cf32556fb
Binary files /dev/null and b/website/community/hackathons/images/2023-05/masterful-shoot/MasterfulShoot.webp differ
diff --git a/website/community/hackathons/images/2023-11/gardener-operator-deploys-gardenlet/gardenlet-via-gardener-operator.png b/website/community/hackathons/images/2023-11/gardener-operator-deploys-gardenlet/gardenlet-via-gardener-operator.png
deleted file mode 100644
index d3c13e45f..000000000
Binary files a/website/community/hackathons/images/2023-11/gardener-operator-deploys-gardenlet/gardenlet-via-gardener-operator.png and /dev/null differ
diff --git a/website/community/hackathons/images/2023-11/gardener-operator-deploys-gardenlet/gardenlet-via-gardener-operator.webp b/website/community/hackathons/images/2023-11/gardener-operator-deploys-gardenlet/gardenlet-via-gardener-operator.webp
new file mode 100644
index 000000000..237888e79
Binary files /dev/null and b/website/community/hackathons/images/2023-11/gardener-operator-deploys-gardenlet/gardenlet-via-gardener-operator.webp differ
diff --git a/website/community/hackathons/images/2025-06.png b/website/community/hackathons/images/2025-06.png
deleted file mode 100644
index d445e0729..000000000
Binary files a/website/community/hackathons/images/2025-06.png and /dev/null differ
diff --git a/website/community/hackathons/images/2025-06.webp b/website/community/hackathons/images/2025-06.webp
new file mode 100644
index 000000000..9d44c7daa
Binary files /dev/null and b/website/community/hackathons/images/2025-06.webp differ
diff --git a/website/community/hackathons/images/2025-06/cluster-network-observability/prometheus-traffic-chart.png b/website/community/hackathons/images/2025-06/cluster-network-observability/prometheus-traffic-chart.png
deleted file mode 100644
index 26a233cb2..000000000
Binary files a/website/community/hackathons/images/2025-06/cluster-network-observability/prometheus-traffic-chart.png and /dev/null differ
diff --git a/website/community/hackathons/images/2025-06/cluster-network-observability/prometheus-traffic-chart.webp b/website/community/hackathons/images/2025-06/cluster-network-observability/prometheus-traffic-chart.webp
new file mode 100644
index 000000000..fa6127b32
Binary files /dev/null and b/website/community/hackathons/images/2025-06/cluster-network-observability/prometheus-traffic-chart.webp differ
diff --git a/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/otel-flow.png b/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/otel-flow.png
deleted file mode 100644
index 014bdb175..000000000
Binary files a/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/otel-flow.png and /dev/null differ
diff --git a/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/otel-flow.webp b/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/otel-flow.webp
new file mode 100644
index 000000000..b02469759
Binary files /dev/null and b/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/otel-flow.webp differ
diff --git a/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/prometheus-chart.png b/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/prometheus-chart.png
deleted file mode 100644
index fc81c0a94..000000000
Binary files a/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/prometheus-chart.png and /dev/null differ
diff --git a/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/prometheus-chart.webp b/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/prometheus-chart.webp
new file mode 100644
index 000000000..e1ac520af
Binary files /dev/null and b/website/community/hackathons/images/2025-06/otel-transport-shoot-metrics/prometheus-chart.webp differ
diff --git a/website/community/hackathons/images/2025-07.png b/website/community/hackathons/images/2025-07.png
deleted file mode 100644
index a5bbdeead..000000000
Binary files a/website/community/hackathons/images/2025-07.png and /dev/null differ
diff --git a/website/community/hackathons/images/2025-07.webp b/website/community/hackathons/images/2025-07.webp
new file mode 100644
index 000000000..6eaaaf917
Binary files /dev/null and b/website/community/hackathons/images/2025-07.webp differ
diff --git a/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-with-cache.png b/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-with-cache.png
deleted file mode 100644
index db0a166b8..000000000
Binary files a/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-with-cache.png and /dev/null differ
diff --git a/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-with-cache.webp b/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-with-cache.webp
new file mode 100644
index 000000000..e6ba285bb
Binary files /dev/null and b/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-with-cache.webp differ
diff --git a/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-without-cache.png b/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-without-cache.png
deleted file mode 100644
index e96e28548..000000000
Binary files a/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-without-cache.png and /dev/null differ
diff --git a/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-without-cache.webp b/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-without-cache.webp
new file mode 100644
index 000000000..677fc2b91
Binary files /dev/null and b/website/community/hackathons/images/2025-11/prow-go-build-cache/prow-without-cache.webp differ
diff --git a/website/community/hackathons/images/2025-11/scale-out-tests/concept.png b/website/community/hackathons/images/2025-11/scale-out-tests/concept.png
deleted file mode 100644
index b03264ea3..000000000
Binary files a/website/community/hackathons/images/2025-11/scale-out-tests/concept.png and /dev/null differ
diff --git a/website/community/hackathons/images/2025-11/scale-out-tests/concept.webp b/website/community/hackathons/images/2025-11/scale-out-tests/concept.webp
new file mode 100644
index 000000000..a7513c51a
Binary files /dev/null and b/website/community/hackathons/images/2025-11/scale-out-tests/concept.webp differ
diff --git a/website/community/hackathons/images/2026-05_1.png b/website/community/hackathons/images/2026-05_1.png
deleted file mode 100644
index 1d7b13490..000000000
Binary files a/website/community/hackathons/images/2026-05_1.png and /dev/null differ
diff --git a/website/community/hackathons/images/2026-05_1.webp b/website/community/hackathons/images/2026-05_1.webp
new file mode 100644
index 000000000..3346aaf66
Binary files /dev/null and b/website/community/hackathons/images/2026-05_1.webp differ
diff --git a/website/contribute/contribution-process/images/cicd-overview.png b/website/contribute/contribution-process/images/cicd-overview.png
deleted file mode 100644
index c619a53b3..000000000
Binary files a/website/contribute/contribution-process/images/cicd-overview.png and /dev/null differ
diff --git a/website/contribute/contribution-process/images/cicd-overview.webp b/website/contribute/contribution-process/images/cicd-overview.webp
new file mode 100644
index 000000000..fa2f17789
Binary files /dev/null and b/website/contribute/contribution-process/images/cicd-overview.webp differ
diff --git a/website/contribute/contribution-process/roles.md b/website/contribute/contribution-process/roles.md
index a2c2dd696..485d1bc87 100644
--- a/website/contribute/contribution-process/roles.md
+++ b/website/contribute/contribution-process/roles.md
@@ -67,8 +67,7 @@ Approvers share the requirements and responsibilities of [reviewers](#reviewer),
- Sound technical judgment
- Deep understanding of the Gardener codebase, features, and extensions
- Strong operational experience with Gardener
-- Active community engagement in the form of contributions to the [Gardener Community Review meeting](../../community/_index.md#review-meetings), [Slack](https://join.slack.com/t/gardener-cloud/shared_invite/zt-33c9daems-3oOorhnqOSnldZPWqGmIBw) discussions or similar
-
+- Active community engagement in the form of contributions to the [Gardener Community Review meeting](../../../community/_index.md#gardener-review-meetings), [Slack](https://join.slack.com/t/gardener-cloud/shared_invite/zt-33c9daems-3oOorhnqOSnldZPWqGmIBw) discussions or similar
**Responsibilities**
- General Responsiveness for subproject matters
- Triage reviews and issues (status check, categorizing, prioritizing)
diff --git a/website/contribute/documentation/organization.md b/website/contribute/documentation/organization.md
index bc10d9f90..3cab60465 100644
--- a/website/contribute/documentation/organization.md
+++ b/website/contribute/documentation/organization.md
@@ -23,7 +23,7 @@ repositoryX
|_ docs
|_ usage
| |_ images
- | |_ 01.png
+ | |_ 01.webp
| |_ hibernation.md
|_ operations
|_ deployment
diff --git a/website/documentation/getting-started/architecture.md b/website/documentation/getting-started/architecture.md
index c44d7465b..3029ac67d 100644
--- a/website/documentation/getting-started/architecture.md
+++ b/website/documentation/getting-started/architecture.md
@@ -24,7 +24,7 @@ In other terms: you use Kubernetes to run Kubernetes.
## Cluster Hierarchy in Gardener
-
+
Gardener uses many Kubernetes clusters to eventually provide you with your very own shoot cluster.
@@ -36,7 +36,7 @@ Finally, there are the shoot clusters - what Gardener is all about. Shoot cluste
## Gardener Components Overview
-
+
From a very high level point of view, the important components of Gardener are:
@@ -52,11 +52,11 @@ Inside each seed is one of the most important controllers in Gardener - the gard
Kubernetes' API can be extended - either by CRDs or by API aggregation.
-
+
API aggregation involves setting up a so called extension-API-server and registering it with the main Kubernetes API server. The extension API server will then serve resources of custom-defined API groups on its own. While the main Kubernetes API server is still used to handle RBAC, authorization, namespacing, quotas, limits, etc., all custom resources will be delegated to the extension-API-server. This is done through an APIService resource in the main API server - it specifies that, e.g., the API group `core.gardener.cloud` is served by a dedicated extension-API-server and all requests concerning this API group should be forwarded the specified IP address or Kubernetes service name. Extension API servers can persist their resources in their very own etcd but they do not have to - instead, they can use the main API servers etcd as well.
-
+
Gardener uses its very own extension API server for its resources like Shoot, Seed, CloudProfile, SecretBinding, etc... However, Gardener does not set up a dedicated etcd for its own extension API server - instead, it reuses the existing etcd of the main Kubernetes API server. This is absolutely possible since the resources of Gardener's API are part of the API group `gardener.cloud` and thus will not interfere with any resources of the main Kubernetes API in etcd.
@@ -68,7 +68,7 @@ In case you are interested, you can read more on:
## Gardener API Resources
-
+
Since Gardener's API endpoint is a regular Kubernetes cluster, it would theoretically serve all resources from the Kubernetes core API, including Pods, Deployments, etc. However, Gardener implements RBAC rules and disables certain controllers that make these resources inaccessible. Objects like Secrets, Namespaces, and ResourceQuotas are still available, though, as they play a vital role in Gardener.
diff --git a/website/documentation/getting-started/ca-components.md b/website/documentation/getting-started/ca-components.md
index 73b8653f9..a69b91050 100644
--- a/website/documentation/getting-started/ca-components.md
+++ b/website/documentation/getting-started/ca-components.md
@@ -13,7 +13,7 @@ So let's see what the mission control (control plane) of a Kubernetes cluster lo
[Kubeception - Kubernetes in Kubernetes in Kubernetes](./architecture.md#kubeception)
-
+
In the classic setup, there is a dedicated host / VM to host the master components / control plane of a Kubernetes cluster. However, these are just normal programs that can easily be put into containers. Once in containers, we can make Kubernetes Deployments and StatefulSets (for the etcd) watch over them. And now we put all that into a separate, dedicated Kubernetes cluster - et voilà, we have Kubernetes in Kubernetes, aka Kubeception (named after the famous movie Inception with Leonardo DiCaprio).
@@ -21,11 +21,11 @@ In Gardener's terminology, the cluster hosting the control plane components is c
## Control Plane Components on the Seed
-
+
All control-plane components of a shoot cluster run in a dedicated namespace on the seed.
-
+
A control plane has lots of components:
@@ -45,7 +45,7 @@ There is also a set of components making our life easier (logging, monitoring) o
## Core Components
-
+
Let's take a close look at the API server as well as etcd.
@@ -59,7 +59,7 @@ The kube API server (often called "kapi") scales both horizontally and verticall
The kube API server is not directly exposed / reachable via its public hostname. Instead, Gardener runs a single LoadBalancer service backed by an istio gateway / envoy, which uses SNI to forward traffic.
-
+
The [kube-controller-manager](https://kubernetes.io/docs/concepts/overview/components/#kube-controller-manager) (aka [KCM](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/)) is the component that contains all the controllers for the core Kubernetes objects such as Deployments, Services, PVCs, etc.
@@ -73,7 +73,7 @@ Without the cluster autoscaler, nodes could not be added or removed based on cur
## Gardener-Specific Components
-
+
**Shoot DNS service:** External DNS management for resources within the cluster.
@@ -85,7 +85,7 @@ Without the cluster autoscaler, nodes could not be added or removed based on cur
## Machines
-
+
**Machine Controller Manager** (aka [MCM](https://github.com/gardener/machine-controller-manager)):
@@ -95,7 +95,7 @@ For more information, see [MCM](https://github.com/gardener/machine-controller-m
## ManagedResources
-
+
**Gardener Resource Manager** (aka [GRM](https://github.com/gardener/gardener/blob/master/docs/concepts/resource-manager.md)):
@@ -105,7 +105,7 @@ Enter the GRM - it reconciles on ManagedResources objects, which are description
## DNS Records - "Internal" and "External"
-
+
The internal domain name is used by all Gardener components to talk to the API server. Even though it is called "internal", it is still publicly routable.
@@ -117,7 +117,7 @@ For more information, see [Contract: DNSRecord Resources](https://github.com/gar
## Features and Observability
-
+
Gardener runs various health checks to ensure that the cluster works properly. The Network Problem Detector gives information about connectivity within the cluster and to the API server.
@@ -127,7 +127,7 @@ Gardener runs various health checks to ensure that the cluster works properly. T
## HA Control Plane
-
+
As the title indicates, the HA control plane feature is only about the control plane. Setting up the data plane to span multiple zones is part of the worker spec of a shoot.
@@ -142,7 +142,7 @@ For detailed guidance and more information, see the [High Availability Guides](h
## Zonal HA Control Planes
-
+
Zonal HA is the most likely setup for shoots with `purpose: production`.
@@ -158,13 +158,13 @@ To distribute those pods across zones, well-known concepts like PodTopologySprea
## kube-system Namespace
-
+
+
For a fully functional cluster, a few components need to run on the data plane side of the diagram. They all exist in the kube-system namespace. Let's have a closer look at them.
### Networking
-
+
On each node we need a CNI (container network interface) plugin. Gardener offers Calico or Cilium as network provider for a shoot. When using Calico, a kube-proxy is deployed. Cilium does not need a kube-proxy, as it takes care of its tasks as well.
@@ -182,7 +182,7 @@ When calico is failing on a node, no new pods can start there as they don't get
### DNS System
-
+
For a normal service in Kubernetes, a cluster-internal DNS record that resolves to the service's ClusterIP address is being created. In Gardener (similar to most other Kubernetes offerings) CoreDNS takes care of this aspect. To reduce the load when it comes to upstream DNS queries, Gardener deploys a DNS cache to each node by default. It will also forward queries outside the cluster's search domain directly to the upstream DNS server. For more information, see [NodeLocalDNS Configuration](https://github.com/gardener/gardener/blob/master/docs/usage/networking/node-local-dns.md) and [DNS autoscaling](https://github.com/gardener/gardener/blob/master/docs/usage/autoscaling/dns-autoscaling.md).
@@ -194,7 +194,7 @@ A broken DNS system on any level will cause disruption / service degradation for
### Health Checks and Metrics
-
+
Gardener deploys probes checking the health of individual nodes. In a similar fashion, a network health check probes connectivity within the cluster (node to node, pod to pod, pod to api-server, ...).
@@ -202,7 +202,7 @@ They provide the data foundation for Gardener's monitoring stack together with t
### Connectivity Components
-
+
From the perspective of the data plane, the shoot's API server is reachable via the cluster-internal service `kubernetes.default.svc.cluster.local`. The apiserver-proxy intercepts connections to this destination and changes it so that the traffic is forwarded to the kube-apiserver service in the seed cluster. For more information, see [kube-apiserver via apiserver-proxy](https://github.com/gardener/gardener/blob/764df0ee5ebc13b2634eba98169b409244f19bfe/docs/usage/control-plane-endpoints-and-ports.md#kube-apiserver-via-apiserver-proxy).
@@ -210,6 +210,6 @@ The second component here is the VPN shoot. It initiates a VPN connection to its
### csi-driver
-
+
The last component to mention here is the csi-driver that is deployed as a Daemonset to all nodes. It registers with the kubelet and takes care of the mounting of volume types it is responsible for.
diff --git a/website/documentation/getting-started/common-pitfalls.md b/website/documentation/getting-started/common-pitfalls.md
index 9b5f9b3c6..f8a66939f 100644
--- a/website/documentation/getting-started/common-pitfalls.md
+++ b/website/documentation/getting-started/common-pitfalls.md
@@ -7,7 +7,7 @@ weight: 9
### Containers will NOT fix a broken architecture!
-
+
Running a highly distributed system has advantages, but of course, those come at a cost. In order to succeed, one would need:
@@ -28,7 +28,7 @@ Reading the [Scalability of Gardener Managed Kubernetes Clusters](../guides/admi
### A Small Sample of Things That Can Grow Beyond Reasonable Limits
-
+
When scaling a cluster, there are plenty of resources that can be exhausted or reach a limit:
@@ -40,7 +40,7 @@ When scaling a cluster, there are plenty of resources that can be exhausted or r
### Infrastructure Capacity and Quotas
-
+
Sometimes requests cannot be fulfilled due to shortages on the infrastructure side. For example, a certain instance type might not be available and new Kubernetes nodes of this type cannot be added. It is a good practice to use the [cluster-autoscaler's priority expander](https://github.com/gardener/autoscaler/blob/machine-controller-manager-provider/cluster-autoscaler/expander/priority/readme.md) and have a secondary node pool.
@@ -54,7 +54,7 @@ Sometimes, it is not the physical capacity but exhausted quotas within an infras
### NodeCIDRMaskSize
-
+
Upon cluster creation, there are several settings that are network related. For example, the address space for Pods has to be defined. In this case, it is a `/16` subnet that includes a total of 65.536 hosts. However, that does not imply that you can easily use all addresses at the same point in time.
@@ -68,7 +68,7 @@ For more information, see [Shoot Networking](https://github.com/gardener/gardene
### Avoid Overlapping CIDR Ranges in VPCs
-
+
Gardener can create shoot cluster resources in an existing / user-created VPC. However, you have to make sure that the CIDR ranges used by the shoots nodes or subnets for zones do not overlap with other shoots deployed to the same VPC.
@@ -76,7 +76,7 @@ In case of an overlap, there might be strange routing effects, and packets endin
## Expired Credentials
-
+
Credentials expire or get revoked. When this happens to the actively used infrastructure credentials of a shoot, the cluster will stop working after a while. New nodes cannot be added, LoadBalancers cannot be created, and so on.
@@ -174,7 +174,7 @@ Common causes for failure are:
### Timeout
-
+
Webhooks are a very helpful feature of Kubernetes. However, they can easily be configured to break a shoot cluster. Take the timeout, for example. High timeouts (>15s) can lead to blocking requests of control plane components. That's because most control-plane API calls are made with a client-side timeout of 30s, so if a webhook has `timeoutSeconds=30`, the overall request might still fail as there is overhead in communication with the API server and other potential webhooks.
@@ -214,7 +214,7 @@ However, sometimes, you simply use helm or kustomize to install a (third-party)
### CRD with a Conversion Webhook
-
+
Conversion webhooks are tricky. Similarly to regular webhooks, they should have a low timeout. However, they cannot be remediated automatically and can cause errors in the control plane. For example, if a webhook is invoked but not available, it can block the garbage collection run by the kube-controller-manager.
diff --git a/website/documentation/getting-started/features/certificate-management.md b/website/documentation/getting-started/features/certificate-management.md
index 1a551b368..ec57c6d62 100644
--- a/website/documentation/getting-started/features/certificate-management.md
+++ b/website/documentation/getting-started/features/certificate-management.md
@@ -11,7 +11,7 @@ There are plenty of tools you can use to perform the challenge. For Kubernetes,
## Manage Certificates with Gardener
-
+
You may annotate a Service or Ingress resource to trigger the cert-manager to request a certificate from the any configured issuer (e.g. Let's Encrypt) and perform the challenge. A Gardener operator can add a default issuer for convenience.
With the DNS extension discussed previously, setting up the DNS TXT record for the ACME challenge is fairly easy. The requested certificate can be customized by the means of several other annotations known to the controller. Most notably, it is possible to specify SANs via `cert.gardener.cloud/dnsnames` to accommodate domain names that have more than 64 characters (the limit for the CN field).
diff --git a/website/documentation/getting-started/features/credential-rotation.md b/website/documentation/getting-started/features/credential-rotation.md
index 124ccdcce..07156100d 100644
--- a/website/documentation/getting-started/features/credential-rotation.md
+++ b/website/documentation/getting-started/features/credential-rotation.md
@@ -10,14 +10,14 @@ The ETCD needs one to store resources like secrets encrypted at rest.
Gardener generates certificate authorities (CAs) to ensure secured communication between the various components and actors and service account tokens are signed with a dedicated key.
There is also an SSH key pair to allow debugging of nodes and the observability stack has its own passwords too.
-
+
All of these keys share a common property: they are managed by Gardener.
Rotating them, however, is potentially very disruptive.
Hence, Gardener does not do it automatically, but offers you means to perform these tasks easily.
For a single cluster, you may conveniently use the dashboard.
-
+
Where possible, the rotation happens in two phases - Preparing and Completing.
@@ -42,7 +42,7 @@ kubectl -n
+
Gardener has a dedicated resource to maintain a list of available versions – the so-called `cloudProfile`.
@@ -73,7 +73,7 @@ Each shoot references a cloudProfile in order to obtain information about availa
## Version Classifications
-
+
Gardener has the following classifications for Kubernetes and OS image versions:
@@ -89,7 +89,7 @@ Version information is maintained in the relevant cloud profile resource. There
## AutoUpdate / Forced Updates
-
+
AutoUpdate for a machine image version will update all node pools to the latest supported version based on the defined update strategy. Whenever a new version is set to `supported`, the cluster will pick it up during its next maintenance window.
@@ -101,7 +101,7 @@ For more information, see [Shoot Kubernetes and Operating System Versioning in G
## Applying Changes to a Seed
-
+
It is important to keep in mind that a seed is just another Kubernetes cluster. As such, it has its own lifecycle (daily reconciliation, maintenance, etc.) and is also a subject to change.
diff --git a/website/documentation/getting-started/observability/alerts.md b/website/documentation/getting-started/observability/alerts.md
index 6d0b461ce..7a69b16ed 100644
--- a/website/documentation/getting-started/observability/alerts.md
+++ b/website/documentation/getting-started/observability/alerts.md
@@ -32,4 +32,4 @@ Then you can use federation, which is a Prometheus feature, to forward the metri
The credentials and endpoint for the Gardener managed Prometheus are exposed over the Gardener dashboard or programmatically in the garden project as a secret (`
+
## Shoot Status - Constraints
The shoot status also contains constraints. If these constraints are met, your cluster operations are impaired and the cluster is likely to fail at some point. Please watch them and act accordingly.
-
+
## Shoot Status - Last Operation
@@ -27,10 +27,10 @@ The `lastOperation`, `lastErrors`, and `lastMaintenance` give you information on
In this example, nodes are being recreated and not all machines have reached the desired state yet.
-
+
## Shoot Status - Credentials Rotation
You can also see the status of the last credentials rotation. Here you can also programmatically derive when the last rotation was down in order to trigger the next rotation.
-
+
diff --git a/website/documentation/getting-started/podrick-and-the-infinite-garden.md b/website/documentation/getting-started/podrick-and-the-infinite-garden.md
index 81523f90b..a1c0fc885 100644
--- a/website/documentation/getting-started/podrick-and-the-infinite-garden.md
+++ b/website/documentation/getting-started/podrick-and-the-infinite-garden.md
@@ -7,7 +7,7 @@ weight: 0
**An Illustrated Guide to Gardener for Readers of All Ages**
-
+
* **Written by:** _The Gardener authors_
* **Inspiration:** [_The Illustrated Children's Guide to Kubernetes_](https://www.cncf.io/phippy/the-childrens-illustrated-guide-to-kubernetes/)
@@ -23,7 +23,7 @@ Among them were orchids that needed humidity, cacti that craved dry heat, and fe
To keep them alive, he needed plots (_Kubernetes clusters_).
Many plots in different environments but all with a similar set of features to ease maintenance efforts.
-
+
## _Explanation: Kubernetes Clusters_
@@ -31,7 +31,7 @@ Many plots in different environments but all with a similar set of features to e
* Can be configured in many ways.
* Need to be scaled, updated and maintained regularly.
-+*The API server can have many clients of various kinds* However, it is possible to configure the API server differently for use with an intermediate authenticating proxy. The proxy will authenticate the client with its own custom method and then issue HTTP requests to the API server with additional HTTP headers specifying the user name and group name. The API server should only accept HTTP requests with HTTP headers from a legitimate proxy. To allow the API server to check incoming requests, you need pass on a list of certificate authorities (CAs) to it. Requests coming from a proxy are only accepted if they use a client certificate that is signed by one of the CAs of that list. @@ -60,11 +60,11 @@ However, it is possible to configure the API server differently for use with an --requestheader-group-headers=X-Remote-Group ``` -*API server clients can reach the API server through an authenticating proxy* +*API server clients can reach the API server through an authenticating proxy* So far, so good. But what happens if the malicious user “Mallory” tries to connect directly to the API server and reuses the HTTP headers to pretend to be someone else? -*What happens when a client bypasses the proxy, connecting directly to the API server?* +*What happens when a client bypasses the proxy, connecting directly to the API server?* With a correct configuration, Mallory’s kubeconfig will have a certificate signed by the API server certificate authority but not signed by the proxy certificate authority. So the API server will not accept the extra HTTP header “X-Remote-Group: system:masters”. @@ -78,11 +78,11 @@ We worked on [improving the Kubernetes documentation](https://github.com/kuberne The API server is a central component of Kubernetes and many components initiate connections to it, including the kubelet running on worker nodes. Most of the requests from those clients will end up updating Kubernetes objects (pods, services, deployments, and so on) in the etcd database but the API server usually does not need to initiate TCP connections itself. -*The API server is mostly a component that receives requests* +*The API server is mostly a component that receives requests* However, there are exceptions. Some `kubectl` commands will trigger the API server to open a new connection to the kubelet. `kubectl exec` is one of those commands. In order to get the standard I/Os from the pod, the API server will start an HTTP connection to the kubelet on the worker node where the pod is running. Depending on the container runtime used, it can be done in different ways, but one way to do it is for the kubelet to reply with a HTTP-302 redirection to the [Container Runtime Interface (CRI)](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/container-runtime-interface.md). Basically, the kubelet is telling the API server to get the streams from CRI itself directly instead of forwarding. The redirection from the kubelet will only change the port and path from the URL; the IP address will not be changed because the kubelet and the CRI component run on the same worker node. -*But the API server also initiates some connections, for example, to worker nodes* +*But the API server also initiates some connections, for example, to worker nodes* It’s often quite easy for users of a Kubernetes cluster to get access to worker nodes and tamper with the kubelet. They could be given explicit SSH access or they could be given a kubeconfig with enough privileges to create privileged pods or even just pods with “host” volumes. @@ -91,7 +91,7 @@ On setups like, for example, GKE or Gardener, the control plane is running on se What would happen if a user was tampering with the kubelet to make it maliciously redirect `kubectl exec` requests to a different random endpoint? Most likely the given endpoint would not speak to the streaming server protocol, so there would be an error. However, the full HTTP payload from the endpoint is included in the error message printed by kubectl exec. -*The API server is tricked to connect to other components* +*The API server is tricked to connect to other components* The impact of this issue depends on the specific setup. But in many configurations, we could find a metadata service (such as the [AWS metadata service](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)) containing user data, configurations and credentials. The setup we explored had a different AWS account and a different [EC2 instance profile](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html) for the worker nodes and the control plane. This issue allowed users to get access to the AWS metadata service in the context of the control plane, which they should not have access to. @@ -112,13 +112,13 @@ This is tracked in [CVE-2018-2475](https://cve.mitre.org/cgi-bin/cvename.cgi?nam For our tests, we had access to a Kubernetes setup where users are not only given access to the API server in the control plane, but also to a Grafana instance that is used to gather data from their Kubernetes clusters via Prometheus. The control plane is managed and users don’t have access to the nodes that it runs. They can only access the API server and Grafana via a load balancer. The internal network of the control plane is therefore hidden to users. -*Prometheus and Grafana can be used to monitor worker nodes* +*Prometheus and Grafana can be used to monitor worker nodes* Unfortunately, that setup was not protecting the control plane network from nosy users. By configuring a new custom data source in Grafana, we could send HTTP requests to target the control plane network, for example the AWS metadata service. The reply payload is not displayed on the Grafana Web UI but it is possible to access it from the debugging console of the Chrome browser. -*Credentials can be retrieved from the debugging console of Chrome* +*Credentials can be retrieved from the debugging console of Chrome* -*Adding a Grafana data source is a way to issue HTTP requests to arbitrary targets* +*Adding a Grafana data source is a way to issue HTTP requests to arbitrary targets* In that installation, users could get the “user-data” for the seed cluster from the metadata service and retrieve a kubeconfig for that Kubernetes cluster. diff --git a/website/documentation/guides/applications/knative-install.md b/website/documentation/guides/applications/knative-install.md index 6a37418e9..3e3c5e83a 100644 --- a/website/documentation/guides/applications/knative-install.md +++ b/website/documentation/guides/applications/knative-install.md @@ -32,7 +32,7 @@ Knative requires a Kubernetes cluster v1.15 or newer. If you are not the Gardener Administrator already, you can create a technical user in the Gardener dashboard. Go to the "Members" section and add a service account. You can then download the kubeconfig for your project. You can skip this step if you create your cluster using the user interface; it is only needed for programmatic access, make sure you set `export KUBECONFIG=garden-my-project.yaml` in your shell. -  +  ### Creating a Kubernetes Cluster @@ -43,7 +43,7 @@ kubectl apply --filename my-cluster.yaml ``` The easier alternative is to create the cluster following the cluster creation wizard in the Gardener dashboard: - + ### Configure kubectl for Your Cluster diff --git a/website/documentation/guides/applications/network-isolation.md b/website/documentation/guides/applications/network-isolation.md index 731b09c14..08cc46b55 100644 --- a/website/documentation/guides/applications/network-isolation.md +++ b/website/documentation/guides/applications/network-isolation.md @@ -10,7 +10,7 @@ scope: app-developer You can configure a **NetworkPolicy** to deny all the traffic from other namespaces while allowing all the traffic coming from the same namespace the pod was deployed into. -
+
**There are many reasons why you may chose to employ Kubernetes network policies:**
@@ -48,7 +48,7 @@ kubectl expose deployment nginx --port=80 --type=NodePort -n=customer2
## Test Without NP
-
+
Create a pod with *curl* preinstalled inside the namespace *customer1*:
@@ -71,7 +71,7 @@ Both calls are done in a pod within the namespace *customer1* and both nginx ser
---
## Test with NP
-
+
Install the **NetworkPolicy** from your shell:
diff --git a/website/documentation/guides/client-tools/bash-kubeconfig.md b/website/documentation/guides/client-tools/bash-kubeconfig.md
index 9fc8a5d7b..55e79f2fe 100644
--- a/website/documentation/guides/client-tools/bash-kubeconfig.md
+++ b/website/documentation/guides/client-tools/bash-kubeconfig.md
@@ -92,6 +92,6 @@ Copy following code to `Microsoft.PowerShell_profile.ps1`
$host.ui.rawui.WindowTitle = prompt_k8s
```
-
+
If you want to switch to different cluster, you can set `KUBECONFIG` to new value, and re-run the file `Microsoft.PowerShell_profile.ps1`
diff --git a/website/documentation/guides/client-tools/images/howto-bash_kubeconfig_powershell.png b/website/documentation/guides/client-tools/images/howto-bash_kubeconfig_powershell.png
deleted file mode 100644
index 15f5eb6f6..000000000
Binary files a/website/documentation/guides/client-tools/images/howto-bash_kubeconfig_powershell.png and /dev/null differ
diff --git a/website/documentation/guides/client-tools/images/howto-bash_kubeconfig_powershell.webp b/website/documentation/guides/client-tools/images/howto-bash_kubeconfig_powershell.webp
new file mode 100644
index 000000000..737db1fc6
Binary files /dev/null and b/website/documentation/guides/client-tools/images/howto-bash_kubeconfig_powershell.webp differ
diff --git a/website/documentation/guides/client-tools/images/key.png b/website/documentation/guides/client-tools/images/key.png
deleted file mode 100644
index 0d0b12a8a..000000000
Binary files a/website/documentation/guides/client-tools/images/key.png and /dev/null differ
diff --git a/website/documentation/guides/client-tools/images/key.webp b/website/documentation/guides/client-tools/images/key.webp
new file mode 100644
index 000000000..be1c1697c
Binary files /dev/null and b/website/documentation/guides/client-tools/images/key.webp differ
diff --git a/website/documentation/guides/client-tools/images/kubeconfig-initial.png b/website/documentation/guides/client-tools/images/kubeconfig-initial.png
deleted file mode 100644
index 79fbc36b8..000000000
Binary files a/website/documentation/guides/client-tools/images/kubeconfig-initial.png and /dev/null differ
diff --git a/website/documentation/guides/client-tools/images/kubeconfig-initial.webp b/website/documentation/guides/client-tools/images/kubeconfig-initial.webp
new file mode 100644
index 000000000..527aa3a6a
Binary files /dev/null and b/website/documentation/guides/client-tools/images/kubeconfig-initial.webp differ
diff --git a/website/documentation/guides/client-tools/working-with-kubeconfig.md b/website/documentation/guides/client-tools/working-with-kubeconfig.md
index 8449d7fa7..7c37741bf 100644
--- a/website/documentation/guides/client-tools/working-with-kubeconfig.md
+++ b/website/documentation/guides/client-tools/working-with-kubeconfig.md
@@ -19,7 +19,7 @@ If you've become aware of a security breach that affects you, you may want to re
Never distribute the `kubeconfig`, which you can download directly within the Gardener dashboard, for a productive cluster.
-
+
## Create a Custom kubeconfig File for Each User
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/3da659e9cc4744a2ad3e1c6a50d39c04.png b/website/documentation/guides/monitoring-and-troubleshooting/images/3da659e9cc4744a2ad3e1c6a50d39c04.png
deleted file mode 100644
index 2992a194b..000000000
Binary files a/website/documentation/guides/monitoring-and-troubleshooting/images/3da659e9cc4744a2ad3e1c6a50d39c04.png and /dev/null differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/3da659e9cc4744a2ad3e1c6a50d39c04.webp b/website/documentation/guides/monitoring-and-troubleshooting/images/3da659e9cc4744a2ad3e1c6a50d39c04.webp
new file mode 100644
index 000000000..952a143e3
Binary files /dev/null and b/website/documentation/guides/monitoring-and-troubleshooting/images/3da659e9cc4744a2ad3e1c6a50d39c04.webp differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/913441003e5641bc90249bdc07d55656.png b/website/documentation/guides/monitoring-and-troubleshooting/images/913441003e5641bc90249bdc07d55656.png
deleted file mode 100644
index fe2c1ad02..000000000
Binary files a/website/documentation/guides/monitoring-and-troubleshooting/images/913441003e5641bc90249bdc07d55656.png and /dev/null differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/913441003e5641bc90249bdc07d55656.webp b/website/documentation/guides/monitoring-and-troubleshooting/images/913441003e5641bc90249bdc07d55656.webp
new file mode 100644
index 000000000..4123347b9
Binary files /dev/null and b/website/documentation/guides/monitoring-and-troubleshooting/images/913441003e5641bc90249bdc07d55656.webp differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/9fb6ca4ff9b7480f93debba833f48590.png b/website/documentation/guides/monitoring-and-troubleshooting/images/9fb6ca4ff9b7480f93debba833f48590.png
deleted file mode 100644
index c8d135fc3..000000000
Binary files a/website/documentation/guides/monitoring-and-troubleshooting/images/9fb6ca4ff9b7480f93debba833f48590.png and /dev/null differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/9fb6ca4ff9b7480f93debba833f48590.webp b/website/documentation/guides/monitoring-and-troubleshooting/images/9fb6ca4ff9b7480f93debba833f48590.webp
new file mode 100644
index 000000000..6ae6c9a32
Binary files /dev/null and b/website/documentation/guides/monitoring-and-troubleshooting/images/9fb6ca4ff9b7480f93debba833f48590.webp differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/db573582bfc544d294cbde8906a74e07.png b/website/documentation/guides/monitoring-and-troubleshooting/images/db573582bfc544d294cbde8906a74e07.png
deleted file mode 100644
index 08f6efb75..000000000
Binary files a/website/documentation/guides/monitoring-and-troubleshooting/images/db573582bfc544d294cbde8906a74e07.png and /dev/null differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/db573582bfc544d294cbde8906a74e07.webp b/website/documentation/guides/monitoring-and-troubleshooting/images/db573582bfc544d294cbde8906a74e07.webp
new file mode 100644
index 000000000..8126cd9c6
Binary files /dev/null and b/website/documentation/guides/monitoring-and-troubleshooting/images/db573582bfc544d294cbde8906a74e07.webp differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/f7b10d48edf44c17ba838ff5c429e39d.png b/website/documentation/guides/monitoring-and-troubleshooting/images/f7b10d48edf44c17ba838ff5c429e39d.png
deleted file mode 100644
index 4aa4d6b2b..000000000
Binary files a/website/documentation/guides/monitoring-and-troubleshooting/images/f7b10d48edf44c17ba838ff5c429e39d.png and /dev/null differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/f7b10d48edf44c17ba838ff5c429e39d.webp b/website/documentation/guides/monitoring-and-troubleshooting/images/f7b10d48edf44c17ba838ff5c429e39d.webp
new file mode 100644
index 000000000..74869d3e7
Binary files /dev/null and b/website/documentation/guides/monitoring-and-troubleshooting/images/f7b10d48edf44c17ba838ff5c429e39d.webp differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/howto-kubetail.png b/website/documentation/guides/monitoring-and-troubleshooting/images/howto-kubetail.png
deleted file mode 100644
index 4c49d99dd..000000000
Binary files a/website/documentation/guides/monitoring-and-troubleshooting/images/howto-kubetail.png and /dev/null differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/images/howto-kubetail.webp b/website/documentation/guides/monitoring-and-troubleshooting/images/howto-kubetail.webp
new file mode 100644
index 000000000..3c84874da
Binary files /dev/null and b/website/documentation/guides/monitoring-and-troubleshooting/images/howto-kubetail.webp differ
diff --git a/website/documentation/guides/monitoring-and-troubleshooting/shell-to-node.md b/website/documentation/guides/monitoring-and-troubleshooting/shell-to-node.md
index aa05b7eb3..32dcdf4d2 100644
--- a/website/documentation/guides/monitoring-and-troubleshooting/shell-to-node.md
+++ b/website/documentation/guides/monitoring-and-troubleshooting/shell-to-node.md
@@ -43,28 +43,28 @@ All of the described approaches involve scheduling a pod with root permissions a
**Prerequisite**: the terminal feature is configured for the Gardener dashboard.
1. Navigate to the cluster overview page and find the `Terminal` in the `Access` tile.
- -
- - Select the target Cluster (Garden, Seed / Control Plane, Shoot cluster) depending on the requirements and access rights (only certain users have access to the Seed Control Plane). + +
++ +Select the target Cluster (Garden, Seed / Control Plane, Shoot cluster) depending on the requirements and access rights (only certain users have access to the Seed Control Plane). 1. To open the terminal configuration, interact with the top right-hand corner of the screen. - -
- + +
+1. Set the Terminal Runtime to "Privileged". Also, specify the target node from the drop-down menu. - -
- +
+#### Result The Dashboard then schedules a pod and opens a shell session to the node. To get access to the common binaries installed on the host, prefix the command with `chroot /hostroot`. Note that the path depends on where the root path is mounted in the container. In the default image used by the Dashboard, it is under `/hostroot`. -
+
### Gardener Ops Toolbelt @@ -189,9 +189,7 @@ Despite some cloud provider specifics, they can be generalized to the following The following diagram shows an overview of how the SSH access to the target instance works: - -
-+ ![]() This guide demonstrates the setup of a bastion on AWS. diff --git a/website/documentation/guides/monitoring-and-troubleshooting/tail-logfile.md b/website/documentation/guides/monitoring-and-troubleshooting/tail-logfile.md index 81fcb1169..85f514b56 100644 --- a/website/documentation/guides/monitoring-and-troubleshooting/tail-logfile.md +++ b/website/documentation/guides/monitoring-and-troubleshooting/tail-logfile.md @@ -12,7 +12,7 @@ One thing that always bothered me was that I couldn't get logs of several pods a This is something you really need a lot, at least if you run several instances of a pod behind a `deployment`. This is even more so if you don't have a Kibana or a similar setup. -
+
## Solution
diff --git a/website/hugo/layouts/partials/footer.html b/website/hugo/layouts/partials/footer.html
index db1ed610b..f7467b1f4 100755
--- a/website/hugo/layouts/partials/footer.html
+++ b/website/hugo/layouts/partials/footer.html
@@ -25,7 +25,7 @@
+
GitHub
|