Run multiple Gitea pods in Kubernetes #2418

Closed
opened 2025-11-02 04:35:26 -06:00 by GiteaMirror · 17 comments
Owner

Originally created by @abulfatmasimov on GitHub (Oct 18, 2018).

  • Gitea version (or commit ref): 1972383
  • Git version: 2.15.2
  • Operating system: Linux
  • Database (use [x]):
    • PostgreSQL
    • MySQL
    • MSSQL
    • SQLite
  • Can you reproduce the bug at https://try.gitea.io:
    • Yes (provide example URL)
    • No
    • Not relevant
  • Log gist:

Description

We would like to know if running multiple Gitea instances inside Kubernetes is supported. We managed to scale it up to run in multiple pods by pointing to the same database and using shared Kubernetes volume amongst pods via pointing paths in Gitea configuration to the shared volume. I do not see any problems so far, but would like to know what would be potential issues we could face with running multiple instances which share same database and storage.

Originally created by @abulfatmasimov on GitHub (Oct 18, 2018). - Gitea version (or commit ref): 1972383 - Git version: 2.15.2 - Operating system: Linux - Database (use `[x]`): - [x] PostgreSQL - [ ] MySQL - [ ] MSSQL - [ ] SQLite - Can you reproduce the bug at https://try.gitea.io: - [ ] Yes (provide example URL) - [ ] No - [x] Not relevant - Log gist: ## Description We would like to know if running multiple Gitea instances inside Kubernetes is supported. We managed to scale it up to run in multiple pods by pointing to the same database and using shared Kubernetes volume amongst pods via pointing paths in Gitea configuration to the shared volume. I do not see any problems so far, but would like to know what would be potential issues we could face with running multiple instances which share same database and storage.
GiteaMirror added the type/questionissue/stale labels 2025-11-02 04:35:26 -06:00
Author
Owner

@BetaCat0 commented on GitHub (Oct 19, 2018):

Hi @abulfat-masimov . Here's one problem you should care about so far is that the SSH key storage problem under multi-instance. Generally SSH public keys are stored in /data/gitea/ssh directory when using system based SSH tool. That may rasie an unexpected authorzation error using SSH for operations. I suggest enabling Gitea build-in SSH server by specifing START_SSH_SERVER = true and also change the SSH_LISTEN_PORT in [server] config part (still use default SSH_PORT = 22 for serving). You can take a look at Complete List for more infomation . Hope this can help.

@BetaCat0 commented on GitHub (Oct 19, 2018): Hi @abulfat-masimov . Here's one problem you should care about so far is that the SSH key storage problem under multi-instance. Generally SSH public keys are stored in `/data/gitea/ssh` directory when using system based SSH tool. That may rasie an unexpected authorzation error using SSH for operations. I suggest enabling Gitea build-in SSH server by specifing `START_SSH_SERVER = true` and also change the `SSH_LISTEN_PORT` in `[server]` config part (still use default `SSH_PORT = 22` for serving). You can take a look at [Complete List](https://github.com/go-gitea/gitea/blob/master/custom/conf/app.ini.sample) for more infomation . Hope this can help.
Author
Owner

@abulfatmasimov commented on GitHub (Oct 19, 2018):

Hi @BetaCat0 , thank you for response and suggestions. Looks like another potential issue could be with indexers, at least I could not find way to point ISSUE_INDEXER_PATH and REPO_INDEXER_PATH to shared volume. They always appear under /app/gitea directory, which is not shared.
Also I am thinking of possible data corruptions with many Gitea processes writing to the same files.
Maybe it is not good idea to run multiple instances of Gitea yet until it is fully supported.
I wonder if there are any plans around Gitea in Kubernetes in roadmap?

@abulfatmasimov commented on GitHub (Oct 19, 2018): Hi @BetaCat0 , thank you for response and suggestions. Looks like another potential issue could be with indexers, at least I could not find way to point ISSUE_INDEXER_PATH and REPO_INDEXER_PATH to shared volume. They always appear under /app/gitea directory, which is not shared. Also I am thinking of possible data corruptions with many Gitea processes writing to the same files. Maybe it is not good idea to run multiple instances of Gitea yet until it is fully supported. I wonder if there are any plans around Gitea in Kubernetes in roadmap?
Author
Owner

@BetaCat0 commented on GitHub (Oct 19, 2018):

That's a problem and we are planning to create an independent index server to solve this. @abulfat-masimov

