附058.Kubernetes Gitea部署
摘要 Gitea是一个轻量级开源DevOps平台,提供代码托管、项目管理、CI/CD等功能。本文介绍了Gitea的主要特性,包括代码托管、轻量快速、安全性和多语言支持等。详细记录了在Kubernetes环境中部署Gitea的完整流程:通过Helm获取资源、准备SSL证书、自定义配置(包括禁用Valkey Cluster和PostgreSQL-HA,改用Valkey和PostgreSQL),最后执行
文章目录
Gitea介绍
Gitea概述
Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。
包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。
Gitea特性
功能特性
代码托管:Gitea⽀持创建和管理仓库、浏览提交历史和代码⽂件、审查和合并代码提交、管理协作者、管理分⽀等。它还⽀持许多常见的Git特性,⽐如标签、Cherry-pick、hook、集成协作⼯具等。
轻量级和快速: Gitea 的设计目标之一就是轻量级和快速响应。它不像一些大型的代码托管平台那样臃肿,因此在性能方面表现出色,适用于资源有限的服务器环境。由于其轻量级设计,Gitea 在资源消耗方面相对较低,可以在资源有限的环境下运行良好。
易于部署和维护: 轻松地部署在各种服务器上,不需要复杂的配置和依赖。这使得个人开发者或小团队可以方便地设置和管理自己的 Git 服务。
安全性: Gitea 注重安全性,提供了用户权限管理、访问控制列表等功能,可以确保代码和数据的安全性。
代码评审:代码评审同时支持 Pull Request workflow 和 AGit workflow。评审⼈可以在线浏览代码,并提交评审意见或问题。 提交者可以接收到评审意见,并在线回 复或修改代码。代码评审可以帮助用户和企业提⾼代码质量。
CI/CD: Gitea Actions⽀持 CI/CD 功能,该功能兼容 GitHub Actions,⽤⼾可以采用熟悉的YAML格式编写workflows,也可以重⽤⼤量的已有的 Actions 插件。Actions 插件支持从任意的 Git 网站中下载。
项目管理:Gitea 通过看板和⼯单来跟踪⼀个项⽬的需求,功能和bug。⼯单⽀持分支,标签、⾥程碑、 指派、时间跟踪、到期时间、依赖关系等功能。
制品库: Gitea支持超过 20 种不同种类的公有或私有软件包管理,包括:Cargo, Chef, Composer, Conan, Conda, Container, Helm, Maven, npm, NuGet, Pub, PyPI, RubyGems, Vagrant等
开源社区支持: Gitea 是一个基于 MIT 许可证的开源项目,Gitea 拥有一个活跃的开源社区,能够持续地进行开发和改进,同时也积极接受社区贡献,保持了平台的更新和创新。
多语言支持: Gitea 提供多种语言界面,适应全球范围内的用户,促进了国际化和本地化。
提示:更多 Gitea 介绍参考:关于Gitea
Gitea正式部署
资源获取
代码仓库计划采用轻量级开源 Gitea 技术栈。
- 获取资源
通过 helm 获取部署资源。
[root@master01 ~]# mkdir -p gitea/tls
[root@master01 ~]# cd gitea/
[root@master01 gitea]# helm repo add gitea https://dl.gitea.com/charts
[root@master01 gitea]# helm repo update
[root@master01 gitea]# helm pull gitea/gitea
[root@master01 gitea]# ll
total 448K
-rw-r--r-- 1 root root 445K Jan 10 12:21 gitea-12.4.0.tgz
drwxr-xr-x 2 root root 6 Jan 10 12:21 tls
准备证书
将证书上传至对应目录。
[root@master01 gitea]# ll tls/
total 12K
-rw-r--r-- 1 root root 4.4K Jan 9 20:58 gitea.k8sy.com.key
-rw-r--r-- 1 root root 1.7K Jan 9 20:58 gitea.k8sy.com.pem
[root@master01 tls]# kubectl -n mygitea create secret tls gitea-k8sy-com-cert \
--cert=/root/gitea/tls/gitea.k8sy.com.pem \
--key=/root/gitea/tls/gitea.k8sy.com.key
自定义配置
根据当前环境创建自定义配置:
- 开启ingress,并配置域名,使用提前创建的证书;
- 使用持久化存储,并直接使用已有的 StorageClass ;
- Valkey Cluster 与 Valkey 不可同时启用,PostgreSQL 与 PostgreSQL-HA 不可同时开启,默认开启了 Cluster 和 PostgreSQL-HA ,需要手动关闭;
- 设置相关持久卷的大小。
当前 helm 部署 gitea 会默认启用 Valkey Cluster 和 PostgreSQL-HA 且这两个组件为子 chart 方式引入,Valkey Cluster 充当缓存,PostgreSQL-HA 是高可以数据库,gitea 支持的数据库有多种,可以手动指定。
本环境为内部测试使用,将取消Valkey Cluster 和 PostgreSQL-HA ,采用 Valkey 和 PostgreSQL 。
提示:更多Gitea Chart 修改参考Gitea Helm Chart 。
- 修改主配置
[root@master01 gitea]# cat >myvalues.yaml<<'EOF'
service:
ssh:
type: NodePort
nodePort: 30022
externalTrafficPolicy: Local
ingress:
enabled: true
className: "nginx"
hosts:
- host: gitea.k8sy.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: gitea-k8sy-com-cert
hosts:
- gitea.k8sy.com
persistence:
storageClass: "longhorn"
size: 2Gi
valkey-cluster:
enabled: false
valkey:
enabled: true
primary:
persistence:
storageClass: longhorn
size: 1Gi
postgresql-ha:
enabled: false
postgresql:
enabled: true
global:
postgresql:
auth:
username: gitea
password: giteaPass123
database: gitea
service:
ports:
postgresql: 5432
primary:
persistence:
enabled: true
storageClass: longhorn
size: 2Gi
gitea:
admin:
username: gitadmin
password: AdminPassword123
email: admin@gitea.k8sy.com
actions:
ENABLED: true
EOF
正式部署
[root@master01 gitea]# helm upgrade --install gitea gitea/gitea --create-namespace --namespace mygitea -f myvalues.yaml
确认验证
- 部署确认
[root@master01 gitea]# kubectl -n mygitea get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
gitea-875c84b98-sjhrm 1/1 Running 0 98s 10.10.30.73 worker02 <none> <none>
gitea-postgresql-0 1/1 Running 0 87s 10.10.30.122 worker02 <none> <none>
gitea-valkey-primary-0 1/1 Running 0 98s 10.10.19.127 worker03 <none> <none>
[root@master01 gitea]# kubectl -n mygitea get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
gitea-http ClusterIP None <none> 3000/TCP 99s app.kubernetes.io/instance=gitea,app.kubernetes.io/name=gitea
gitea-postgresql ClusterIP 10.20.49.130 <none> 5432/TCP 99s app.kubernetes.io/component=primary,app.kubernetes.io/instance=gitea,app.kubernetes.io/name=postgresql
gitea-postgresql-hl ClusterIP None <none> 5432/TCP 99s app.kubernetes.io/component=primary,app.kubernetes.io/instance=gitea,app.kubernetes.io/name=postgresql
gitea-ssh NodePort 10.20.73.142 <none> 22:30022/TCP 99s app.kubernetes.io/instance=gitea,app.kubernetes.io/name=gitea
gitea-valkey-headless ClusterIP None <none> 6379/TCP 99s app.kubernetes.io/instance=gitea,app.kubernetes.io/name=valkey
gitea-valkey-primary ClusterIP 10.20.166.64 <none> 6379/TCP 99s app.kubernetes.io/component=primary,app.kubernetes.io/instance=gitea,app.kubernetes.io/name=valkey
[root@master01 gitea]# kubectl -n mygitea get ingress -o wide
NAME CLASS HOSTS ADDRESS PORTS AGE
gitea nginx gitea.k8sy.com 10.20.173.226 80, 443 105s
- 访问确认
浏览器访问网页: https://gitea.k8sy.com 。

