# Tech talk/demo: Deploying multiple Open edX instances onto a Kubernetes Cluster with Tutor

**URL:** <https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641>\
**Category:** Collaborative Proposals\
**Tags:** devops, tutor, k8s\
**Created:** [March 31, 2021, 6:22pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641 "2021-03-31T18:22:29Z")\
**Posts on this page:** 20\
**Page:** 3

<div class="post-metadata">

**Author:** ![dbates](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/dbates/32/2850_2.png) [@dbates](https://discuss.openedx.org/u/dbates)\
**Post date:** [May 10, 2022, 5:29pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/42 "2022-05-10T17:29:40Z")

</div>

Hi Jhony it is recorded I just havn’t had time to upload and link it yet I should be able to this evening

---

<div class="post-metadata">

**Author:** ![jhony\_avella](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/jhony_avella/32/710_2.png) [@jhony\_avella](https://discuss.openedx.org/u/jhony_avella)\
**Post date:** [May 10, 2022, 6:25pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/43 "2022-05-10T18:25:16Z")

</div>

Hey @dbates thanks so much! Please tag me once this is ready

---

<div class="post-metadata">

**Author:** ![dbates](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/dbates/32/2850_2.png) [@dbates](https://discuss.openedx.org/u/dbates)\
**Post date:** [May 10, 2022, 7:09pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/44 "2022-05-10T19:09:22Z")

</div>

Jhony bad news and good news

The file was recorded but only for a few minutes. It seems they ended up using peters account to run the session @pdpinch Did you manage to record it?

---

<div class="post-metadata">

**Author:** ![keithgg](https://avatars.discourse-cdn.com/v4/letter/k/ecb155/32.png) [@keithgg](https://discuss.openedx.org/u/keithgg)\
**Post date:** [May 17, 2022, 2:23pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/45 "2022-05-17T14:23:14Z")

</div>

@kmccormick as a backup to the recording, do you mind posting the notes taken during the BTR meeting we held at the conference here?

---

<div class="post-metadata">

**Author:** ![kmccormick](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/kmccormick/32/8982_2.png) [@kmccormick](https://discuss.openedx.org/u/kmccormick)\
**Post date:** [May 17, 2022, 3:01pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/46 "2022-05-17T15:01:31Z")

</div>

@keithgg Got you covered → [https://discuss.openedx.org/t/build-test-release-notes-lisbon-2022](https://discuss.openedx.org/t/build-test-release-notes-lisbon-2022)

Notetaking that session was pretty frantic, let me know if anything there doesn’t make sense 🙂

---

<div class="post-metadata">

**Author:** ![Andres.Aulasneo](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/andres.aulasneo/32/984_2.png) [@Andres.Aulasneo](https://discuss.openedx.org/u/Andres.Aulasneo)\
**Post date:** [May 18, 2022, 11:02am UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/47 "2022-05-18T11:02:49Z")

</div>

Hi all,  
I would like to write down a brief summary of our experience about Kubernetes and Tutor implementations. Your comments will be appreciated!

I have created [a separate post](https://discuss.openedx.org/t/open-edx-cloud-reference-architecture/7277) to discuss about infrastructure reference architecture.

These are some of our findings:

- Multiple Open edX instances can be deployed in a single cluster, assigning one namespace to each Open edX instance.
- K8s is straightforward for stateless pods. However, for stateful parts of the application, special care is needed.
- databases and storage apart, lms, lms-worker, cms, cms-worker, mfe and forum are stateless, so should work fine without much care.
- databases are complex systems.  
– We have four: MySQL, MongoDB, Redis and ElasticSearch.  
– Each of them have a different and specific dynamics, in terms of escalation and redundancy. An incorrect setup may lead to data loss, downgraded performance, loss of synchronization, etc.  
– Setting up a database properly in K8s may need a careful tuning, different for each technology.  
– Our conclusion is that it is better to rely on the cloud provider’s services for databases, and let them manage redundancy, scalability, fine tuning, updates, etc.
- File storage can be managed by  
– out-of-the-box MinIO, but in this case files are stored in a block service (see next)  
– rely on the cloud provider’s file storage service (S3 for AWS), which is our option
- Block storage: Stateful pods need a place to store persistent data. In K8s, it’s the PV ([Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)). The actual location and driver for each PV is defined in a [storage class](https://kubernetes.io/docs/concepts/storage/storage-classes/). The default storage class uses the node’s storage to allocate space to the PV. This is not the best option, as the data will not survive a node recreation, or a pod recreation in another node. If we want a scalable and resilient block storage, we need to use a NFS (network file system) PV, which can be complex to setup and dependent on the cloud provider.
- However, if the databases are left out of the cluster and lms, cms and plugins are stateless, there is no need to use block storage. With one exception:
- Caddy, which deserves a separate paragraph.

The next post is about databases.

---

<div class="post-metadata">

**Author:** ![Andres.Aulasneo](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/andres.aulasneo/32/984_2.png) [@Andres.Aulasneo](https://discuss.openedx.org/u/Andres.Aulasneo)\
**Post date:** [May 18, 2022, 11:48am UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/48 "2022-05-18T11:48:36Z")

</div>

## Databases

I would like to differentiate here two concepts that are usually mixed:

- the _database engine_, of which we have four: MySQL, MongoDB, Redis, ElasticSearch
- the _database_ itself, as the logical organization of data inside each database engine. There can be more than one in each engine.

It is important, because we wanted to minimize infrastructure resources (therefore costs), by sharing as much infrastructure as possible.

Modern database engines are powerful pieces of software, that can handle huge amounts of data. So the idea is to have one _database engine_ of each type for the whole cluster, and one _database_ for each Open edX instance in the cluster (which means, one k8s namespace).

Most of our findings are about AWS services for the database engines.

# MySQL

AWS offers two options: [MySQL RDS for MySQL](https://aws.amazon.com/rds/mysql/) and [Aurora/MySQL](https://aws.amazon.com/rds/aurora/). Aurora should be the best option, as is fully MySQL compatible, has lower costs and is optimized for AWS cloud resources. It can be configured to have multiple read replicas in several AZ.  
We are creating one database for each Open edX installation.  
Regarding backup, AWS backup is great but works at the _database engine_ level (again confusing with the _database_ concept). I asked the AWS guys about this, and looks like they do not support per-database backup currently. This means that if you have multiple Open edX instances and you want to restore only one, you cannot: you have to restore them all. So, for a one-by-one backup, the old dump-and-backup-to-s3 strategy is the only option.

# MongoDB

AWS offers some options:

- [DynamoDB](https://aws.amazon.com/dynamodb/?nc1=h_ls): Don’t even try. It’s not compatible with MongoDB.
- [DocumentDB](https://aws.amazon.com/documentdb/?nc2=type_a): There is an [old discussion](https://discuss.openedx.org/t/migrate-mongodb-to-aws-documentdb/3336) about this. Although they say it’s compatible with MongoDB, it is not 100%. In a recent talk with one AWS engineers, they confirmed that these incompatibilities are still present.
- [Atlas](https://aws.amazon.com/quickstart/architecture/mongodb-atlas/): It’s the official MongoDB, so should be 100% compatible. Too expensive for us to try.
- [MongoDB quickstart](https://docs.aws.amazon.com/quickstart/latest/mongodb/welcome.html): it’s a CloudFormation template that creates a MongoDB cluster in your VPC. It’s our option and so far worked well.

Open edX requires one database for the modulestore. If you are using forum, it will require another database.

As [MongoDB is close to be deprecated](https://discuss.openedx.org/t/adr-for-removing-mongodb-from-edx-platform/6001), I wouldn’t spend much effort in it.

# Redis

Redis is used for two main purposes in Open edX: cache and as backend for celery queues.  
The concept of _database_ in Redis is weird: they don’t have named databases, but a _redis index_ number from 0 to 15. As we need two per Open edX instance, we have a limit of 8 Open edX instances per Redis instance.  
If anyone knows how to overcome this limitation, it will be much appreciated!  
We’ve been using [AWS ElastiCache for Redis](https://aws.amazon.com/elasticache/redis/) and works well so far.

# ElasticSearch

We’ve been trying [AWS OpenSearch](https://aws.amazon.com/opensearch-service/?nc=bc&pg=wik). It is probably the most expensive service and difficult to escalate. We had to create a new domain for each Open edX instance, which creates a new set of resources.  
So if anybody found a better way to escalate this service, again will be much appreciated.

---

<div class="post-metadata">

**Author:** ![keithgg](https://avatars.discourse-cdn.com/v4/letter/k/ecb155/32.png) [@keithgg](https://discuss.openedx.org/u/keithgg)\
**Post date:** [May 20, 2022, 2:14pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/49 "2022-05-20T14:14:10Z")

</div>

Thank you @kmccormick!

To summarise:

- OpenCraft has [Grove](https://grove.opencraft.com) [under heavy development]
- Lawrence has [Cookiecutter](https://github.com/lpm0073/cookiecutter-openedx-devops)
- EduNext has Shipyard which isn’t open source.

We all approach deploying Open edX similarly (please let me know if I’m mistaken):

1. Terraform provisions the infra
2. Kubernetes runs the app which is deployed with
3. Tutor

Our approaches to each of these are different [especially with respect to build pipelines], but there seems to be a lot of commonality especially with Terraform so it makes sense to try and collaborate to share the maintenance burden.

What would be the best next steps here? @lpm0073 do you think it might be worthwhile to somehow integrate Grove’s terraform code into your project? There are some differences (especially with MongoDB we’re using Atlas instead), but it seems like a good way to start.

cc: @gabor @braden

---

<div class="post-metadata">

**Author:** ![lpm0073](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/lpm0073/32/45_2.png) [@lpm0073](https://discuss.openedx.org/u/lpm0073)\
**Post date:** [May 20, 2022, 4:06pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/50 "2022-05-20T16:06:34Z")

</div>

Short answer is yes.

The Cookiecutter functionality grows as a function of whatever my clients request. Since our last meeting, in Lisbon, I’ve added more deployment logic for ecommerce, MFE, Discovery, and Credentials. I’ve also added some rudimentary tools for migrating native MySQL data to Tutor. Lastly, I reverted back to tutor’s default MongoDB service that runs “locally” on kubernetes as a pod, due to compatibility problems with AWS’ remote service. This however is also less than perfect, which you can read more here: [https://discuss.openedx.org](https://discuss.openedx.org/t/mongodb-intermittent-connection-timeout-errors-in-pymongo-topology-py/7278)

What’s primarily of interest to me in Grove are the Azure and GCC (or Digital Ocean??) capabilities as the Cookiecutter is AWS-only, though my clients are keenly interested in leveraging other, lower-cost cloud providers.

I’d be willing to get involved in the heavy lifting of making Grove’s Azure/GCC code work inside the Cookiecutter assuming that this would lead to others becoming involved afterwards to keep this new code maintained.

As it stands, and as I’d mentioned at the last meeting, the basic care and feeding of the AWS-specific Terraform code is more than I’d prefer. Net, the Cookiecutter is a good tool for me, for upgrading clients and for doing clean installations, and overall it does save me considerable time and I get more consistent results by using Terraform. But the maintenance is non-trivial 😩

---

<div class="post-metadata">

**Author:** ![gabor](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/gabor/32/2318_2.png) [@gabor](https://discuss.openedx.org/u/gabor)\
**Post date:** [May 23, 2022, 10:28pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/51 "2022-05-23T22:28:38Z")

</div>

> [@lpm0073](#):
>
> What’s primarily of interest to me in Grove are the Azure and GCC (or Digital Ocean??) capabilities

Just to clarify, that’s DigitalOcean and AWS, though I cannot see any problems with supporting other providers that has proper kubernetes and terraform support like GCP, Azure or similar, though that requires some effort to define the provider specific resources – that’s way less effort than extending the Cookiecutter functionality, I believe.

Depending on the terraform provider’s “verbosity”, the necessary amount of code needed differs a lot, but it worth to check out the [aws-provider](https://gitlab.com/opencraft/dev/grove/-/tree/main/provider-aws) and [digitalocean-provider](https://gitlab.com/opencraft/dev/grove/-/tree/main/provider-digitalocean) in the repo. (DigitalOcean is lot less code and most of the components are [shared](https://gitlab.com/opencraft/dev/grove/-/tree/main/provider-modules) to reduce the complexity you mentioned too)

---

<div class="post-metadata">

**Author:** ![braden](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/braden/32/46_2.png) [@braden](https://discuss.openedx.org/u/braden)\
**Post date:** [June 7, 2022, 5:54pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/52 "2022-06-07T17:54:21Z")

</div>

> [@Andres.Aulasneo](#):
>
> As we need two per Open edX instance, we have a limit of 8 Open edX instances per Redis instance.  
> If anyone knows how to overcome this limitation, it will be much appreciated!  
> We’ve been using [AWS ElastiCache for Redis](https://aws.amazon.com/elasticache/redis/) and works well so far.

@Andres.Aulasneo We encountered some related limitations, so for now we just have Tutor deploy a separate Redis instance for each Open edX instance. Redis has very minimal memory overhead and that way it’s easier to set a per-instance cache limit.

---

<div class="post-metadata">

**Author:** ![antoviaque](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/antoviaque/32/32_2.png) [@antoviaque](https://discuss.openedx.org/u/antoviaque)\
**Post date:** [June 8, 2022, 10:04am UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/53 "2022-06-08T10:04:12Z")

</div>

To help establishing what we agree to develop, use and maintain in common, it could be useful to describe it in a OEP? It could become the standard/supported Open edX solution for large deployments, helping to focus usage and contribution activity on this within the community? Nobody would be forced to use it, but that could help bringing more providers to use it and maintain it with us?

---

<div class="post-metadata">

**Author:** ![Andres.Aulasneo](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/andres.aulasneo/32/984_2.png) [@Andres.Aulasneo](https://discuss.openedx.org/u/Andres.Aulasneo)\
**Post date:** [June 8, 2022, 2:33pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/54 "2022-06-08T14:33:55Z")

</div>

The idea behind removing Redis from the cluster is that it is a stateful component, and the volume is by default in the node’s storage.  
During failover tests, I’ve found that if you kill a node, a new node is generated, and all lost pods are recreated in the new node. However, stateful pods may fail due to node affinity if the new node is in a different AZ from the original. The final solution for this is to use NFS volumes, but this is too complicated for such a simple deployment. That’s why we preferred to remove Redis from the cluster. Maybe you have a better solution for this!  
Besides Redis, the only stateful pod is Caddy. For this we found that using an Emptydir volume fixes the problem, but I’m still in doubt.

---

<div class="post-metadata">

**Author:** ![Andres.Aulasneo](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/andres.aulasneo/32/984_2.png) [@Andres.Aulasneo](https://discuss.openedx.org/u/Andres.Aulasneo)\
**Post date:** [June 8, 2022, 2:42pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/55 "2022-06-08T14:42:50Z")

</div>

I think that we should have an official _reference architecture_ that meets all the best practices for a full scale production environment. As you said, then each one can choose to what extent to implement. But at least we should depict the best practices and desirable characteristics of such a deployment (security, resiliency, scalability, etc.) and how to achieve them.  
AWS has the [well-architected framework](https://docs.aws.amazon.com/wellarchitected/latest/framework/welcome.html) that can be used to start. It is quite general, and can be applied to any cloud or on-premise

---

<div class="post-metadata">

**Author:** ![braden](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/braden/32/46_2.png) [@braden](https://discuss.openedx.org/u/braden)\
**Post date:** [June 8, 2022, 10:49pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/56 "2022-06-08T22:49:25Z")

</div>

> [@Andres.Aulasneo](#):
>
> The idea behind removing Redis from the cluster is that it is a stateful component, and the volume is by default in the node’s storage.

Ah, I see. We don’t treat Redis as a stateful component. While Redis can be configured in a manner which allows for some stateful guarantees, we do not depend on these for production use and don’t recommend anyone put anything within it they are unwilling to lose. So that explains the different approach.

---

<div class="post-metadata">

**Author:** ![braden](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/braden/32/46_2.png) [@braden](https://discuss.openedx.org/u/braden)\
**Post date:** [June 9, 2022, 10:33pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/57 "2022-06-09T22:33:26Z")

</div>

@Andres.Aulasneo do you use Terraform or CloudFormation, or something else to manage your infrastructure? Since it seems like we’re going to work with @lpm0073 to see if we can adapt our Terraform repository to cover his use cases as well as ours, I’m wondering if it would be possible to also adapt it to be able to provision your reference architecture as well.

---

<div class="post-metadata">

**Author:** ![Andres.Aulasneo](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/andres.aulasneo/32/984_2.png) [@Andres.Aulasneo](https://discuss.openedx.org/u/Andres.Aulasneo)\
**Post date:** [June 9, 2022, 11:28pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/58 "2022-06-09T23:28:43Z")

</div>

I use aws CDK. I know nothing about Terraform, but it shouldn’t be difficult to learn. I wonder if Terraform can deploy any kind of aws resouce. It would be great if we all can join our efforts in one solution that’s better for all.

---

<div class="post-metadata">

**Author:** ![Felipe](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/felipe/32/60_2.png) [@Felipe](https://discuss.openedx.org/u/Felipe)\
**Post date:** [June 10, 2022, 5:36pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/59 "2022-06-10T17:36:15Z")

</div>

I have been trying to follow this discussion as it develops, but It was going faster than I could focus on it to reply with some of our thoughts from edunext.

Both this thread and the [cloud architecture for aws](https://discuss.openedx.org/t/open-edx-cloud-reference-architecture/7277/2) are very profound and the collaboration that is emerging is great. However I sense that it is focusing precisely on the part of the issue that will be more difficult to agree on.

Things like:

- using the same gitlab, github, bitbucket or any other git service + CI combination
- tenancy decisions: one install per cluster, install per namespace, multiple tenants per install
- the infrastructure we will run the openedx services in (aws, digital ocean, azure, …)
- how to sync the k8s manifest with the cluster

Also in my view, although the infrastructure provisioning can be a painful thing. It most often ends quite rapidly and you are good for a relatively long while. This is even more so once the switch to k8s is made. Provisioning the cluster is a one time thing, but keeping up with the manifest and what is inside of the cluster is what requires attention for longer. This was the initial idea we started with when we set up to develop shipyard at edunext.

I might as well be wrong on this and the push to make a reference installation starting from the cloud components and using terraform might be the way to go. I won’t stand in the way and we will undoubtedly collaborate on it and bring the experience that we have gathered to it. However I’d like to comment on a different approach. We have for years already agreed on good practices and patterns that we can leverage on for this:

- open/closed principle for architecture.
- tutor is a great software and it does it job very well
- kubernetes is a solid choice(even if some installations decide to use something else for orchestration)

Also we all know how big and unruly `configuration` grew up to be and we don’t want to follow the same steps with the main difference being that the code is split in a bunch of repos instead of one.

What I’m thinking here is that we could take some lessons from the governance of the big and complicated repos such as edx-platform and set up a project where we share our common experience of hosting and maintaining openedx installations specially those of larger sizes.

This piece of code should be very much oriented to ease of extension, but also it would have a well defined list of maintainers for the different parts of the core. The main goal of this project would be render files that can be used as a manifest for k8s that hosts open edX. How you apply this manifest to the cluster is everyone’s own choice. It could be using a hosted CI or with `tutor k8s init`. This would also be covered by the same ease of extension policy.

This is quite a raw idea and if was reading this I would be like “sounds nice, show me the code or I’d call bs”. Just throwing it here to see if there is any traction. I’ll get started on a prototype to prove to myself that this is actually worthwhile.

Further considerations:

- I’m talking about a flexible rendered and tutor is an amazing and extendable template and file manager. It follows naturally that the piece of code we write be a tutor plugin. What I’d like is for this project to lift the burden of supporting the issues that arise during operation tutor. If this is a non issue (which I don’t think it is) and we are better served by giving better support to the tutor plugins individually. Please say so.

- this project would probably be better off living on the openedx org so that there is no space for provider egos anywhere. It should also be covered by the core-commiter program.

cc @jhony_avella @MoisesGonzalezS @mgmdi

---

<div class="post-metadata">

**Author:** ![lpm0073](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/lpm0073/32/45_2.png) [@lpm0073](https://discuss.openedx.org/u/lpm0073)\
**Post date:** [June 16, 2022, 11:04pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/60 "2022-06-16T23:04:58Z")

</div>

I wanted to share a general update to this audience. This afternoon i released v1.0.0 of the [Cookiecutter](https://github.com/lpm0073/cookiecutter-openedx-devops), the first general production release for fully automated build & deploy onto AWS. I have a continued interest in porting this code base for Digital Ocean, GCC, Azure et al as well as other popular CI platforms.

Related: the original Github Actions build & deploy workflows have been refactored into a collection of reusable components that you’ll find here: [https://github.com/openedx-actions](https://github.com/openedx-actions). These components greatly simplify working with Open edX on Kubernetes and most are designed to work independently of the Cookiecutter itself. Today I also promoted several of these actions to v1.0.0. See the README’s on each regarding any details that might bear on your decision of whether of not to incorporate these into your projects. The following actions are now available for general production use:

- [openedx-actions/tutor-k8s-get-secret](https://github.com/openedx-actions/tutor-k8s-get-secret)
- [openedx-actions/tutor-k8s-init](https://github.com/openedx-actions/tutor-k8s-init)
- [openedx-actions/tutor-print-config](https://github.com/openedx-actions/tutor-print-config)
- [openedx-actions/tutor-print-dump](https://github.com/openedx-actions/tutor-print-dump)
- [openedx-actions/tutor-plugin-build-openedx](https://github.com/openedx-actions/tutor-plugin-build-openedx)
- [openedx-actions/tutor-plugin-build-openedx-add-requirement](https://github.com/openedx-actions/tutor-plugin-build-openedx-add-requirement)
- [openedx-actions/tutor-plugin-build-openedx-add-theme](https://github.com/openedx-actions/tutor-plugin-build-openedx-add-theme)
- [openedx-actions/tutor-k8s-configure-edx-secret](https://github.com/openedx-actions/tutor-k8s-configure-edx-secret)
- [openedx-actions/tutor-k8s-configure-jwt](https://github.com/openedx-actions/tutor-k8s-configure-jwt)
- [openedx-actions/tutor-k8s-configure-mysql](https://github.com/openedx-actions/tutor-k8s-configure-mysql)
- [openedx-actions/tutor-k8s-configure-redis](https://github.com/openedx-actions/tutor-k8s-configure-redis)
- [openedx-actions/tutor-k8s-configure-smtp](https://github.com/openedx-actions/tutor-k8s-configure-smtp)
- [openedx-actions/tutor-plugin-enable-discovery](https://github.com/openedx-actions/tutor-plugin-enable-discovery)
- [openedx-actions/tutor-plugin-enable-ecommerce](https://github.com/openedx-actions/tutor-plugin-enable-ecommerce)
- [openedx-actions/tutor-plugin-enable-forum](https://github.com/openedx-actions/tutor-plugin-enable-forum)
- [openedx-actions/tutor-plugin-enable-notes](https://github.com/openedx-actions/tutor-plugin-enable-notes)
- [openedx-actions/tutor-plugin-enable-s3](https://github.com/openedx-actions/tutor-plugin-enable-s3)
- [openedx-actions/tutor-plugin-enable-xqueue](https://github.com/openedx-actions/tutor-plugin-enable-xqueue)

---

<div class="post-metadata">

**Author:** ![lpm0073](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/lpm0073/32/45_2.png) [@lpm0073](https://discuss.openedx.org/u/lpm0073)\
**Post date:** [June 16, 2022, 11:23pm UTC](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641/61 "2022-06-16T23:23:09Z")

</div>

@Andres.Aulasneo “any kind of aws resource” is a very broad statement, however, i can confirm that to date i’ve been able to find high-quality vendor-supported Terraform components for everything that i needed for the Cookiecutter automation of building the AWS environment, which includes: VPC, EC2, EKS, ECR, RDS, IAM, S3, Elasticache, Certificate Manager and Route53.

[Previous page](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641.md?page=2)

[Next page](https://discuss.openedx.org/t/tech-talk-demo-deploying-multiple-open-edx-instances-onto-a-kubernetes-cluster-with-tutor/4641.md?page=4)
