K3s部署Gitea

在完成 K3s 集群基础服务部署(PostgreSQL、Redis)后,本文作为系列第六篇,将基于前序环境部署 Gitea 轻量级代码托管服务,实现一键部署、开箱可用。

Gitea 作为轻量级、高性能的 Git 服务,可无缝对接 PostgreSQL 数据库与 Redis 缓存,适合在内网 K3s 环境中搭建私有代码仓库、DevOps 研发平台。

一、创建 Gitea 命名空间

为保持资源隔离规范,Gitea 独立运行在 gitea 命名空间。

1
2
3
4
5
6
7
# gitea-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: gitea
labels:
app: gitea

执行命令:

1
kubectl apply -f gitea-namespace.yaml

二、部署 Gitea 持久化存储(PVC)

采用 local-path 存储配置,保障 Gitea 数据持久化,适配内网 K3s 集群环境。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# gitea-pvc-local-path.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitea-pvc
namespace: gitea
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 50Gi

部署:

1
kubectl apply -f gitea-pvc-local-path.yaml

三、部署 Gitea 配置文件(ConfigMap)

配置文件包含数据库连接、安全开关、运行参数等核心配置,适配前序部署的 PostgreSQL 服务,保障 Gitea 正常运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# gitea-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: gitea-config
namespace: gitea
labels:
app: gitea
data:
ENABLE_OPENID_SIGNIN: "false"
DISABLE_REGISTRATION: "true"
ENABLE_OPENID_SIGNUP: "false"
SSH_LISTEN_PORT: "2222"
SSH_PORT: "22"
GITEA_APP_INI: /data/gitea/conf/app.ini
GITEA_CUSTOM: /data/gitea
GITEA_WORK_DIR: /data
GITEA_TEMP: /tmp/gitea
TMPDIR: /tmp/gitea
HOME: /data/gitea/git
APP_NAME: "Gitea: Git with a cup of tea"
HTTP_PORT: "3000"
RUN_MODE: prod
DB_TYPE: postgres
DB_HOST: postgres.postgres.svc.cluster.local:5432
DB_NAME: gitea
DB_USER: gitea
DB_PASSWD: gitea
REQUIRE_SIGNIN_VIEW: "true"
ACTIONS_ENABLED: "false"
GITEA_webhook_ALLOWED_HOST_LIST: *.example.local
GITEA_webhook_SKIP_TLS_VERIFY: "true"
GITEA_packages_ENABLED: "false"
GITE_actions_ENABLED: "false"

部署:

1
kubectl apply -f gitea-config.yaml

四、部署 Gitea 服务(Service)

部署双 Service,分别暴露 HTTP(3000 端口)与 SSH(22 端口),满足 Web 访问与 Git 操作需求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# gitea-service.yaml
apiVersion: v1
kind: Service
metadata:
name: gitea-ssh
namespace: gitea
labels:
app: gitea
spec:
ports:
- name: ssh
port: 22
protocol: TCP
targetPort: 22
selector:
app: gitea
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
name: gitea-http
namespace: gitea
labels:
app: gitea
spec:
ports:
- name: http
port: 3000
protocol: TCP
targetPort: 3000
selector:
app: gitea
type: ClusterIP

部署:

1
kubectl apply -f gitea-service.yaml

五、部署 Gitea 应用(Deployment)

采用 rootless 镜像部署,配置数据挂载与环境变量注入,保障 Gitea 稳定运行且符合容器安全规范。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# gitea-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitea
namespace: gitea
labels:
app: gitea
spec:
replicas: 1
selector:
matchLabels:
app: gitea
template:
metadata:
labels:
app: gitea
spec:
containers:
- name: gitea
image: gitea/gitea:1.22.0-rootless
envFrom:
- configMapRef:
name: gitea-config
imagePullPolicy: IfNotPresent
ports:
- containerPort: 22
name: ssh
protocol: TCP
- containerPort: 3000
name: http
protocol: TCP
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /tmp
name: temp
- mountPath: /data
name: gitea-persistent-storage
restartPolicy: Always
volumes:
- name: temp
emptyDir: {}
- name: gitea-persistent-storage
persistentVolumeClaim:
claimName: gitea-pvc

部署:

1
kubectl apply -f gitea-deployment.yaml

六、配置 HTTPS 与路由(IngressRoute + Certificate)

配置自动签发证书与 Traefik 路由,启用 HTTPS 加密访问,保障服务访问安全,适配前序 Traefik 网关配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# gitea-ingress.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: gitea-cert
namespace: gitea
spec:
isCA: false
commonName: Example gitea
secretName: gitea-secret
privateKey:
algorithm: RSA
encoding: PKCS1
size: 2048
duration: 2160h
renewBefore: 72h
subject:
organizations:
- Example .Inc
dnsNames:
- gitea.example.local
issuerRef:
name: selfsigned-cluster-issuer
kind: ClusterIssuer
group: cert-manager.io
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: gitea-websecure
namespace: gitea
annotations:
traefik.ingress.kubernetes.io/service.sticky.cookie: "true"
spec:
entryPoints:
- websecure
routes:
- match: Host(`gitea.example.local`) && PathPrefix(`/`)
kind: Rule
services:
- name: gitea-http
passHostHeader: true
port: 3000
tls:
secretName: gitea-secret

部署:

1
kubectl apply -f gitea-ingress.yaml

七、验证 Gitea 部署状态

1. 查看 Pod 状态

1
kubectl get pods -n gitea

2. 查看 PVC 状态

1
kubectl get pvc -n gitea

3. 查看 Service

1
kubectl get svc -n gitea

4. 查看证书与路由

1
2
kubectl get certificates -n gitea
kubectl get ingressroute -n gitea

八、访问方式

1. 内网访问(推荐)

配置本地 hosts(替换为你的 K3s 节点 IP):

1
192.168.x.x gitea.example.local

浏览器访问:

1
https://gitea.example.local

2. 集群内访问

  • Web:gitea-http.gitea.svc.cluster.local:3000

  • SSH:gitea-ssh.gitea.svc.cluster.local:22


九、默认管理员信息

  • 用户名:gitea_admin

  • 密码:r8sA8CPHD9!bt6d


十、日常运维命令

1
2
3
4
5
6
7
8
9
10
11
# 查看日志
kubectl logs -f deployment/gitea -n gitea

# 重启服务
kubectl rollout restart deployment/gitea -n gitea

# 备份数据
kubectl cp gitea/<gitea-pod-name>:/data ./gitea-data-backup

# 进入容器
kubectl exec -it <gitea-pod-name> -n gitea -- /bin/sh

总结

本文完成 Gitea 在 K3s 中的完整部署:命名空间隔离 → 持久化存储 → 配置中心 → 服务暴露 → HTTPS 安全访问。

Gitea 已自动对接 PostgreSQL 数据库,可直接作为企业内网代码托管平台使用,具备稳定、轻量、易维护的特点。