K8S项目部署-Git代码仓库服务器Gitea

Gitea是一个轻量级的Git代码仓库服务器,和我们见得比较多的Github、Gitee以及Gitlab一样,都是一个Git仓库。对于Github和Gitee都是开源项目的Git仓库,对于公司、企业这样的有私有化的需求的场景下,则通常使用Gitlab/Gitea这样的私有化Git仓库。 目前市面上使

Gitea是一个轻量级的Git代码仓库服务器,和我们见得比较多的Github、Gitee以及Gitlab一样,都是一个Git仓库。对于Github和Gitee都是开源项目的Git仓库,对于公司、企业这样的有私有化的需求的场景下,则通常使用Gitlab/Gitea这样的私有化Git仓库。

目前市面上使用最多的是Gitlab,因为它的功能很齐全,也很成熟,但是也带来一个问题就是占用的资源比较多,Gitlab的基础运行条件是2C的CPU、4-5G的内存,而Gitea则只需要200M左右的内存即可轻松运行,哪怕是一个小小的树莓派,都能轻松运行一个Gitea仓库(Gitlab没有ARM版本的,所以树莓派无法部署Gitlab,Gitea支持ARM,可以部署在树莓派)。Gitea对于小公司,或者是个人开发者都是很友好的,通过Docker容器即可轻松部署一个属于自己的私有Git仓库。

Gitea的官网:Gitea官网

下面我们在K8S集群当中,去部署一个Gitea代码仓库服务,供我们内网使用。

1. 创建PVC并指定存储类

先创建Gitea的Namespace

kubectl create namespace gitea

创建Gitea数据存放的持久卷PVC配置。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: gitea-pvc
  namespace: gitea
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
  storageClassName: nfs-storage  # 根据你的存储类设置

2. 部署Gitea服务

# gitea-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gitea
  namespace: gitea
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gitea
  template:
    metadata:
      labels:
        app: gitea
    spec:
      containers:
        - name: gitea
          image: wanna1314y.top:1443/gitea/gitea:latest
          ports:
            - containerPort: 3000
              name: http
            - containerPort: 22
              name: ssh
          volumeMounts:
            - name: gitea-data
              mountPath: /data
      volumes:
        - name: gitea-data
          persistentVolumeClaim:
            claimName: gitea-pvc

3. 配置Gitea允许外网访问

apiVersion: v1
kind: Service
metadata:
  name: gitea-service
  namespace: gitea
spec:
  selector:
    app: gitea
  ports:
    - name: http
      port: 3000
      targetPort: 3000
    - name: ssh
      port: 22
      targetPort: 22
  type: ClusterIP

通过Ingrss配置外放访问的域名

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: gitea-nginx-ingress
  namespace: gitea
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - <domain>
      secretName: <secret>
  rules:
    - host: <domain>
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: gitea-service
                port:
                  number: 3000

4.外网push/pull代码

4.1 基于HTTPS的方式进行代码的push/pull

我们可以通过如下的命令进行代码的clone:

git clone https://gitea.wanna1314y.top/wanna-spring/wanna-spring-projects.git

我们通过git remote add命令添加远程仓库地址。

git remote add gitea <repository-url>

# example
git remote add gitea https://gitea.wanna1314y.top/wanna-spring/wanna-spring-projects.git

使用git push命令将代码推送到远程仓库,期间可能会要求输入密码,HTTPS不能实现免密登录,免密登录得使用SSH的方式。

git push -u gitea main

4.2 基于SSH的方式进行代码的push/pull(免密)

SSH方式,不仅需要在Ingress处配置,还需要在Service当中把SSH端口也通过NodePort的方式暴露出来,不然Gitea无法使用SSH服务。

apiVersion: v1
kind: Service
metadata:
  name: gitea-service
  namespace: gitea
spec:
  selector:
    app: gitea
  ports:
    - name: http
      port: 3000
      targetPort: 3000
    - name: ssh
      port: 22
      targetPort: 22
      nodePort: 31822
  type: NodePort

由于默认SSH使用的是22端口进行的通信,但是OpenSSHServer通常都已经在22端口启动,因为我们有需要使用SSH登录到目标机器的场景。但是Gitea如果使用SSH的方式拉取/推送代码时,也会是用到22端口,会导致端口冲突,因此我们需要额外配置SSH的配置文件,让访问Gitea的SSH时,使用另外的一个端口号进行通信,而不是使用默认的SSH的22端口进行通信。

我们需要使用如下的命令去编辑SSH的配置文件

sudo vim ~/.ssh/config

往其中加入如下的内容,让我们在访问gitea.wanna1314y.top这个域名的SSH时,使用31822端口进行通信。

Host gitea.wanna1314y.top
    Port 31822

理论上应该配置成为如下内容的配置,必须得跟上域名为*的配置才行,如果单独使用如上的内容,可能会导致除了这个域名之外的其他的域名的Git服务的SSH免密登录无法正常访问。

Host gitea.wanna1314y.top
    Port 31822
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa

接着就正常了,可以尝试使用类似如下的命令去拉取Gitea当中我们现有仓库(如果没有的话,可以在Gitea上手动新建一个仓库)当中的代码进行测试,发现拉取代码已经正常。

git clone git@gitea.wanna1314y.top:wanna-spring/wanna-spring-projects.git

我们通过git remote add命令添加远程仓库地址。

git remote add gitea <repository-url>

# example
git remote add gitea git@gitea.wanna1314y.top:wanna-spring/wanna-spring-projects.git

使用git push命令将代码推送到远程仓库,可以进行SSH免密push代码。

git push -u gitea main

5. 额外配置Gitea

Gitea的配置信息存放位置为:

/data/gitea/conf/app.ini

比如Gitea需要修改DB连接地址,就可以找到配置文件的如下这部分,进行更多的自定义的修改:

[database]
PATH = /data/gitea/gitea.db
DB_TYPE = mysql
HOST = {db_host}:{db_port}
NAME = {dbname}
USER = {username}
PASSWD = {password}
LOG_SQL = false
SCHEMA = 
SSL_MODE = disable

基于Kubectl执行配置文件,让Gitea服务重启从而使得配置能够及时生效。

kubectl apply -f gitea-deployment.yaml
Comment