K3s 国内环境部署与 GitHub Actions CI/CD 指南
本文整理了一套基于 K3s + GHCR(GitHub Container Registry)+ GitHub Actions 的部署方案。
适用场景:单节点或轻量级服务器部署,使用 K3s 运行
orca-client、orca-server等容器化服务,并通过 GitHub Actions 自动更新镜像。
1. 安装 K3s(国内镜像)
使用 Rancher 国内镜像安装脚本:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s安装完成后,可以检查 K3s 服务状态:
sudo systemctl status k3s如果服务正常运行,应能看到 active (running)。
2. 配置 kubectl
K3s 自带 kubectl,可以通过软链接直接使用。
2.1 创建 kubectl 软链接
sudo ln -s /usr/local/bin/k3s /usr/local/bin/kubectl如果系统中已经存在
/usr/local/bin/kubectl,请先检查现有文件,避免重复创建软链接。
2.2 开放 kubeconfig 读取权限
sudo chmod 644 /etc/rancher/k3s/k3s.yaml2.3 验证 Kubernetes 集群
查看节点:
kubectl get nodes查看所有命名空间中的 Pod:
kubectl get pods -A如果节点状态为 Ready,说明 K3s 集群基本正常。
3. 配置私有镜像仓库认证(GHCR)
如果 Docker 镜像存放在 GitHub Container Registry(ghcr.io),并且仓库或镜像需要认证,需要让 K3s/containerd 使用 GitHub 用户名和 PAT 拉取镜像。
3.1 创建 GitHub Personal Access Token
GitHub PAT 至少需要具备:
read:packages权限。
建议使用专门用于部署的 Token,并避免将 Token 直接写入 Git 仓库。
3.2 创建 K3s registry 配置
编辑:
/etc/rancher/k3s/registries.yaml可以使用:
sudo tee /etc/rancher/k3s/registries.yaml <<'EOF'
mirrors:
"ghcr.io":
endpoint:
- "https://ghcr.io"
configs:
"ghcr.io":
auth:
username: GitHub用户名
password: GitHub_PAT
EOF注意:YAML 对缩进敏感。不要直接把示例中的
GitHub用户名和GitHub_PAT原样使用。
3.3 重启 K3s
修改 registry 配置后:
sudo systemctl restart k3s检查服务:
sudo systemctl status k3s3.4 验证镜像拉取
例如:
kubectl run test \
--image=ghcr.io/用户名/镜像名:tag查看 Pod:
kubectl get pod test验证完成后删除:
kubectl delete pod test如果 Pod 能够正常进入 Running 或完成启动,说明 GHCR 认证及镜像拉取基本正常。
4. 编写 Kubernetes Deployment 与 Service
建议统一将 Kubernetes 部署文件放在:
~/deployments/例如:
~/deployments/
├── orca-client.yaml
└── orca-server.yaml4.1 orca-client.yaml
推荐同时定义 Deployment 和 Service。
apiVersion: apps/v1
kind: Deployment
metadata:
name: orca-client
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: orca-client
template:
metadata:
labels:
app: orca-client
spec:
containers:
- name: orca-client
image: ghcr.io/用户名/orca-client:latest
ports:
- containerPort: 5210
---
apiVersion: v1
kind: Service
metadata:
name: orca-client
namespace: default
spec:
type: LoadBalancer
selector:
app: orca-client
ports:
- port: 5210
targetPort: 52104.2 orca-server.yaml
orca-server 使用 5200 端口时:
apiVersion: apps/v1
kind: Deployment
metadata:
name: orca-server
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: orca-server
template:
metadata:
labels:
app: orca-server
spec:
containers:
- name: orca-server
image: ghcr.io/用户名/orca-server:latest
ports:
- containerPort: 5200
---
apiVersion: v1
kind: Service
metadata:
name: orca-server
namespace: default
spec:
type: LoadBalancer
selector:
app: orca-server
ports:
- port: 5200
targetPort: 5200如果只是
orca-client和orca-server在集群内部通信,建议使用ClusterIP,而不是LoadBalancer。只有需要从 Kubernetes 集群外部访问时,才需要考虑LoadBalancer或NodePort。
5. 部署与管理
5.1 部署
kubectl apply -f ~/deployments/orca-client.yaml
kubectl apply -f ~/deployments/orca-server.yaml5.2 查看部署、Pod 和 Service
kubectl get deploy,pods,svc也可以实时查看:
kubectl get pods -w5.3 查看 Pod 详情
kubectl describe pod <pod名称>例如:
kubectl describe pod orca-client-xxxxxxxxx-xxxxx重点关注:
- Events
- ImagePullBackOff
- ErrImagePull
- CrashLoopBackOff
- ContainerCreating
5.4 查看日志
kubectl logs <pod名称> -f如果 Pod 中有多个容器,需要指定容器:
kubectl logs <pod名称> -c orca-client -f5.5 更新镜像
kubectl set image deployment/orca-client \
orca-client=ghcr.io/用户名/orca-client:latest查看滚动更新状态:
kubectl rollout status deployment/orca-client5.6 回滚
kubectl rollout undo deployment/orca-client查看历史版本:
kubectl rollout history deployment/orca-client5.7 扩缩容
例如扩展到 3 个副本:
kubectl scale deployment/orca-client --replicas=3查看结果:
kubectl get pods -l app=orca-client5.8 删除部署
kubectl delete -f ~/deployments/orca-client.yaml6. Kubernetes Service 三种常见暴露方式
| 类型 | 访问范围 | 典型用途 |
|---|---|---|
ClusterIP | 仅集群内部 | 服务之间调用 |
NodePort | 集群外部,通过节点 IP + 端口访问 | 简单外部暴露 |
LoadBalancer | 集群外部 | 对外提供稳定服务入口 |
6.1 ClusterIP
spec:
type: ClusterIP例如:
http://orca-server:5200适合:
orca-client → orca-server这种 Kubernetes 集群内部调用场景。
6.2 NodePort
spec:
type: NodePort
ports:
- port: 5200
targetPort: 5200
nodePort: 30200外部可以通过:
服务器IP:30200访问服务。
6.3 LoadBalancer
K3s 默认提供 ServiceLB,可以使用:
spec:
type: LoadBalancer例如:
服务器IP:5200是否能够直接使用对应端口,还取决于 K3s ServiceLB、主机网络以及防火墙配置。
7. GitHub Actions CI/CD 自动部署
整体流程:
GitHub Push
│
▼
GitHub Actions
│
├── 构建 Docker Image
│
├── Push → ghcr.io
│
└── SSH → K3s Server
│
▼
kubectl set image
│
▼
Kubernetes Rolling Update8. GitHub Secrets 配置
在 GitHub Repository:
Settings
→ Secrets and variables
→ Actions
→ New repository secret配置:
| Secret | 说明 |
|---|---|
SSH_HOST | K3s 服务器 IP 或域名 |
SSH_USER | SSH 登录用户名 |
SSH_PRIVATE_KEY | SSH 私钥 |
8.1 SSH 私钥
建议使用专门的 CI/CD 部署密钥,而不是个人长期使用的 SSH 私钥。
服务器端需要允许对应公钥登录:
~/.ssh/authorized_keys9. GitHub Actions 部署步骤
可以使用 appleboy/ssh-action 连接服务器,然后执行 Kubernetes 更新命令。
示例:
- name: 部署到 K3s
if: env.IS_LATEST == 'true'
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
# 更新客户端镜像
sudo kubectl set image deployment/orca-client \
orca-client=ghcr.io/${{ env.ACTOR_LC }}/orca-client:latest
# 更新服务端镜像
sudo kubectl set image deployment/orca-server \
orca-server=ghcr.io/${{ env.ACTOR_LC }}/orca-server:latest
# 等待客户端滚动更新完成
sudo kubectl rollout status deployment/orca-client --timeout=120s
# 等待服务端滚动更新完成
sudo kubectl rollout status deployment/orca-server --timeout=120s10. 推荐的 CI/CD 镜像版本策略
直接使用:
:latest可以工作,但生产环境不建议长期依赖 latest。
更推荐使用 Git Commit SHA:
ghcr.io/username/orca-client:8f3a2c1GitHub Actions 构建:
# 使用 Git Commit SHA 作为不可变镜像版本
- name: 构建并推送镜像
run: |
docker build -t ghcr.io/${{ env.ACTOR_LC }}/orca-client:${{ github.sha }} .
docker push ghcr.io/${{ env.ACTOR_LC }}/orca-client:${{ github.sha }}然后部署:
# 使用不可变版本更新 Kubernetes Deployment
kubectl set image deployment/orca-client \
orca-client=ghcr.io/用户名/orca-client:提交SHA这样可以明确知道当前生产环境运行的是哪个 Git Commit。
11. 部署失败排查
11.1 查看 Pod
kubectl get pods -o wide11.2 镜像拉取失败
如果出现:
ImagePullBackOff
ErrImagePull查看:
kubectl describe pod <pod名称>重点检查:
- GHCR 镜像名称是否正确
- 镜像 Tag 是否存在
- GitHub PAT 是否有效
- PAT 是否具有
read:packages /etc/rancher/k3s/registries.yaml是否配置正确- 修改配置后是否重启 K3s
11.3 容器不断重启
如果出现:
CrashLoopBackOff查看:
kubectl logs <pod名称>如果容器已经重启过,可以查看上一次容器日志:
kubectl logs <pod名称> --previous11.4 Service 无法访问
查看:
kubectl get svc进一步检查 Endpoint:
kubectl get endpoints如果 Service 没有 Endpoint,通常需要检查:
Service selector
↓
Pod labels例如 Service:
selector:
app: orca-client必须能够匹配 Pod:
labels:
app: orca-client12. K3s 常用运维命令
查看 K3s 状态
sudo systemctl status k3s重启 K3s
sudo systemctl restart k3s查看 K3s 日志
sudo journalctl -u k3s -f查看 Kubernetes 资源
kubectl get all查看所有命名空间
kubectl get all -A查看节点资源
kubectl top node如果 kubectl top 不可用,需要确认 Metrics Server 是否正常运行。
13. 卸载 K3s
K3s 官方安装脚本通常会提供卸载脚本:
/usr/local/bin/k3s-uninstall.sh执行:
sudo /usr/local/bin/k3s-uninstall.sh卸载 K3s 会删除该节点上的 Kubernetes/K3s 相关资源,请确认重要数据已经完成备份。
14. 推荐目录结构
服务器上可以采用:
~/
├── deployments/
│ ├── orca-client.yaml
│ └── orca-server.yaml
│
└── ...K3s 配置:
/etc/rancher/k3s/
├── k3s.yaml
└── registries.yaml15. 推荐的生产化改进
当前方案适合单节点、内部使用或规模较小的部署。如果后续用于更正式的生产环境,建议逐步增加以下能力:
15.1 使用固定版本镜像
避免:
latest推荐:
v1.2.3或者:
Git SHA15.2 增加健康检查
在 Deployment 中加入:
# 存活探针:判断容器是否仍然正常运行
livenessProbe:
httpGet:
path: /health
port: 5200
initialDelaySeconds: 10
periodSeconds: 10
# 就绪探针:判断容器是否可以接收流量
readinessProbe:
httpGet:
path: /health
port: 5200
initialDelaySeconds: 5
periodSeconds: 5实际项目中应根据 orca-server 的健康检查接口调整。
15.3 增加资源限制
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "1"
memory: "1Gi"避免单个服务异常消耗节点全部资源。
15.4 使用 Secret 管理敏感信息
不要把:
GitHub PAT
数据库密码
JWT Secret
第三方 API Key直接写进 Deployment YAML。
可以使用 Kubernetes Secret:
kubectl create secret generic orca-secret \
--from-literal=DATABASE_PASSWORD='你的数据库密码'然后通过环境变量或 Volume 注入容器。
15.5 配置持久化存储
如果 orca-server 会保存实时数据、日志或业务数据,不建议依赖容器文件系统。
应根据数据类型选择:
PersistentVolume
PersistentVolumeClaim
NFS
本地磁盘
对象存储
数据库对于高吞吐实时数据,还应单独设计数据落盘策略,而不是简单依赖容器生命周期。
16. 最终架构
整体可以形成如下结构:
GitHub
│
│ Push
▼
GitHub Actions
│
┌─────────┴─────────┐
│ │
▼ ▼
Docker Build SSH Deploy
│ │
▼ ▼
GHCR K3s Server
ghcr.io │
│ │
│ ┌────────┴────────┐
│ │ │
│ ▼ ▼
│ orca-client orca-server
│ :5210 :5200
│ │ │
│ └───────┬─────────┘
│ │
└──────────────────┘
镜像更新核心组件
| 组件 | 作用 |
|---|---|
| K3s | 轻量级 Kubernetes 集群 |
| containerd | 容器运行时 |
| GHCR | Docker 镜像仓库 |
| Kubernetes Deployment | 管理应用 Pod |
| Kubernetes Service | 提供服务发现和网络访问 |
| GitHub Actions | CI/CD 自动化 |
| SSH Action | 从 GitHub Actions 连接服务器 |
| kubectl | Kubernetes 集群管理工具 |
17. 部署流程总结
完整流程:
① 安装 K3s
↓
② 配置 kubectl
↓
③ 配置 GHCR 认证
↓
④ 编写 Deployment + Service
↓
⑤ kubectl apply
↓
⑥ 验证 Pod / Service
↓
⑦ GitHub Actions 构建 Docker 镜像
↓
⑧ Push 到 GHCR
↓
⑨ SSH 登录 K3s
↓
⑩ kubectl set image
↓
⑪ Kubernetes Rolling Update
↓
⑫ rollout status 验证这套方案可以作为在单台服务器上的基础 K3s 部署方案,并可以进一步演进到多节点 K3s、Ingress、HTTPS、持久化存储、Secret 管理、监控告警以及 GitOps(例如 Argo CD)架构。