使用 gitadmin / AdminPassword123 登录平台。

登录后可以创建仓库、组织等。

客户端使用
git 客户端可使用 git 相关命令使用该仓库。
提示:建议使用 ssh 方式更安全,当前 gitea 部署在 Kubernetes 中,直接在 master01 节点查看已有 SSH 公钥,也可使用ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' -b 4096 -C "x120952576@126.com"生产公钥。
- 公钥生成
[root@master01 ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCQi5CYD/PmrSHjuQJ682Hn5GsD7s4EfdIv8EZxiwsvWIf1mvPB8DXrFFgQpP++glP+cNiIeqFG+UN9Ce+Yu2jSdru+vpj5K/Oenm9vYkUf+XLl22mrSwN5Rhv/zJWDGtkWVe8SSapfw2OAOQyb+WVG/bRBbAQFLqCKgnz7WyZPtn7ab0OPajzBYzzBb76i5o9tHZ3WIfmi4B3TJzgT3TEMs9PwB/AkI3VZya6Eg6i+npbyqcwlAWknSKOReu3tGct4fm1vqWDODCBxTZF1s9z2Y0yPZNhZxiRvZ/YaUqJL3Lkjon3LSFd0vs81LcyboveJ29+EAuTV28WLIi55fUmnZrMmFupPGActj1tT2RQkyfLx6AzLP5QAKHg7Li7vSfUCEVTVB+PYuy50LaoB4jycACI8OKD48zWVY1jOcXrsGXuc3i8+v0xHezhuaNCrnpB+dCajjLMHAqgbUjEWEAVFm/qjwN04k2n6S4nr/5qhSHK2E9gqPsrdl21uh+7W5Ps= root@master01
- 配置公钥
增加密钥:

填上公钥:

确认添加:

- 客户端使用
在您的 Gitea 个人资料页面显示一个 Markdown 文件,只需创建一个名为 .profile 的仓库,并编辑其中的 README.md 文件。Gitea 将自动获取该文件并在您的仓库上方显示。
[root@master01 ~]# vim /etc/hosts
# ……
172.24.8.100 gitea.k8sy.com
[root@master01 ~]# ssh -p 30022 -T git@gitea.k8sy.com
[root@master01 ~]# vim .ssh/config
Host gitea.k8sy.com
HostName gitea.k8sy.com
Port 30022
User gitadmin
[root@master01 ~]# git remote -v
origin ssh://git@gitea.k8sy.com:30022/gitadmin/.profile.git (fetch)
origin ssh://git@gitea.k8sy.com:30022/gitadmin/.profile.git (push)
[root@master01 ~]# git config --global user.name "xhy" # 配置自定义名称
[root@master01 ~]# git config --global user.email "xhy@itzgr.com" # 配置联系邮箱
[root@master01 ~]# cat >README.md<<EOF
## 个人仓库
### 仓库说明
个人仓库,私有化使用。
EOF
[root@master01 ~]# git init
[root@master01 ~]# git checkout -b main
[root@master01 ~]# git add README.md
[root@master01 ~]# git commit -m "first commit"
[root@master01 ~]# git remote add origin git@gitea.k8sy.com:gitadmin/.profile.git
[root@master01 ~]# git push -u origin main


提示:如上直接添加 VIP 地址,该地址为 HAProxy+KeepAlived 部署的 Kubernetes 高可以,Kubernetes 的部署参考:Kubernetes_v1.34.3生产环境高可用部署
部署gitea runner
获取 runner部署资源
gitea runner部署官方有四种方式:act_runner 。
本指南基于Kubernetes进行部署,该方式有两种部署文件,参考:Kubernetes Docker in Docker Deployment with act_runner 。
[root@master01 gitea]# wget https://gitea.com/gitea/act_runner/raw/branch/main/examples/kubernetes/dind-docker.yaml
创建注册TOKEN
通过 Web UI 获取(推荐),登录 Gitea:https://gitea.k8sy.com
- 进入 站点管理 → Actions → Runners
- 点击 创建新的 Runner
- 复制显示的 Registration Token
[root@master01 gitea]# echo -n 'cn4gxmDLXJlbGdsXT6iWeDsG9fi8jxisJTFMnXWu' | base64
Y240Z3htRExYSmxiR2RzWFQ2aVdlRHNHOWZpOGp4aXNKVEZNblhXdQ==
配置部署
根据实际情况配置部署文件内容。
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: act-runner-vol
namespace: mygitea # 补充namespace
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi # 可根据需求调整
storageClassName: longhorn # 改为 longhorn
---
apiVersion: v1
data:
# The registration token can be obtained from the web UI, API or command-line.
# You can also set a pre-defined global runner registration token for the Gitea instance via
# `GITEA_RUNNER_REGISTRATION_TOKEN`/`GITEA_RUNNER_REGISTRATION_TOKEN_FILE` environment variable.
token: "Y240Z3htRExYSmxiR2RzWFQ2aVdlRHNHOWZpOGp4aXNKVEZNblhXdQ=="
kind: Secret
metadata:
name: runner-secret
namespace: mygitea
type: Opaque
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: act-runner
name: act-runner
namespace: mygitea
spec:
replicas: 1
selector:
matchLabels:
app: act-runner
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: act-runner
spec:
restartPolicy: Always
volumes:
- name: docker-certs
emptyDir: {}
- name: runner-data
persistentVolumeClaim:
claimName: act-runner-vol
containers:
- name: runner
image: gitea/act_runner:nightly
command: ["sh", "-c", "while ! nc -z localhost 2376 </dev/null; do echo 'waiting for docker daemon...'; sleep 5; done; /sbin/tini -- run.sh"]
env:
- name: DOCKER_HOST
value: tcp://localhost:2376
- name: DOCKER_CERT_PATH
value: /certs/client
- name: DOCKER_TLS_VERIFY
value: "1"
- name: GITEA_INSTANCE_URL
value: http://gitea-http.mygitea.svc.cluster.local:3000 # 修改为你的 service
- name: GITEA_RUNNER_REGISTRATION_TOKEN
valueFrom:
secretKeyRef:
name: runner-secret
key: token
volumeMounts:
- name: docker-certs
mountPath: /certs
- name: runner-data
mountPath: /data
- name: daemon
image: docker:23.0.6-dind
env:
- name: DOCKER_TLS_CERTDIR
value: /certs
securityContext:
privileged: true
volumeMounts:
- name: docker-certs
mountPath: /certs
正式部署runner
[root@master01 gitea]# kubectl apply -f dind-docker.yaml
确认验证
- 平台确认
[root@master01 gitea]# kubectl -n mygitea get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
act-runner-679649446f-x4djg 2/2 Running 0 25s 10.10.30.123 worker02 <none> <none>
gitea-875c84b98-vr5lc 1/1 Running 0 9m11s 10.10.30.66 worker02 <none> <none>
gitea-postgresql-0 1/1 Running 0 9m11s 10.10.19.107 worker03 <none> <none>
gitea-valkey-primary-0 1/1 Running 0 9m11s 10.10.30.127 worker02 <none> <none>
[root@master01 gitea]# kubectl -n mygitea logs -f act-runner-679649446f-x4djg
Defaulted container "runner" out of: runner, daemon
waiting for docker daemon...
.runner is missing or not a regular file
level=info msg="Registering runner, arch=amd64, os=linux, version=v0.2.13+10-g90d11b8."
level=debug msg="Successfully pinged the Gitea instance server"
level=info msg="Runner registered successfully."
SUCCESS
time="2026-01-12T15:15:26Z" level=info msg="Starting runner daemon"
time="2026-01-12T15:15:26Z" level=info msg="runner: act-runner-679649446f-x4djg, with version: v0.2.13+10-g90d11b8, with labels: [ubuntu-latest ubuntu-24.04 ubuntu-22.04], declare successfully"

CI 使用
gitea的CI使用类似gitlab,在项目仓库的根目录创建ci.yaml,然后编写对应的内容即可。
可参考:Gitlab CICD流水线触发 。
更多推荐
所有评论(0)