diff --git a/hack/.ci/lib/e2e.sh b/hack/.ci/lib/e2e.sh
index ea5e075f069..4fdc793db5c 100755
--- a/hack/.ci/lib/e2e.sh
+++ b/hack/.ci/lib/e2e.sh
@@ -211,15 +211,6 @@ function run-e2e {
   kubectl create clusterrolebinding e2e --clusterrole=cluster-admin --serviceaccount=e2e:default --dry-run=client -o=yaml | kubectl_create -f=-
   kubectl create -n=e2e pdb my-pdb --selector='app=e2e' --min-available=1 --dry-run=client -o=yaml | kubectl_create -f=-
 
-
-  # Raise loglevel in CI.
-  # TODO: Replace it with ScyllaOperatorConfig field when available.
-  kubectl -n=scylla-operator patch --field-manager="${FIELD_MANAGER}" deployment/scylla-operator --type=json -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--loglevel=4"}]'
-  kubectl -n=scylla-operator rollout status deployment/scylla-operator
-
-  kubectl -n=scylla-manager patch --field-manager="${FIELD_MANAGER}" deployment/scylla-manager-controller --type=json -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--loglevel=4"}]'
-  kubectl -n=scylla-manager rollout status deployment/scylla-manager-controller
-
   kubectl create -n=e2e secret generic kubeconfigs ${KUBECONFIGS[@]/#/--from-file=} --dry-run=client -o=yaml | kubectl_create -f=-
   kubeconfigs_in_container_path=$( IFS=','; basenames=( "${KUBECONFIGS[@]##*/}" ) && in_container_paths="${basenames[@]/#//var/run/secrets/kubeconfigs/}" && echo "${in_container_paths[*]}" )
 
diff --git a/hack/ci-deploy-release.sh b/hack/ci-deploy-release.sh
index 3ff7b30eeda..e041a6341d3 100755
--- a/hack/ci-deploy-release.sh
+++ b/hack/ci-deploy-release.sh
@@ -53,6 +53,11 @@ for d in cert-manager{,-cainjector,-webhook}; do
 done
 wait-for-object-creation cert-manager secret/cert-manager-webhook-ca
 
+# TODO: Replace it with ScyllaOperatorConfig field when available.
+# Ref: https://github.com/scylladb/scylla-operator/issues/2314.
+SO_SCYLLA_OPERATOR_LOGLEVEL="${SO_SCYLLA_OPERATOR_LOGLEVEL:-4}"
+export SO_SCYLLA_OPERATOR_LOGLEVEL
+
 cat > "${ARTIFACTS_DEPLOY_DIR}/operator/kustomization.yaml" << EOF
 resources:
 - ${source_url}/${revision}/deploy/operator.yaml
@@ -72,7 +77,17 @@ patches:
             env:
             - name: SCYLLA_OPERATOR_IMAGE
               value: "${operator_image_ref}"
+- patch: |-
+    - op: add
+      path: /spec/template/spec/containers/0/args/-
+      value: "--loglevel=${SO_SCYLLA_OPERATOR_LOGLEVEL}"
+  target:
+    group: apps
+    version: v1
+    kind: Deployment
+    name: scylla-operator
 EOF
+
 kubectl kustomize "${ARTIFACTS_DEPLOY_DIR}/operator" | kubectl_create -n=scylla-operator -f=-
 
 # Manager needs scylla CRD registered and the webhook running
@@ -96,41 +111,52 @@ else
   echo "Skipping CSI driver creation"
 fi
 
-if [[ -z "${SO_SCYLLACLUSTER_STORAGECLASS_NAME+x}" ]]; then
-  kubectl_create -n=scylla-manager -f="${source_url}/${revision}/deploy/manager-prod.yaml"
-elif [[ -n "${SO_SCYLLACLUSTER_STORAGECLASS_NAME}" ]]; then
-  cat > "${ARTIFACTS_DEPLOY_DIR}/manager/kustomization.yaml" << EOF
+cat > "${ARTIFACTS_DEPLOY_DIR}/manager/kustomization.yaml" << EOF
 resources:
 - ${source_url}/${revision}/deploy/manager-prod.yaml
 patches:
-- target:
-    group: scylla.scylladb.com
+- patch: |-
+    - op: add
+      path: /spec/template/spec/containers/0/args/-
+      value: "--loglevel=${SO_SCYLLA_OPERATOR_LOGLEVEL}"
+  target:
+    group: apps
     version: v1
-    kind: ScyllaCluster
-    name: scylla-manager-cluster
-  patch: |
-    - op: replace
-      path: /spec/datacenter/racks/0/storage/storageClassName
-      value: "${SO_SCYLLACLUSTER_STORAGECLASS_NAME}"
+    kind: Deployment
+    name: scylla-manager-controller
 EOF
-  kubectl kustomize "${ARTIFACTS_DEPLOY_DIR}/manager" | kubectl_create -n=scylla-manager -f=-
-else
-  cat > "${ARTIFACTS_DEPLOY_DIR}/manager/kustomization.yaml" << EOF
-resources:
-- ${source_url}/${revision}/deploy/manager-prod.yaml
-patches:
-- target:
-    group: scylla.scylladb.com
-    version: v1
-    kind: ScyllaCluster
-    name: scylla-manager-cluster
-  patch: |
-    - op: remove
-      path: /spec/datacenter/racks/0/storage/storageClassName
+
+if [[ -n "${SO_SCYLLACLUSTER_STORAGECLASS_NAME:-}" ]]; then
+  # SO_SCYLLACLUSTER_STORAGECLASS_NAME is set and nonempty.
+  cat << EOF | \
+yq eval-all --inplace 'select(fileIndex == 0) as $f | select(fileIndex == 1) as $p | with( $f.patches; . += $p | ... style="") | $f' "${ARTIFACTS_DEPLOY_DIR}/manager/kustomization.yaml" -
+patch: |-
+  - op: replace
+    path: /spec/datacenter/racks/0/storage/storageClassName
+    value: "${SO_SCYLLACLUSTER_STORAGECLASS_NAME}"
+target:
+  group: scylla.scylladb.com
+  version: v1
+  kind: ScyllaCluster
+  name: scylla-manager-cluster
+EOF
+elif [[ -n "${SO_SCYLLACLUSTER_STORAGECLASS_NAME+x}" ]]; then
+  # SO_SCYLLACLUSTER_STORAGECLASS_NAME is set and empty.
+  cat << EOF | \
+yq eval-all --inplace 'select(fileIndex == 0) as $f | select(fileIndex == 1) as $p | with( $f.patches; . += $p | ... style="") | $f' "${ARTIFACTS_DEPLOY_DIR}/manager/kustomization.yaml" -
+patch: |-
+  - op: remove
+    path: /spec/datacenter/racks/0/storage/storageClassName
+target:
+  group: scylla.scylladb.com
+  version: v1
+  kind: ScyllaCluster
+  name: scylla-manager-cluster
 EOF
-  kubectl kustomize "${ARTIFACTS_DEPLOY_DIR}/manager" | kubectl_create -n=scylla-manager -f=-
 fi
 
+kubectl kustomize "${ARTIFACTS_DEPLOY_DIR}/manager" | kubectl_create -n=scylla-manager -f=-
+
 kubectl -n=scylla-manager wait --timeout=5m --for='condition=Progressing=False' scyllaclusters.scylla.scylladb.com/scylla-manager-cluster
 kubectl -n=scylla-manager wait --timeout=5m --for='condition=Degraded=False' scyllaclusters.scylla.scylladb.com/scylla-manager-cluster
 kubectl -n=scylla-manager wait --timeout=5m --for='condition=Available=True' scyllaclusters.scylla.scylladb.com/scylla-manager-cluster
diff --git a/hack/ci-deploy.sh b/hack/ci-deploy.sh
index d4dae040a9d..70e9578ee49 100755
--- a/hack/ci-deploy.sh
+++ b/hack/ci-deploy.sh
@@ -37,6 +37,13 @@ for f in $( find "${DEPLOY_DIR}"/ -type f -name '*.yaml' ); do
     sed -i -E -e "s~docker\.io/scylladb/scylla-operator:[^ @]+$~${OPERATOR_IMAGE_REF}~" "${f}"
 done
 
+# TODO: Replace it with ScyllaOperatorConfig field when available.
+# Ref: https://github.com/scylladb/scylla-operator/issues/2314.
+SO_SCYLLA_OPERATOR_LOGLEVEL="${SO_SCYLLA_OPERATOR_LOGLEVEL:-4}"
+export SO_SCYLLA_OPERATOR_LOGLEVEL
+yq e --inplace '.spec.template.spec.containers[0].args += "--loglevel=" + env(SO_SCYLLA_OPERATOR_LOGLEVEL)' "${DEPLOY_DIR}/operator/50_operator.deployment.yaml"
+yq e --inplace '.spec.template.spec.containers[0].args += "--loglevel=" + env(SO_SCYLLA_OPERATOR_LOGLEVEL)' "${DEPLOY_DIR}/manager/50_controller_deployment.yaml"
+
 yq e --inplace '.spec.template.spec.containers[0].args += ["--qps=200", "--burst=400"]' "${DEPLOY_DIR}/operator/50_operator.deployment.yaml"
 yq e --inplace '.spec.template.spec.containers[0].args += ["--crypto-key-buffer-size-min=3", "--crypto-key-buffer-size-max=6", "--crypto-key-buffer-delay=2s"]' "${DEPLOY_DIR}/operator/50_operator.deployment.yaml"