Files
k3s_auto_deploy/README.md

17 KiB
Raw Permalink Blame History

K3s集群自动化部署与GitOps方案含Gitea私有Git服务

概述

本项目提供完整的K3s集群自动化部署方案集成Gitea私有Git服务器和ArgoCD实现完整的GitOps工作流。所有配置参数化完全支持幂等部署,可在重装系统后无需手动调试即可自动化部署。

🎯 核心特性

  • 完全幂等: 所有脚本可重复执行,不会破坏现有配置
  • 一键部署: 使用 deploy-all.sh 统一编排所有步骤
  • 断点续传: 部署失败后可从中断处继续
  • 自动重试: 网络失败自动重试,提高可靠性
  • 工具检查: 自动检查和安装所有依赖工具
  • 状态管理: 记录已完成步骤,避免重复执行
  • 详细日志: 完整的部署日志便于问题排查
  • 验证脚本: 自动验证部署状态和服务健康

实际环境信息

  • 集群规模: 1 master + 2 worker节点
  • 主节点: 8.216.38.248 (内网: 172.23.96.138) - *.jpc.net3w.com
  • 从节点1: 8.216.41.97 (内网: 172.23.96.139) - *.jpc2.net3w.com
  • 从节点2: 8.216.33.69 (内网: 172.23.96.140) - *.jpc3.net3w.com
  • SSH用户: fei / 密码: 1
  • 目标目录: /home/fei/k3s

特性

部署特性

  • 基于k3s-ansible的幂等部署
  • 统一部署脚本 deploy-all.sh 编排所有步骤
  • 自动检查和安装依赖工具yq, htpasswd, helm等
  • 网络下载自动重试机制
  • 部署状态持久化,支持断点续传
  • 详细的日志记录和错误处理

功能特性

  • 所有敏感信息变量化配置
  • 一键部署K3s集群
  • 自动部署Gitea私有Git服务器
  • 自动创建Gitea组织、仓库和用户
  • 自动安装和配置ArgoCD
  • ArgoCD连接Gitea实现GitOps自动同步部署
  • 自动配置HTTPS证书cert-manager + Let's Encrypt
  • 部署验证脚本自动检查所有服务

认证方式

  • 支持密码认证和SSH密钥认证
  • 支持Ansible Vault加密

目录结构

.
├── config/
│   ├── cluster-vars.yml.example  # 配置模板
│   └── cluster-vars.yml          # 实际配置(已创建)
├── scripts/
│   ├── lib/
│   │   └── common.sh             # 通用函数库(新增)
│   ├── deploy-all.sh             # 统一部署脚本(新增)
│   ├── verify-deployment.sh      # 部署验证脚本(新增)
│   ├── generate-inventory.py     # 生成Ansible inventory支持密码认证
│   ├── deploy.sh                 # K3s部署脚本
│   ├── deploy-gitea.sh           # Gitea部署脚本
│   ├── setup-gitea.sh            # Gitea初始化脚本
│   ├── deploy-argocd.sh          # ArgoCD部署脚本已改进
│   ├── deploy-https.sh           # HTTPS证书配置脚本新增
│   ├── create-argocd-app.sh      # 创建ArgoCD应用
│   └── push-demo-app.sh          # 推送示例应用
├── templates/                    # 模板文件
├── k3s-ansible/                  # k3s-ansible项目需克隆
├── .deployment-state             # 部署状态文件(自动生成)
└── deployment.log                # 部署日志(自动生成)

快速开始

方式一:一键部署(推荐)

使用统一部署脚本自动完成所有步骤:

cd /home/fei/opk3s/k3s自动化部署

# 克隆k3s-ansible首次需要
git clone https://github.com/k3s-io/k3s-ansible.git

