手把手教你玩轉 Gitea|使用 Helm 在 K3s 上安裝 Gitea

前言

在前面的文章中,演示了如何用 Docker 鏡像和 Windows 二進位包來安裝運行 Gitea。今天是玩轉 Gitea 系列的使用 Helm 在 K3s 上安裝 Gitea。

關於 Gitea 的其他安裝和使用方式,可以查看公眾號文章:Gitea 安裝配置系列教程。

關於 K3s

K3s 是 Rancher 發布的一款 Kubernetes 輕量級發行版,擁有完整特性的同時安裝和使用也非常方便。

K3s 的安裝

K3s 的安裝有多種方式,詳細內容可以查看K3s 中文文檔。本文搭建的 Kubernetes 運行環境如下:

  • 伺服器:使用 K3s 安裝腳本安裝 Kubernetes 發行版環境
  • 管理員客戶端:安裝 kubectlhelm 命令行工具

使用如下命令安裝 K3s

# 方案一:會從 K8s 的 GitHub 倉庫下載安裝包
$ curl -sfL //get.k3s.io | sh -

# 方案二:中國大陸用戶,使用 Rancher 提供的阿里雲 CDN 加速下載
$ curl -sfL //rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

# 以下是安裝過程輸出的資訊
[INFO]  Finding release for channel stable
[INFO]  Using v1.24.6+k3s1 as release
[INFO]  Downloading hash rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/v1.24.6-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/v1.24.6-k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

可以用 kubectl 來查看安裝是否成功:

$ kubectl get nodes

NAME     STATUS   ROLES                  AGE     VERSION
debian   Ready    control-plane,master   5m42s   v1.24.6+k3s1

可以看到有一個單節點的 K3s 集群正在運行了。接下來就用 K3s 來運行 Gitea。

從外部訪問 k3s

1.獲得訪問集群所需的配置文件 /etc/rancher/k3s/k3s.yaml,將其複製到個人工作目錄~/.kube/config,或者其他能夠訪問到集群網路的客戶機。

mkdir ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER ~/.kube/config
sudo chmod 600 ~/.kube/config

# 將 KUBECONFIG 添加到個人工作環境變數,便於 Helm、kubectl 讀取
echo "export KUBECONFIG=~/.kube/config" >> ~/.bashrc

2.將配置文件 ~/.kube/config 中的 server: //127.0.0.1:6443 更改為客戶機可訪問的伺服器地址。

安裝 kubectl

閱讀:安裝 kubectl

curl -LO "//dl.k8s.io/release/$(curl -L -s //dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

安裝 Helm

閱讀:安裝 Helm

  1. 下載 Helm //github.com/helm/helm/releases

  2. 解壓安裝

tar -xvzf helm-*-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm

添加 Helm 倉庫

# 官方倉庫 bitnami
helm repo add bitnami //charts.bitnami.com/bitnami

# Gitea 倉庫
helm repo add gitea //dl.gitea.io/charts/

使用 Helm 安裝 Gitea

前提條件

在 K3s 上安裝 Gitea 需要確保提前安裝了 Helm,v2 或 v3 版本均可,但是建議用 v3,本文的 Helm 版本資訊如下:

$ helm version
version.BuildInfo{Version:"v3.10.0", GitCommit:"ce66412a723e4d89555dc67217607c6579ffcb21", GitTreeState:"clean", GoVersion:"go1.18.6"}

添加 Gitea Helm Chart 倉庫:

$ helm repo add gitea //dl.gitea.io/charts
"gitea" has been added to your repositories

更新 Helm Chart 本地快取

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "gitea" chart repository
Update Complete. ⎈Happy Helming!⎈

Gitea Helm Chart 訂製

K3s 上安裝 Gitea,是通過 Helm 實現的。首先將 Gitea Helm chart 的 values.yaml 配置文件拉取到本地:

helm show values gitea/gitea > gitea.yaml

由於 Gitea Helm Chart 包含多個組件,包括核心組件 Gitea、可選依賴組件(諸如 MySQL、MariaDB、PostgreSQL、Memcached 等)、可選功能集成(Ingress、Service、Metrics 等),整體的 values.yaml 文件比較複雜,詳細內容可以查看 Gitea Helm Chart