@BetaCat0 commented on GitHub (Oct 19, 2018): That's a problem and we are planning to create an independent index server to solve this. @abulfat-masimov
Author
Owner

@techknowlogick commented on GitHub (Oct 19, 2018):

Presslabs have had success running Gitea in k8s: https://www.presslabs.com/news/sftp-gitea/ you may be able to ask them for some implementation details.

@techknowlogick commented on GitHub (Oct 19, 2018): Presslabs have had success running Gitea in k8s: https://www.presslabs.com/news/sftp-gitea/ you may be able to ask them for some implementation details.
Author
Owner

@Sluggerman commented on GitHub (Oct 19, 2018):

great, thanks @techknowlogick! I'll reach out to them to ask if they have Gitea running in scaled mode.

@Sluggerman commented on GitHub (Oct 19, 2018): great, thanks @techknowlogick! I'll reach out to them to ask if they have Gitea running in scaled mode.
Author
Owner

@feluxe commented on GitHub (Oct 22, 2018):

I was thinking about a solution for this as well. I currently have this in mind:

  1. Create a shared volume (one that supports ReadWriteMany, e.g. CephFS cluster deployed via Rook).

  2. Run multiple instances of gitea:

  • connect each instance to the shared volume from 1).
  • use redis for cache and session for each instance.
  1. Sharding: To ensure that each repo is written by a single instance at a time, the loadbalancer directs URL requests in alphabetical ranges, e.g.:
www.mygitea.io/[a-g]   ---> Instance-1
www.mygitea.io/[h-n]   ---> Instance-2
www.mygitea.io/[o-u]   ---> Instance-3
www.mygitea.io/[v-z]   ---> Instance-4

Note: I'm not sure if 3) is even necessary with CephFS? From my understanding, it comes with a locking mechanism to handle reads/writes of multiple clients.

  1. To solve the problem with the indexer(s):
  • All instances of gitea have indexing disabled. These instances can read but not write indexes.
  • Create another pod that has Indexing enabled. This pod is responsible for writing indexes only.

Note: I haven't tested this yet... I think for 4) to work gitea would need to have an option to disable indexing for an instance entirely.

Note: Again. I'm not sure if 4) is necessary with CephFS.

I'd love to hear some feedback before I jump into this. :)

@feluxe commented on GitHub (Oct 22, 2018): I was thinking about a solution for this as well. I currently have this in mind: 1) Create a shared volume (one that supports `ReadWriteMany`, e.g. [CephFS](https://ceph.com/) cluster deployed via [Rook](https://rook.io/)). 2) Run multiple instances of gitea: * connect each instance to the shared volume from 1). * use *redis* for `cache` and `session` for each instance. 3) Sharding: To ensure that each repo is written by a single instance at a time, the loadbalancer directs URL requests in alphabetical ranges, e.g.: ``` www.mygitea.io/[a-g] ---> Instance-1 www.mygitea.io/[h-n] ---> Instance-2 www.mygitea.io/[o-u] ---> Instance-3 www.mygitea.io/[v-z] ---> Instance-4 ``` Note: I'm not sure if 3) is even necessary with CephFS? From my understanding, it comes with a locking mechanism to handle reads/writes of multiple clients. 4) To solve the problem with the *indexer(s)*: * All instances of gitea have indexing **disabled**. These instances can *read* but not *write* indexes. * Create another pod that has Indexing **enabled**. This pod is responsible for *writing* indexes only. Note: I haven't tested this yet... I think for 4) to work gitea would need to have an option to disable indexing for an instance entirely. Note: Again. I'm not sure if 4) is necessary with CephFS. I'd love to hear some feedback before I jump into this. :)
Author
Owner

@bogdanpetrea commented on GitHub (Oct 23, 2018):

@techknowlogick: That article is about dropping the SFTP support and unfortunately it's about running a single instance of Gitea in a non-Kubernetes environment. We are currently working on running Gitea on Kubernetes, but we decided to have multiple Gitea instances, logically separated from each other. That's not really the scaling you are probably looking for.

@bogdanpetrea commented on GitHub (Oct 23, 2018): @techknowlogick: That article is about dropping the SFTP support and unfortunately it's about running a single instance of Gitea in a non-Kubernetes environment. We are currently working on running Gitea on Kubernetes, but we decided to have multiple Gitea instances, logically separated from each other. That's not really the scaling you are probably looking for.
Author
Owner

@abulfatmasimov commented on GitHub (Oct 23, 2018):

I guess even if we manage to forward write traffic (POST,PUT) to a single Gitea instance to mitigate risks with corruption, yet it will not be scalable solution as such. I think If something like pessimistic locking could be implemented in Gitea to support simultaneous writes, that would be a real game changer.

@abulfatmasimov commented on GitHub (Oct 23, 2018): I guess even if we manage to forward write traffic (POST,PUT) to a single Gitea instance to mitigate risks with corruption, yet it will not be scalable solution as such. I think If something like pessimistic locking could be implemented in Gitea to support simultaneous writes, that would be a real game changer.
Author
Owner

@lunny commented on GitHub (Oct 23, 2018):

@feluxe I think 3) is unnecessary. 4) needs some codes change.

