安装 k3s

curl -sfL https://get.k3s.io | sh -
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config

安装 helm

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

安装 halo

配置 halo 的 helm 库

helm repo add halo https://liueic.github.io/charts/
helm repo update
helm install halo halo/halo

为什么不使用官方的 helm 仓库:

因为官方的仓库镜像比较古早,在这里我自己 fork 了一个新的仓库,并且更新了镜像,更新到最新的 2.20.9

目前已经 pr:update & feat: update the image to 2.20.19 and add helm test workflow by liueic · Pull Request #12 · halo-sigs/charts · GitHub

检查一下 pod 是否 ready

kubectl get pods

等到两个状态都为 READY 了就是好了

这时候它提醒你是 PortNode 模式

之后需要绑定域名,更新 helm

helm upgrade halo halo/halo --set ingress.enabled=true --set ingress.hostname=www.ciallo.cv

这里的 www.ciallo.cv 应当换成你自己部署 halo 的域名

之后会出现和上面一样的提示

这时候就是 ingress 来接管反向代理了,我们来查看一下

kubectl get ingress -n default

此时实现 HTTP 访问

因为我是准备套 Cloudflare CDN 的,所以我自己用 15 年证书

之后保存到本地,使用 kubernetes 的 secret 进行保管

kubectl create secret tls cloudflare-origin-cert \
  --cert=ciallo.pem \
  --key=ciallo.key.pem \
  -n default

这里的 cert 和 key 都换成你的证书,如果你不用 Cloudflare 的话,也可以用 acme.sh 或者别的来帮你管理证书

之后更新

helm upgrade halo halo/halo \
  --set ingress.enabled=true \
  --set ingress.hostname=www.ciallo.cv \
  --set ingress.tls=true \
  --set ingress.tlsSecret=cloudflare-origin-cert \
  --set-string ingress.annotations."nginx\.ingress\.kubernetes\.io/ssl-redirect"="true" \
  -n default

又和上面一样,提醒你可以用 HTTPS 来访问了

之后又查看 imgress,发现存在一个问题,就是它这个端口还是 80,不是 HTTPS 的端口

我们需要手动 patch 来修改 tls 配置

运行以下命令为该 Ingress 添加 tls

kubectl patch ingress halo -n default --type merge -p '
{
  "spec": {
    "tls": [
      {
        "hosts": ["www.ciallo.cv"],
        "secretName": "cloudflare-origin-cert"
      }
    ]
  }
}'

之后重新运行 kubectl get ingress halo -n default 应该就可以看到放行了 443 端口

在执行 upgrade 之后,旧的 pod 并不会马上销毁,而是会等到新的 pod 启动之后再销毁,符合 kubernetes 的工作特性

最后修改:2025 年 05 月 03 日
如果觉得我的文章对你有用,请随意赞赏