# 设置脚本执行权限
chmod +x scripts/*.sh scripts/*.py

# 一键部署所有组件
./scripts/deploy-all.sh

特性:

  • 自动检查所有前置条件
  • 自动安装缺失的工具
  • 按正确顺序执行所有步骤
  • 失败后可断点续传
  • 详细的进度显示和日志

断点续传: 如果部署中途失败,修复问题后直接重新运行即可从中断处继续:

./scripts/deploy-all.sh

重置状态: 如果需要从头开始部署:

./scripts/deploy-all.sh --reset

方式二:分步部署

如果需要更细粒度的控制,可以手动执行各个步骤:

1. 克隆k3s-ansible项目

cd /home/fei/opk3s/k3s自动化部署
git clone https://github.com/k3s-io/k3s-ansible.git

2. 设置脚本执行权限

chmod +x scripts/*.sh scripts/*.py

3. 部署K3s集群

./scripts/deploy.sh

4. 部署Gitea私有Git服务器

./scripts/deploy-gitea.sh

5. 初始化Gitea

./scripts/setup-gitea.sh

6. 部署ArgoCD

./scripts/deploy-argocd.sh

7. 配置HTTPS证书

./scripts/deploy-https.sh

8. 创建ArgoCD应用

./scripts/create-argocd-app.sh

9. 推送示例应用

./scripts/push-demo-app.sh

验证部署

部署完成后,运行验证脚本检查所有服务:

./scripts/verify-deployment.sh

验证脚本会检查:

  • K3s集群状态
  • Gitea服务
  • ArgoCD服务
  • HTTPS证书
  • GitOps工作流
  • 存储卷状态

配置说明

节点配置(实际配置)

master_nodes:
  - hostname: k3s-master-01
    public_ip: "8.216.38.248"
    private_ip: "172.23.96.138"
    ssh_user: "fei"
    ssh_password: "1"              # 使用密码认证

worker_nodes:
  - hostname: k3s-worker-01
    public_ip: "8.216.41.97"
    private_ip: "172.23.96.139"
    ssh_user: "fei"
    ssh_password: "1"
  - hostname: k3s-worker-02
    public_ip: "8.216.33.69"
    private_ip: "172.23.96.140"
    ssh_user: "fei"
    ssh_password: "1"

K3s配置

k3s_version: "v1.28.5+k3s1"
k3s_token: ""                      # 留空自动生成
flannel_iface: "eth0"
target_dir: "/home/fei/k3s"

域名配置

domain_name: "jpc.net3w.com"
master_domain: "jpc1.net3w.com"
worker1_domain: "jpc2.net3w.com"
worker2_domain: "jpc3.net3w.com"
gitea_domain: "git.jpc.net3w.com"
argocd_domain: "argocd.jpc.net3w.com"

Gitea配置私有Git服务器

gitea_enabled: true
gitea_admin_user: "gitea_admin"
gitea_admin_password: "GitAdmin@2026"
gitea_org_name: "k3s-apps"
gitea_repo_name: "demo-app"
gitea_user_name: "argocd"          # ArgoCD使用的用户
gitea_user_password: "ArgoCD@2026"

ArgoCD配置

argocd_admin_password: "ArgoAdmin@2026"
git_repo_url: "http://gitea-http.gitea.svc.cluster.local:3000/k3s-apps/demo-app.git"

验证部署

自动验证(推荐)

使用验证脚本自动检查所有服务:

./scripts/verify-deployment.sh

验证脚本会检查:

  • K3s集群状态节点、系统Pod
  • Gitea服务部署、Pod、访问地址
  • ArgoCD服务Server、Controller、Repo Server
  • HTTPS证书cert-manager、ClusterIssuer、Certificate
  • GitOps工作流ArgoCD Application状态
  • 存储卷状态PV、PVC

手动验证

验证K3s集群

# 查看节点状态
kubectl get nodes

# 查看所有Pod
kubectl get pods -A

# 创建测试Pod
kubectl run test --image=nginx

验证Gitea

# 查看Gitea Pod状态
kubectl get pods -n gitea

# 查看Gitea服务
kubectl get svc -n gitea

# 获取Gitea访问地址
GITEA_NODEPORT=$(kubectl get svc gitea-http -n gitea -o jsonpath='{.spec.ports[0].nodePort}')
echo "Gitea访问地址: http://8.216.38.248:$GITEA_NODEPORT"

验证ArgoCD

# 查看ArgoCD Pod状态
kubectl get pods -n argocd

# 查看ArgoCD服务
kubectl get svc -n argocd

# 获取ArgoCD访问地址
ARGOCD_NODEPORT=$(kubectl get svc argocd-server -n argocd -o jsonpath='{.spec.ports[0].nodePort}')
echo "ArgoCD访问地址: https://8.216.38.248:$ARGOCD_NODEPORT"
echo "用户名: admin"
echo "密码: ArgoAdmin@2026"

# 查看Application状态
kubectl get application -n argocd

验证GitOps

# 查看应用同步状态
kubectl describe application demo-app -n argocd

# 查看示例应用
kubectl get pods -n default
kubectl get svc demo-nginx -n default

# 访问示例应用
curl http://8.216.38.248:30080

# 测试自动同步修改Gitea仓库内容等待3分钟观察自动部署

安全建议

1. 使用Ansible Vault加密配置

# 加密配置文件
ansible-vault encrypt config/cluster-vars.yml

# 编辑加密文件
ansible-vault edit config/cluster-vars.yml

# 部署时使用加密文件
cd k3s-ansible
ansible-playbook site.yml -i inventory/hosts.ini -e "@../config/cluster-vars.yml" --ask-vault-pass

2. 限制文件权限

chmod 600 config/cluster-vars.yml

3. 不要提交敏感信息到Git

.gitignore已配置忽略敏感文件:

  • config/cluster-vars.yml
  • config/*-vars.yml
  • *.vault

故障排查

K3s部署失败

# 测试SSH连接
ansible all -i k3s-ansible/inventory/hosts.ini -m ping

# 查看详细日志
cd k3s-ansible
ansible-playbook site.yml -i inventory/hosts.ini -e "@../config/cluster-vars.yml" -vvv

Gitea无法访问

# 检查Pod状态
kubectl get pods -n gitea

# 查看日志
kubectl logs -n gitea -l app.kubernetes.io/name=gitea

# 检查Service
kubectl get svc -n gitea

# 检查持久化存储
kubectl get pvc -n gitea

ArgoCD无法访问

# 检查Pod状态
kubectl get pods -n argocd

# 查看日志
kubectl logs -n argocd deployment/argocd-server

# 检查Service
kubectl get svc -n argocd

GitOps同步失败

# 查看Application详情
kubectl describe application demo-app -n argocd

# 查看ArgoCD控制器日志
kubectl logs -n argocd deployment/argocd-application-controller

# 测试ArgoCD到Gitea的连接
kubectl exec -n argocd deployment/argocd-server -- curl -v http://gitea-http.gitea.svc.cluster.local:3000

# 检查Gitea仓库凭证
kubectl get secret gitea-creds -n argocd -o yaml

幂等性保证

什么是幂等性?

幂等性意味着脚本可以重复执行多次,每次都会产生相同的结果,不会破坏现有配置或产生错误。

本项目的幂等性实现

1. 统一部署脚本 (deploy-all.sh)

  • 状态持久化: 记录已完成的步骤到 .deployment-state 文件
  • 断点续传: 失败后重新运行会跳过已完成的步骤
  • 重复执行安全: 已完成的步骤会被自动跳过

2. 工具依赖检查

  • 自动检测: 检查工具是否已安装
  • 自动安装: 缺失的工具自动安装
  • 重试机制: 网络下载失败自动重试最多3次

3. K3s部署 (deploy.sh)

  • 使用Ansible的幂等特性
  • 重复执行不会重新安装已存在的组件
  • kubectl配置自动检测和更新

4. Gitea部署 (deploy-gitea.sh)

  • 使用Helm的幂等特性
  • 命名空间已存在时自动跳过创建
  • 重复执行会更新配置而不是重新安装

5. ArgoCD部署 (deploy-argocd.sh)

  • 使用 kubectl apply 声明式部署
  • 自动检测htpasswd和yq工具
  • 密码更新使用patch操作安全幂等

6. HTTPS配置 (deploy-https.sh)

  • cert-manager CRDs和组件使用 kubectl apply
  • ClusterIssuer和Ingress可重复应用
  • 证书自动续期,无需手动干预

测试幂等性

重复执行部署脚本验证幂等性:

# 第一次部署
./scripts/deploy-all.sh

# 验证部署
./scripts/verify-deployment.sh

# 重复执行(应该跳过所有已完成步骤)
./scripts/deploy-all.sh

# 再次验证(状态应该不变)
./scripts/verify-deployment.sh

重装系统后的部署流程

  1. 准备环境:

    # 创建fei用户如果不存在
    sudo useradd -m -s /bin/bash fei
    sudo passwd fei
    
    # 配置sudo权限
    echo "fei ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/fei
    
  2. 复制配置文件:

    # 备份配置文件
    cp config/cluster-vars.yml ~/cluster-vars.yml.backup
    
    # 重装系统后恢复
    cp ~/cluster-vars.yml.backup config/cluster-vars.yml
    
  3. 一键部署:

    ./scripts/deploy-all.sh
    
  4. 验证部署:

    ./scripts/verify-deployment.sh
    

常见问题

Q: 部署失败后如何继续? A: 直接重新运行 ./scripts/deploy-all.sh,脚本会自动跳过已完成的步骤。

Q: 如何从头开始部署? A: 运行 ./scripts/deploy-all.sh --reset 清除状态后重新部署。

Q: 网络下载失败怎么办? A: 脚本会自动重试3次如果仍然失败检查网络连接后重新运行。

Q: 如何查看部署日志? A: 查看 deployment.log 文件获取详细日志。

部署架构

┌─────────────────────────────────────────────────────────────┐
│                    K3s Cluster (3 nodes)                     │
│                                                               │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │   Master     │  │   Worker 1   │  │   Worker 2   │      │
│  │ 8.216.38.248 │  │ 8.216.41.97  │  │ 8.216.33.69  │      │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
│                                                               │
│  ┌─────────────────────────────────────────────────────┐    │
│  │         Gitea (Private Git Server)                  │    │
│  │         git.jpc.net3w.com (NodePort)                │    │
│  │  - Organization: k3s-apps                           │    │
│  │  - Repository: demo-app                             │    │
│  │  - User: argocd (for ArgoCD access)                 │    │
│  └─────────────────────────────────────────────────────┘    │
│                          ↓                                    │
│                    (Git Sync)                                 │
│                          ↓                                    │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              ArgoCD (GitOps Engine)                  │    │
│  │       argocd.jpc.net3w.com (NodePort)               │    │
│  │  - Monitors Gitea repository                        │    │
│  │  - Auto-sync on Git push                            │    │
│  │  - Deploys to K3s cluster                           │    │
│  └─────────────────────────────────────────────────────┘    │
│                          ↓                                    │
│                   (Auto Deploy)                               │
│                          ↓                                    │
│  ┌─────────────────────────────────────────────────────┐    │
│  │           Application Workloads                      │    │
│  │  - demo-nginx (example app)                         │    │
│  │  - Managed by ArgoCD from Gitea                     │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

Developer Workflow:
1. Developer pushes code to Gitea (git.jpc.net3w.com)
2. ArgoCD detects changes (polling every 3 minutes)
3. ArgoCD syncs and deploys to K3s cluster
4. Application updates automatically

后续优化

  1. 配置Ingress: 使用Traefik Ingress暴露服务
    • ArgoCD: argocd.jpc.net3w.com
    • Gitea: git.jpc.net3w.com
  2. HTTPS证书: 集成cert-manager + Let's Encrypt自动管理证书
  3. RBAC配置: 为不同团队配置Gitea和ArgoCD权限
  4. 多环境管理: 使用ArgoCD ApplicationSet管理dev/staging/prod
  5. 监控告警: 集成Prometheus和Grafana
  6. 备份方案:
    • K3s etcd自动备份
    • Gitea数据持久化和备份
  7. CI/CD集成: 集成Gitea Actions或Jenkins
  8. 镜像仓库: 部署Harbor私有镜像仓库
  9. SSH密钥认证: 替换密码认证提高安全性

参考资源

许可证

本项目使用MIT许可证。