@lunny commented on GitHub (Oct 23, 2018): @feluxe I think 3) is unnecessary. 4) needs some codes change.
Author
Owner

@BetaCat0 commented on GitHub (Oct 23, 2018):

@feluxe This looks like somekind of a master-replica solution. As @abulfat-masimov said, it still needs a R/W router to avoid risks of corruption and may not alleviate the writing pressure of main instance (potential SPOF problem).

@BetaCat0 commented on GitHub (Oct 23, 2018): @feluxe This looks like somekind of a master-replica solution. As @abulfat-masimov said, it still needs a R/W router to avoid risks of corruption and may not alleviate the writing pressure of main instance (potential SPOF problem).
Author
Owner

@jfelten commented on GitHub (Nov 7, 2018):

I've been thinking about this, but lack understanding of where the resource conflicts might be. I think the best way would be to use a stateful set that uses a common queue service for write requests. A lot would depend on the type of file storage and persistence, but I believe postgres at least can be fed from a queue. Other than that you could have a stateful set with db replication set up somehow and fancy file storage that handles concurrency for you. I created a helm chart for gitea but it only uses a single replica, which is enough for our usage.

@jfelten commented on GitHub (Nov 7, 2018): I've been thinking about this, but lack understanding of where the resource conflicts might be. I think the best way would be to use a stateful set that uses a common queue service for write requests. A lot would depend on the type of file storage and persistence, but I believe postgres at least can be fed from a queue. Other than that you could have a stateful set with db replication set up somehow and fancy file storage that handles concurrency for you. I created a helm chart for gitea but it only uses a single replica, which is enough for our usage.
Author
Owner

@schmitch commented on GitHub (Dec 6, 2018):

actually the biggest problem is that redis-ha is not supported.
I mean you can run a redis service of your cloud provider. but you can't use redis-ha helm chart since redis clients need to be sentinal aware.

@schmitch commented on GitHub (Dec 6, 2018): actually the biggest problem is that redis-ha is not supported. I mean you can run a redis service of your cloud provider. but you can't use redis-ha helm chart since redis clients need to be sentinal aware.
Author
Owner

@benyanke commented on GitHub (Dec 25, 2018):

What's the current state of this? I'm currently considering setting up Gitea for a production environment, and curious if fully HA mode is supported yet.

@benyanke commented on GitHub (Dec 25, 2018): What's the current state of this? I'm currently considering setting up Gitea for a production environment, and curious if fully HA mode is supported yet.
Author
Owner

@stale[bot] commented on GitHub (Feb 23, 2019):

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs during the next 2 weeks. Thank you for your contributions.

@stale[bot] commented on GitHub (Feb 23, 2019): This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs during the next 2 weeks. Thank you for your contributions.
Author
Owner

@stale[bot] commented on GitHub (Mar 9, 2019):

This issue has been automatically closed because of inactivity. You can re-open it if needed.

@stale[bot] commented on GitHub (Mar 9, 2019): This issue has been automatically closed because of inactivity. You can re-open it if needed.
Author
Owner

@DhavalW commented on GitHub (Mar 19, 2019):

Hello, this issue seems to have auto closed. Has it been implemented ?
I'm considering Gitea for production use as well and would like to know if thats a good idea.

@DhavalW commented on GitHub (Mar 19, 2019): Hello, this issue seems to have auto closed. Has it been implemented ? I'm considering Gitea for production use as well and would like to know if thats a good idea.
Author
Owner

@lunny commented on GitHub (Mar 19, 2019):

I think you can follow @feluxe 's comment.

@lunny commented on GitHub (Mar 19, 2019): I think you can follow @feluxe 's comment.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/gitea#2418