Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .pipelines/dacs-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ extends:
- template: /.pipelines/templates/Dacs.AksTest.Stages.yml@self
parameters:
stageName: AksHelmUpgrade
bundledPrerequisites: false
stageDisplayName: AKS Helm Upgrade
testPackage: ./test/aks
testFilter: aks && helm-upgrade
Expand Down
35 changes: 17 additions & 18 deletions .pipelines/scripts/publish/publish-helm-chart.sh
Original file line number Diff line number Diff line change
Expand Up @@ -58,44 +58,43 @@ package_chart() (
local CHART_NAME="$2"

local CHART_PACKAGE="$OUTPUT_DIR/$CHART_NAME-$CHART_VERSION.tgz"
local CHART_DESCRIPTION
local CHART_STAGE
CHART_DESCRIPTION="$(grep '^description:' "$CHART_DIR/Chart.yaml" | cut -d: -f2- | xargs)"
CHART_STAGE="$(mktemp -d "$OUTPUT_DIR/.${CHART_NAME}.XXXXXX")"
trap 'rm -rf -- "$CHART_STAGE"' EXIT

cp -a "$CHART_DIR/." "$CHART_STAGE/"

cat > "$CHART_STAGE/Chart.yaml" << EOF
apiVersion: v2
name: $CHART_NAME
description: $CHART_DESCRIPTION
type: application
version: $CHART_VERSION
appVersion: "$CONTAINER_VERSION"
EOF
if [[ "$CHART_NAME" != dacs-prereq ]]; then
mkdir -p "$CHART_STAGE/charts"
rm -f "$CHART_STAGE/charts"/dacs-prereq-*.tgz
cp -a "$REPOSITORY_ROOT/helm/dacs-prereq" "$CHART_STAGE/charts/dacs-prereq"
sed -i "s|^appVersion:.*|appVersion: \"$CONTAINER_VERSION\"|" \
"$CHART_STAGE/charts/dacs-prereq/Chart.yaml"
fi

# Update values.yaml with the build registry and image versions.
if [[ -f "$CHART_STAGE/values.yaml" ]]; then
local VALUES_FILE
for VALUES_FILE in "$CHART_STAGE/values.yaml" "$CHART_STAGE/charts/dacs-prereq/values.yaml"; do
[[ -f "$VALUES_FILE" ]] || continue
sed -i -E \
"s#^([[:space:]]*registry:)[[:space:]]*dacstest\.azurecr\.io\$#\\1 $REGISTRY#" \
"$CHART_STAGE/values.yaml"
"$VALUES_FILE"
sed -i -E \
"s#^([[:space:]]*repository:)[[:space:]]*(acstor/dacs-server|cache-server)\$#\\1 $REGISTRY/dacs/cache-server#" \
"$CHART_STAGE/values.yaml"
"$VALUES_FILE"
sed -i -E \
"s#^([[:space:]]*repository:)[[:space:]]*(acstor/dacs-scheduler|cacheserver-scheduler)\$#\\1 $REGISTRY/dacs/cacheserver-scheduler#" \
"$CHART_STAGE/values.yaml"
"$VALUES_FILE"
sed -i -E \
"s#^([[:space:]]*repository:)[[:space:]]*(acstor/dacs-controller|cache-controller)\$#\\1 $REGISTRY/dacs/cache-controller#" \
"$CHART_STAGE/values.yaml"
"$VALUES_FILE"
sed -i -E \
"s#^([[:space:]]*repository:)[[:space:]]*cache-setup\$#\\1 $REGISTRY/dacs/cache-setup#" \
"$CHART_STAGE/values.yaml"
"$VALUES_FILE"
sed -i -E \
"s#^([[:space:]]*tag:)[[:space:]]*\"\".*\$#\\1 \"$CONTAINER_VERSION\"#" \
"$CHART_STAGE/values.yaml"
fi
"$VALUES_FILE"
done

# Package the chart (empty tag in values.yaml defaults to appVersion)
helm package "$CHART_STAGE" -d "$OUTPUT_DIR" \
Expand Down
8 changes: 8 additions & 0 deletions .pipelines/scripts/tests/test-helm-publication.sh
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ assert_safe_labels() {
local chart_package="${TEMP_DIR}/${chart_name}-${TEST_CHART_VERSION}.tgz"
local rendered

helm dependency build "${chart_dir}" --skip-refresh >/dev/null
helm package "${chart_dir}" \
--destination "${TEMP_DIR}" \
--version "${TEST_CHART_VERSION}" \
Expand Down Expand Up @@ -69,6 +70,13 @@ grep -Fq "example.azurecr.io/dacs/cache-server:${container_version}" <<<"${rende
rendered_prereq="$(helm template test-release "${OUTPUT_DIR}/dacs-prereq-${chart_version}.tgz")"
grep -Fq "example.azurecr.io/dacs/cache-setup:${container_version}" <<<"${rendered_prereq}"

for chart in cache-server dacs; do
rendered_parent="$(helm template test-release "${OUTPUT_DIR}/${chart}-${chart_version}.tgz" \
--set cacheServerPrereq.enabled=true)"
grep -Fq "example.azurecr.io/dacs/cache-setup:${container_version}" <<<"${rendered_parent}"
grep -Fq "helm.sh/hook: post-install,post-upgrade" <<<"${rendered_parent}"
done

grep -Fq "CACHE_CONTROLLER_CHART_VERSION=${chart_version}" "${METADATA_FILE}"
grep -Fq "APP_VERSION=$("${REPOSITORY_ROOT}/.pipelines/scripts/get-version.sh" source)" "${METADATA_FILE}"

Expand Down
28 changes: 14 additions & 14 deletions .pipelines/templates/Dacs.AksTest.Stages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ parameters:
- name: cacheStaticServers
type: number
default: 0
- name: bundledPrerequisites
type: boolean
default: true
- name: resourcePrefix
type: string
default: aks-resilience
Expand Down Expand Up @@ -182,20 +185,6 @@ stages:
RESOURCE_GROUP: $(resourceGroup)
RESOURCE_PREFIX: $(resourcePrefix)

- task: AzureCLI@2
displayName: Deploy Cache Server Prerequisites
inputs:
azureSubscription: ${{ parameters.azureServiceConnection }}
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
set -euo pipefail
echo "Deploying cache-server prerequisites..."
make helm-prereq-install \
DOCKER_REGISTRY="$DOCKER_REGISTRY" BUILD_NUMBER="$(cacheServerBuildNumber)"
env:
DOCKER_REGISTRY: ${{ parameters.dockerRegistry }}

- task: AzureCLI@2
displayName: Deploy Cache Server
inputs:
Expand All @@ -205,14 +194,24 @@ stages:
inlineScript: |
set -euo pipefail
echo "Deploying with chart=${{ parameters.helmChart }}, build=$(cacheServerBuildNumber)..."
prereq_enabled=true
if [[ "${BUNDLED_PREREQUISITES,,}" != true ]]; then
make helm-prereq-install \
DOCKER_REGISTRY="$DOCKER_REGISTRY" BUILD_NUMBER="$(cacheServerBuildNumber)"
prereq_enabled=false
fi
if [[ "${{ parameters.helmChart }}" == dacs ]]; then
make helm-dacs-install \
CACHE_SERVER_PREREQ_ENABLED="$prereq_enabled" \
CACHE_SETUP_IMG="$DOCKER_REGISTRY/dacs/cache-setup" \
DOCKER_REGISTRY="$DOCKER_REGISTRY" BUILD_NUMBER="$(cacheServerBuildNumber)" \
DACS_CACHE_CHART_REPO=dacs/helmchart/dacs \
DACS_CACHE_CHART_VERSION="$(cacheServerChartVersion)" \
HELM_ARGS="--set global.registry= --set manager.image.repository=$DOCKER_REGISTRY/dacs/cache-controller --set manager.cacheServerImage.repository=$DOCKER_REGISTRY/dacs/cache-server $EXTRA_HELM_ARGS"
else
make helm-install \
CACHE_SERVER_PREREQ_ENABLED="$prereq_enabled" \
CACHE_SETUP_IMG="$DOCKER_REGISTRY/dacs/cache-setup" \
DOCKER_REGISTRY="$DOCKER_REGISTRY" BASE_REPO="$DOCKER_REGISTRY/dacs" \
BUILD_NUMBER="$(cacheServerBuildNumber)" \
HELM_CHART_REPO=dacs/helmchart/cache-server \
Expand All @@ -222,6 +221,7 @@ stages:
env:
DOCKER_REGISTRY: ${{ parameters.dockerRegistry }}
EXTRA_HELM_ARGS: ${{ parameters.helmArgs }}
BUNDLED_PREREQUISITES: ${{ parameters.bundledPrerequisites }}

- ${{ if and(eq(parameters.helmChart, 'dacs'), ne(parameters.cacheFixture, '')) }}:
- task: AzureCLI@2
Expand Down
28 changes: 20 additions & 8 deletions deploy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,26 +117,38 @@ make unprovision
| `DOCKER_REGISTRY` | Docker registry for images | `docker.io` |
| `BUILD_NUMBER` | Image tag to use | `local` |
| `HELM_ARGS` | Additional arguments to pass to helm | - |
| `HELM_TIMEOUT` | Helm install/upgrade timeout; keep longer than the prerequisite rollout-check timeout | `15m` |
| `CACHE_SERVER_PREREQ_ENABLED` | Enable bundled NVMe prerequisites | `false`; `make deploy` enables it on AKS |
| `CACHE_SETUP_IMG` | NVMe setup image repository | `$(DOCKER_REGISTRY)/dacs/cache-setup` |

### Usage

```bash
# Install dacs-prereq (NVMe RAID setup)
make helm-prereq-install

# Install cache-server
# Install cache-server without prerequisites
make helm-install

# Install either parent chart with NVMe prerequisites
make helm-install CACHE_SERVER_PREREQ_ENABLED=true
make helm-dacs-install CACHE_SERVER_PREREQ_ENABLED=true

# Install with custom image
DOCKER_REGISTRY=myregistry.azurecr.io BUILD_NUMBER=v1.2.3 make helm-install

# Uninstall cache-server
# Uninstall cache-server and its bundled prerequisites (host data is retained)
make helm-uninstall

# Uninstall dacs-prereq
make helm-prereq-uninstall
```

Both charts default prerequisites to off. AKS `make deploy` and the AKS test
pipeline opt in explicitly; Minikube deployments do not. See the
[prerequisite configuration](../helm/dacs-prereq/README.md) for rollout
limits and validation-hook behavior.

`make helm-dacs-install` and `make deploy CONTROLLER=new` install the
controller and optional prerequisites without creating a Cache. Wait for
prerequisite setup to succeed, then apply a standalone Cache manifest, as shown in the
[user guide](../user-guide.md#step-2-deploy-a-cache-instance).
Minikube needs no NVMe setup and uses the standalone Minikube Cache fixture.

## Dependencies

The deployment targets automatically download required tools:
Expand Down
36 changes: 26 additions & 10 deletions deploy/deploy.mk
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@ minikube-clean: ## Delete the Minikube cluster.

HELM_NAMESPACE ?= cache-server
HELM_ARGS ?=
HELM_TIMEOUT ?= 15m
CACHE_SERVER_PREREQ_ENABLED ?= false

# Local image settings for minikube
LOCAL_CACHE_SERVER_IMG ?= cache-server
Expand All @@ -184,13 +186,17 @@ DACS_CACHE_CHART_VERSION ?= $(DACS_CACHE_CHART_BASE_VERSION)-$(BUILD_NUMBER)
DACS_CACHE_NAMESPACE ?= cache-server

define helm_install
$(HELM_BIN) dependency build ./helm/cache-server
$(HELM_BIN) upgrade --install cache-server ./helm/cache-server \
--namespace $(HELM_NAMESPACE) --create-namespace \
--set cacheServer.image.repository=$(1) \
--set cacheServer.image.tag=$(2) \
--set cacheServer.scheduler.image.repository=$(3) \
--set cacheServer.scheduler.image.tag=$(4) \
--wait --timeout 10m --atomic $(HELM_ARGS)
--set cacheServerPrereq.enabled=$(CACHE_SERVER_PREREQ_ENABLED) \
--set cacheServerPrereq.nvmeRaidSetup.image.repository=$(CACHE_SETUP_IMG) \
--set-string cacheServerPrereq.nvmeRaidSetup.image.tag=$(IMAGE_TAG) \
--wait --timeout $(HELM_TIMEOUT) --atomic $(HELM_ARGS)
endef

define helm_install_remote
Expand All @@ -201,7 +207,10 @@ $(HELM_BIN) upgrade --install cache-server oci://$(DOCKER_REGISTRY)/$(HELM_CHART
--set cacheServer.image.tag=$(IMAGE_TAG) \
--set cacheServer.scheduler.image.repository=$(SCHEDULER_IMG) \
--set cacheServer.scheduler.image.tag=$(IMAGE_TAG) \
--wait --timeout 10m --atomic $(HELM_ARGS)
--set cacheServerPrereq.enabled=$(CACHE_SERVER_PREREQ_ENABLED) \
--set cacheServerPrereq.nvmeRaidSetup.image.repository=$(CACHE_SETUP_IMG) \
--set-string cacheServerPrereq.nvmeRaidSetup.image.tag=$(IMAGE_TAG) \
--wait --timeout $(HELM_TIMEOUT) --atomic $(HELM_ARGS)
endef

# Login to ACR for Helm if the registry is an Azure Container Registry
Expand All @@ -219,15 +228,15 @@ fi
endef

.PHONY: helm-prereq-install
helm-prereq-install: helm ## Deploy dacs-prereq chart for NVMe RAID setup.
helm-prereq-install: helm ## Deploy standalone NVMe prerequisites for older parent charts.
$(HELM_BIN) upgrade --install dacs-prereq ./helm/dacs-prereq \
--namespace $(HELM_NAMESPACE) --create-namespace \
--set nvmeRaidSetup.image.repository=$(CACHE_SETUP_IMG) \
--set nvmeRaidSetup.image.tag=$(IMAGE_TAG) \
--wait --timeout 10m --atomic $(HELM_ARGS)
--set-string nvmeRaidSetup.image.tag=$(IMAGE_TAG) \
--wait --timeout $(HELM_TIMEOUT) --atomic $(HELM_ARGS)

.PHONY: helm-prereq-uninstall
helm-prereq-uninstall: helm ## Uninstall dacs-prereq chart.
helm-prereq-uninstall: helm ## Uninstall standalone NVMe prerequisites.
$(HELM_BIN) uninstall dacs-prereq --namespace $(HELM_NAMESPACE) --ignore-not-found --wait

.PHONY: teardown-raid
Expand Down Expand Up @@ -260,14 +269,18 @@ helm-uninstall: helm ## Uninstall cache-server chart.
##@ DACS Cache Controller Helm (New Controller)

define helm_install_dacs_cache
$(HELM_BIN) dependency build ./$(DACS_CACHE_CHART_PATH)
$(HELM_BIN) upgrade --install dacs ./$(DACS_CACHE_CHART_PATH) \
--namespace $(DACS_CACHE_NAMESPACE) --create-namespace \
--set-string global.registry= \
--set manager.image.repository=$(1) \
--set manager.image.tag=$(2) \
--set manager.cacheServerImage.repository=$(LOCAL_CACHE_SERVER_IMG) \
--set manager.cacheServerImage.tag=$(LOCAL_CACHE_SERVER_TAG) \
--wait --timeout 5m --atomic $(HELM_ARGS)
--set cacheServerPrereq.enabled=$(CACHE_SERVER_PREREQ_ENABLED) \
--set cacheServerPrereq.nvmeRaidSetup.image.repository=$(CACHE_SETUP_IMG) \
--set-string cacheServerPrereq.nvmeRaidSetup.image.tag=$(IMAGE_TAG) \
--wait --timeout $(HELM_TIMEOUT) --atomic $(HELM_ARGS)
endef

define helm_install_dacs_cache_remote
Expand All @@ -277,7 +290,10 @@ $(HELM_BIN) upgrade --install dacs oci://$(DOCKER_REGISTRY)/$(DACS_CACHE_CHART_R
--set global.registry=$(DOCKER_REGISTRY) \
--set manager.image.tag=$(IMAGE_TAG) \
--set manager.cacheServerImage.tag=$(IMAGE_TAG) \
--wait --timeout 5m --atomic $(HELM_ARGS)
--set cacheServerPrereq.enabled=$(CACHE_SERVER_PREREQ_ENABLED) \
--set cacheServerPrereq.nvmeRaidSetup.image.repository=$(CACHE_SETUP_IMG) \
--set-string cacheServerPrereq.nvmeRaidSetup.image.tag=$(IMAGE_TAG) \
--wait --timeout $(HELM_TIMEOUT) --atomic $(HELM_ARGS)
endef

.PHONY: helm-dacs-install
Expand All @@ -303,14 +319,14 @@ ifeq ($(CONTROLLER),new)
ifeq ($(CLUSTER_TYPE),minikube)
@$(MAKE) helm-dacs-install
else
@$(MAKE) helm-prereq-install helm-dacs-install
@$(MAKE) helm-dacs-install CACHE_SERVER_PREREQ_ENABLED=true
endif
else
@echo "Deploying with old controller (cache-server helm chart)..."
ifeq ($(CLUSTER_TYPE),minikube)
@$(MAKE) helm-install
else
@$(MAKE) helm-prereq-install helm-install
@$(MAKE) helm-install CACHE_SERVER_PREREQ_ENABLED=true
endif
endif
@echo "Deployment complete (CONTROLLER=$(CONTROLLER))."
Expand Down
7 changes: 2 additions & 5 deletions deploy/scripts/aks/create.sh
Original file line number Diff line number Diff line change
Expand Up @@ -213,8 +213,5 @@ echo ""
echo "AKS cluster created successfully!"
echo ""
echo "Next steps:"
echo " 1. Install dacs-prereq chart to set up NVMe RAID:"
echo " make helm-prereq-install DOCKER_REGISTRY=\"${DOCKER_REGISTRY:-dacstest.azurecr.io}\" BUILD_NUMBER=\"${BUILD_NUMBER:-<build-number>}\""
echo ""
echo " 2. Install cache-server chart:"
echo " helm install cache-server ./helm/cache-server -n cache-server"
echo " Install cache-server with NVMe prerequisites enabled:"
echo " make deploy DOCKER_REGISTRY=\"${DOCKER_REGISTRY:-dacstest.azurecr.io}\" BUILD_NUMBER=\"${BUILD_NUMBER:-<build-number>}\""
7 changes: 7 additions & 0 deletions helm/cache-server/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,10 @@ version: 0.1.0
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
appVersion: 1.16.0

dependencies:
- name: dacs-prereq
version: 0.1.0
repository: file://../dacs-prereq
alias: cacheServerPrereq
condition: cacheServerPrereq.enabled
21 changes: 21 additions & 0 deletions helm/cache-server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,30 @@ This chart deploys the CacheServer distributed caching system for Kubernetes.
## Installation

```bash
helm dependency build ./helm/cache-server
helm install cache-server ./helm/cache-server -n cache-server --create-namespace
```

### Optional NVMe Prerequisites

Enable the bundled prerequisite DaemonSet to prepare local NVMe storage:

```bash
helm upgrade --install cache-server ./helm/cache-server \
-n cache-server --create-namespace \
--set cacheServerPrereq.enabled=true \
--set cacheServerPrereq.nvmeRaidSetup.image.repository="<registry>/dacs/cache-setup" \
--set-string cacheServerPrereq.nvmeRaidSetup.image.tag="<image-version>" \
--atomic --timeout 15m
```

Prerequisites default to off. Post-install and post-upgrade hooks verify
DaemonSet rollout completion. Rolling updates default to `10%` maximum
unavailable pods, configurable through
`cacheServerPrereq.updateStrategy.rollingUpdate.maxUnavailable`.
See the [shared prerequisite documentation](../dacs-prereq/README.md)
for configuration details.

## Configuration

See `values.yaml` for all configuration options.
Expand Down
3 changes: 3 additions & 0 deletions helm/cache-server/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.

cacheServerPrereq:
enabled: false

# -- Node selector for system pod assignment.
nodeSelector:
dacs.azure.com/processing-unit: system
Expand Down
Loading
Loading