然後,對 Gitea Helm Chart 進行一些參數修改:

# 打開 Ingress
ingress:
  enabled: true
  hosts:
    - host: git.example.com
      paths:
        - path: /
          pathType: Prefix

# 打開持久存儲
persistence:
  enabled: true
  existingClaim:
  size: 10Gi
  accessModes:
    - ReadWriteOnce
  labels: {}
  annotations: {}
  storageClass:
  subPath:

# 設置管理員帳號和密碼
gitea:
  admin:
    username: gitea_admin
    password: r8sA8CPHD9!bt6d
    email: "[email protected]"

# 設置 Gitea 的配置文件 app.ini
  config:
    APP_NAME: "My Git Repository"

# 開啟 memcached
memcached:
  enabled: true
  service:
    port: 11211

# 開啟 postgresql
postgresql:
  enabled: true
  global:
    postgresql:
      postgresqlDatabase: gitea
      postgresqlUsername: gitea
      postgresqlPassword: gitea
      servicePort: 5432
  persistence:
    size: 10Gi

重要參數說明:

  • ingress:集成負載均衡和域名綁定;
  • persistence:數據持久化存儲。請注意,persistence 中留空的 storageClass 將導致 Kubernetes 使用默認 storageClass;
  • gitea:是 Gitea 的配置內容,包括 admin、metrics、oauth 和 config 等。其中 config 映射了 app.ini 配置參數,這些內容最後都會以 app.ini 文件的形式呈現;
  • memcached:用於數據快取。一旦啟用這項配置,會自動在 app.ini 中生成下面的配置:
[cache]
ADAPTER = memcache
ENABLED = true
HOST = RELEASE-NAME-memcached.default.svc.cluster.local:11211
  • postgresql:開啟 PostgreSQL 作為外部資料庫

上述配置參數只做演示用,實際部署時需要根據自己的需求來決定安裝哪些組件以及 PVC 的類型和容量。
更多配置參數請閱讀://gitea.com/gitea/helm-chart

用 Helm 安裝 Gitea

先創建一個 namespace

kubectl create ns gitea

執行 helm install 命令,安裝 Gitea:

$ helm install gitea --namespace gitea -f gitea.yaml gitea/gitea
NAME: gitea
LAST DEPLOYED: Wed Oct 12 13:19:29 2022
NAMESPACE: gitea
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  //git.example.com/

在 gitea namespace 下面會有 3 個 pod 生成:

$ kubectl -n gitea get pods
NAME                               READY   STATUS    RESTARTS   AGE
gitea-memcached-77fc54d6fb-sft9q   1/1     Running   0          3m20s
gitea-postgresql-0                 1/1     Running   0          3m20s
gitea-0                            1/1     Running   0          3m20s

整個過程會完成 Gitea 的初始化,可以在 pod 的 log 中進行查看:

$ kubectl -n gitea logs -f gitea-0
Defaulted container "gitea" out of: gitea, init-directories (init), init-app-ini (init), configure-gitea (init)
Generating /data/ssh/ssh_host_ed25519_key...
Generating /data/ssh/ssh_host_rsa_key...
Generating /data/ssh/ssh_host_dsa_key...
Generating /data/ssh/ssh_host_ecdsa_key...
Server listening on :: port 22.
Server listening on 0.0.0.0 port 22.
2022/10/12 05:21:02 cmd/web.go:106:runWeb() [I] Starting Gitea on PID: 17
2022/10/12 05:21:02 cmd/web.go:157:runWeb() [I] Global init

查看 Ingress 狀態:

$ kubectl -n gitea get ingress
NAME    CLASS    HOSTS             ADDRESS         PORTS   AGE
gitea   <none>   git.example.com   192.168.3.102   80      11m

將域名解析到 Ingress 之後可以使用 //git.example.com 登錄 Gitea 實例。

至此,在 Kubernetes 上成功安裝了 Gitea 實例,接下來就可以開啟 Gitea 之旅了。

正如開頭所說,如果是生產級別的使用,需要根據每個公司的具體場景需求來做一些額外的配置,比如 PVC、LDAP、OAuth2、SMTP 等,這些也只需要修改 values.yaml 文件進行安裝即可。