{
  "schema_version": 2,
  "id": "operate/kubernetes/deployment/quick-start",
  "title": "Deploy Redis Enterprise Software for Kubernetes",
  "url": "https://redis.io/docs/latest/operate/kubernetes/deployment/quick-start/",
  "summary": "How to install Redis Enterprise Software for Kubernetes.",
  "tags": [
    "docs",
    "operate",
    "kubernetes"
  ],
  "last_updated": "2026-09-28T16:14:52+01:00",
  "page_type": "content",
  "content_hash": "2ce2de102497352ae007b241c480a955ae791302aa1b348ebb0cdc6b44e2d6ca",
  "sections": [
    {
      "id": "overview",
      "title": "Overview",
      "role": "overview",
      "text": "To deploy Redis Enterprise Software for Kubernetes and start your Redis Enterprise cluster (REC), you need to do the following:\n\n- Create a new namespace in your Kubernetes cluster.\n- Download the operator bundle.\n- Apply the operator bundle and verify it's running.\n- Create a Redis Enterprise cluster (REC).\n\nThis guide works with most supported Kubernetes distributions. If you're using OpenShift, see [Redis Enterprise on OpenShift](https://redis.io/docs/latest/operate/kubernetes/deployment/openshift). For details on what is currently supported, see [supported distributions](https://redis.io/docs/latest/operate/kubernetes/reference/supported_k8s_distributions)."
    },
    {
      "id": "prerequisites",
      "title": "Prerequisites",
      "role": "content",
      "text": "To deploy Redis Enterprise for Kubernetes, you'll need:\n\n- Kubernetes cluster in a [supported distribution](https://redis.io/docs/latest/operate/kubernetes/reference/supported_k8s_distributions)\n- minimum of three worker nodes\n- Kubernetes client (kubectl)\n- access to DockerHub, RedHat Container Catalog, or a private repository that can hold the required images.\n\nIf you suspect your file descriptor limits are below 100,000, you must either manually increase limits or [Allow automatic resource adjustment](https://redis.io/docs/latest/operate/kubernetes/security/allow-resource-adjustment). Most major cloud providers and standard container runtime configurations set default file descriptor limits well above the minimum required by Redis Enterprise. In these environments, you can safely run without enabling automatic resource adjustment.\n\n> [!NOTE]\n> If you are applying version 7.8.2-6 or above, check if the [OS](https://redis.io/docs/latest/operate/kubernetes/release-notes/7-8-2-releases/7-8-2-6-nov24/#breaking-changes) installed on the node is supported."
    },
    {
      "id": "create-a-new-namespace",
      "title": "Create a new namespace",
      "role": "content",
      "text": "**Important:** Each namespace can only contain one Redis Enterprise cluster. Multiple RECs with different operator versions can coexist on the same Kubernetes cluster, as long as they are in separate namespaces.\n\nThroughout this guide, each command is applied to the namespace in which the Redis Enterprise cluster operates.\n\n1. Create a new namespace\n\n    [code example]\n\n1. Change the namespace context to make the newly created namespace default for future commands.\n\n    [code example]\n\nYou can use an existing namespace as long as it does not contain any existing Redis Enterprise cluster resources. It's best practice to create a new namespace to make sure there are no Redis Enterprise resources that could interfere with the deployment."
    },
    {
      "id": "install-the-operator",
      "title": "Install the operator",
      "role": "setup",
      "text": "Redis Enterprise for Kubernetes bundle is published as a container image. A list of required images is available in the [release notes](https://redis.io/docs/latest/operate/kubernetes/release-notes) for each version.\n\nThe operator [definition and reference materials](https://github.com/RedisLabs/redis-enterprise-k8s-docs) are available on GitHub. The operator definitions are [packaged as a single generic YAML file](https://github.com/RedisLabs/redis-enterprise-k8s-docs/blob/master/bundle.yaml).\n\n> [!NOTE]\n> If you do not pull images from DockerHub or another public registry, you need to use a [private container registry](https://redis.io/docs/latest/operate/kubernetes/deployment/container-images#manage-image-sources)."
    },
    {
      "id": "download-the-operator-bundle",
      "title": "Download the operator bundle",
      "role": "content",
      "text": "Pull the latest version of the operator bundle:\n\n[code example]\n\n  If you need a different release, replace `VERSION` with a specific release tag.\n\n  Check version tags listed with the [operator releases on GitHub](https://github.com/RedisLabs/redis-enterprise-k8s-docs/releases) or by [using the GitHub API](https://docs.github.com/en/rest/reference/repos#releases) to ensure the version of the bundle is correct."
    },
    {
      "id": "deploy-the-operator-bundle",
      "title": "Deploy the operator bundle",
      "role": "content",
      "text": "Apply the operator bundle in your REC namespace:\n\n[code example]\n\n  You should see a result similar to this:\n\n  [code example]\n\n> [!WARNING]\n> DO NOT modify or delete the StatefulSet created during the deployment process. Doing so could destroy your Redis Enterprise cluster (REC).\n\n#### Verify the operator is running\n\nCheck the operator deployment to verify it's running in your namespace:\n\n[code example]\n\nYou should see a result similar to this:\n\n[code example]"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec",
      "title": "Create a Redis Enterprise cluster (REC)",
      "role": "content",
      "text": "A Redis Enterprise cluster (REC) is created from a `RedisEnterpriseCluster` custom resource\nthat contains cluster specifications.\n\nThe following example creates a minimal Redis Enterprise cluster. See the [RedisEnterpriseCluster API reference](https://redis.io/docs/latest/operate/kubernetes/reference/api/redis_enterprise_cluster_api) for more information on the various options available.\n\n> [!NOTE]\n> If you suspect your file descriptor limits are below 100,000, you must either manually increase limits or [Allow automatic resource adjustment](https://redis.io/docs/latest/operate/kubernetes/security/allow-resource-adjustment). Most major cloud providers and standard container runtime configurations set default file descriptor limits well above the minimum required by Redis Enterprise. In these environments, you can safely run without enabling automatic resource adjustment.\n\n1. Create a file that defines a Redis Enterprise cluster with three nodes.\n\n    > [!NOTE]\n    > The REC name (`my-rec` in this example) cannot be changed after cluster creation.\n    >\n\n    [code example]\n\n   This will request a cluster with three Redis Enterprise nodes using the default requests (i.e., 2 CPUs and 4GB of memory per node).\n\n   To test with a larger configuration, use the example below to add node resources to the `spec` section of your test cluster (`my-rec.yaml`).\n\n    [code example]\n\n    > [!NOTE]\n    > Each cluster must have at least 3 nodes. Single-node RECs are not supported.\n    >\n\n    See the [Redis Enterprise hardware requirements](https://redis.io/docs/latest/operate/rs/installing-upgrading/install/plan-deployment/hardware-requirements) for more information on sizing Redis Enterprise node resource requests.\n  \n    > [!NOTE]\n    > If you enabled automatic resource adjustment in your configuration, this step will trigger the operator to apply elevated capabilities. Ensure your security context allows it.\n    >\n\n1. Apply your custom resource file in the same namespace as `my-rec.yaml`.\n\n    [code example]\n\n   You should see a result similar to this:\n\n   [code example]\n\n1. You can verify the creation of the cluster with:\n\n    [code example]\n\n    You should see a result similar to this:\n\n    [code example]\n\n    At this point, the operator will go through the process of creating various services and pod deployments.\n\n    You can track the progress by examining the StatefulSet associated with the cluster:\n\n    [code example]\n\n    or by looking at the status of all of the resources in your namespace:\n\n    [code example]"
    },
    {
      "id": "enable-the-admission-controller",
      "title": "Enable the admission controller",
      "role": "content",
      "text": "The admission controller dynamically validates REDB resources configured by the operator. It is strongly recommended that you use the admission controller on your Redis Enterprise Cluster (REC). The admission controller only needs to be configured once per operator deployment.\n\nAs part of the REC creation process, the operator stores the admission controller certificate in a Kubernetes secret called `admission-tls`. You may have to wait a few minutes after creating your REC to see the secret has been created.\n\n1. Verify the `admission-tls` secret exists.\n\n    [code example]\n  \n    The output should look similar to\n  \n    [code example]\n\n1. Save the certificate to a local environment variable.\n\n    [code example]\n\n1. Create a Kubernetes validating webhook, replacing `<namespace>` with the namespace where the REC was installed.\n\n    The `webhook.yaml` template can be found in [redis-enterprise-k8s-docs/admission](https://github.com/RedisLabs/redis-enterprise-k8s-docs/tree/master/admission)\n\n    [code example]\n\n1. Create a patch file for the Kubernetes validating webhook.\n\n    [code example]\n\n1. Patch the webhook with the certificate.\n\n    [code example]"
    },
    {
      "id": "webhook",
      "title": "Limit the webhook to the relevant namespaces",
      "role": "limits",
      "text": "The operator bundle includes a webhook file. The webhook will intercept requests from all namespaces unless you edit it to target a specific namespace. You can do this by adding the `namespaceSelector` section to the webhook spec to target a label on the namespace.\n\n1. Make sure the namespace has a unique `namespace-name` label.\n\n    [code example]\n\n1. Patch the webhook to add the `namespaceSelector` section.\n\n    [code example]\n\n1. Apply the patch.\n\n    [code example]"
    },
    {
      "id": "verify-the-admission-controller-is-working",
      "title": "Verify the admission controller is working",
      "role": "content",
      "text": "1. Verify the admission controller is installed correctly by applying an invalid resource. This should force the admission controller to correct it.\n\n    [code example]\n\n    You should see your request was denied by the `admission webhook \"redisenterprise.admission.redislabs\"`.\n\n    [code example]"
    },
    {
      "id": "add-user-defined-modules-optional",
      "title": "Add user-defined modules (optional)",
      "role": "content",
      "text": "If you plan to create databases that use user-defined modules (custom non-bundled modules), you must add them to the REC custom resource before creating the databases.\n\nSee [User-defined modules](https://redis.io/docs/latest/operate/kubernetes/re-databases/modules#user-defined-modules) for detailed instructions on adding and configuring custom modules."
    },
    {
      "id": "create-a-redis-enterprise-database-redb",
      "title": "Create a Redis Enterprise Database (REDB)",
      "role": "content",
      "text": "You can create multiple databases within the same namespace as your REC or in other namespaces.\n\nSee [manage Redis Enterprise databases for Kubernetes](https://redis.io/docs/latest/operate/kubernetes/re-databases/db-controller) to create a new REDB."
    }
  ],
  "examples": [
    {
      "id": "create-a-new-namespace-ex0",
      "language": "sh",
      "code": "kubectl create namespace <rec-namespace>",
      "section_id": "create-a-new-namespace"
    },
    {
      "id": "create-a-new-namespace-ex1",
      "language": "sh",
      "code": "kubectl config set-context --current --namespace=<rec-namespace>",
      "section_id": "create-a-new-namespace"
    },
    {
      "id": "download-the-operator-bundle-ex0",
      "language": "sh",
      "code": "VERSION=`curl --silent https://api.github.com/repos/RedisLabs/redis-enterprise-k8s-docs/releases/latest | grep tag_name | awk -F'\"' '{print $4}'`",
      "section_id": "download-the-operator-bundle"
    },
    {
      "id": "deploy-the-operator-bundle-ex0",
      "language": "sh",
      "code": "kubectl apply -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/$VERSION/bundle.yaml",
      "section_id": "deploy-the-operator-bundle"
    },
    {
      "id": "deploy-the-operator-bundle-ex1",
      "language": "sh",
      "code": "role.rbac.authorization.k8s.io/redis-enterprise-operator created\n  serviceaccount/redis-enterprise-operator created\n  rolebinding.rbac.authorization.k8s.io/redis-enterprise-operator created\n  customresourcedefinition.apiextensions.k8s.io/redisenterpriseclusters.app.redislabs.com configured\n  customresourcedefinition.apiextensions.k8s.io/redisenterprisedatabases.app.redislabs.com configured\n  deployment.apps/redis-enterprise-operator created",
      "section_id": "deploy-the-operator-bundle"
    },
    {
      "id": "deploy-the-operator-bundle-ex2",
      "language": "sh",
      "code": "kubectl get deployment redis-enterprise-operator",
      "section_id": "deploy-the-operator-bundle"
    },
    {
      "id": "deploy-the-operator-bundle-ex3",
      "language": "sh",
      "code": "NAME                        READY   UP-TO-DATE   AVAILABLE   AGE\nredis-enterprise-operator   1/1     1            1           0m36s",
      "section_id": "deploy-the-operator-bundle"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec-ex0",
      "language": "sh",
      "code": "cat <<EOF > my-rec.yaml\n    apiVersion: \"app.redislabs.com/v1\"\n    kind: \"RedisEnterpriseCluster\"\n    metadata:\n      name: my-rec\n    spec:\n      nodes: 3\n    EOF",
      "section_id": "create-a-redis-enterprise-cluster-rec"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec-ex1",
      "language": "sh",
      "code": "redisEnterpriseNodeResources:\n      limits:\n        cpu: 2000m\n        memory: 16Gi\n      requests:\n        cpu: 2000m\n        memory: 16Gi",
      "section_id": "create-a-redis-enterprise-cluster-rec"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec-ex2",
      "language": "sh",
      "code": "kubectl apply -f my-rec.yaml",
      "section_id": "create-a-redis-enterprise-cluster-rec"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec-ex3",
      "language": "sh",
      "code": "redisenterprisecluster.app.redislabs.com/my-rec created",
      "section_id": "create-a-redis-enterprise-cluster-rec"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec-ex4",
      "language": "sh",
      "code": "kubectl get rec",
      "section_id": "create-a-redis-enterprise-cluster-rec"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec-ex5",
      "language": "sh",
      "code": "NAME           AGE\n    my-rec   1m",
      "section_id": "create-a-redis-enterprise-cluster-rec"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec-ex6",
      "language": "sh",
      "code": "kubectl rollout status sts/my-rec",
      "section_id": "create-a-redis-enterprise-cluster-rec"
    },
    {
      "id": "create-a-redis-enterprise-cluster-rec-ex7",
      "language": "sh",
      "code": "kubectl get all",
      "section_id": "create-a-redis-enterprise-cluster-rec"
    },
    {
      "id": "enable-the-admission-controller-ex0",
      "language": "sh",
      "code": "kubectl get secret admission-tls",
      "section_id": "enable-the-admission-controller"
    },
    {
      "id": "enable-the-admission-controller-ex1",
      "language": "sh",
      "code": "NAME            TYPE     DATA   AGE\n    admission-tls   Opaque   2      2m43s",
      "section_id": "enable-the-admission-controller"
    },
    {
      "id": "enable-the-admission-controller-ex2",
      "language": "sh",
      "code": "CERT=`kubectl get secret admission-tls -o jsonpath='{.data.cert}'`",
      "section_id": "enable-the-admission-controller"
    },
    {
      "id": "enable-the-admission-controller-ex3",
      "language": "sh",
      "code": "sed 's/OPERATOR_NAMESPACE/<namespace>/g' webhook.yaml | kubectl create -f -",
      "section_id": "enable-the-admission-controller"
    },
    {
      "id": "enable-the-admission-controller-ex4",
      "language": "sh",
      "code": "cat > modified-webhook.yaml <<EOF\n    webhooks:\n    - name: redisenterprise.admission.redislabs\n      clientConfig:\n       caBundle: $CERT\n    EOF",
      "section_id": "enable-the-admission-controller"
    },
    {
      "id": "enable-the-admission-controller-ex5",
      "language": "sh",
      "code": "kubectl patch ValidatingWebhookConfiguration \\\n        redis-enterprise-admission --patch \"$(cat modified-webhook.yaml)\"",
      "section_id": "enable-the-admission-controller"
    },
    {
      "id": "webhook-ex0",
      "language": "sh",
      "code": "apiVersion: v1\n    kind: Namespace\n    metadata:\n      name: example-ns\n      labels:\n        namespace-name: example-ns",
      "section_id": "webhook"
    },
    {
      "id": "webhook-ex1",
      "language": "sh",
      "code": "cat > modified-webhook.yaml <<EOF\n    webhooks:\n    - name: redisenterprise.admission.redislabs\n      namespaceSelector:\n        matchLabels:\n          namespace-name: example-ns\n    EOF",
      "section_id": "webhook"
    },
    {
      "id": "webhook-ex2",
      "language": "sh",
      "code": "kubectl patch ValidatingWebhookConfiguration \\\n      redis-enterprise-admission --patch \"$(cat modified-webhook.yaml)\"",
      "section_id": "webhook"
    },
    {
      "id": "verify-the-admission-controller-is-working-ex0",
      "language": "sh",
      "code": "kubectl apply -f - << EOF\n    apiVersion: app.redislabs.com/v1alpha1\n    kind: RedisEnterpriseDatabase\n    metadata:\n      name: redis-enterprise-database\n    spec:\n      evictionPolicy: illegal\n    EOF",
      "section_id": "verify-the-admission-controller-is-working"
    },
    {
      "id": "verify-the-admission-controller-is-working-ex1",
      "language": "sh",
      "code": "Error from server: error when creating \"STDIN\": admission webhook \"redisenterprise.admission.redislabs\" denied the request: eviction_policy: u'illegal' is not one of [u'volatile-lru', u'volatile-ttl', u'volatile-random', u'allkeys-lru', u'allkeys-random', u'noeviction', u'volatile-lfu', u'allkeys-lfu']",
      "section_id": "verify-the-admission-controller-is-working"
    }
  ]
}
