fix: 将 k3s-ansible 作为普通目录添加

This commit is contained in:
fei
2026-02-04 23:43:40 +08:00
commit 7f6c8b9b92
40 changed files with 10909 additions and 0 deletions

361
NGINX-APP-GUIDE.md Normal file
View File

@@ -0,0 +1,361 @@
# Nginx测试应用 - 自动化部署指南
## 概述
这是一个基于GitOps模式的Nginx测试应用用于演示K3s集群的自动化部署流程。
## 应用信息
- **应用名称**: nginx-test
- **域名**: ng.jpc.net3w.com
- **镜像**: nginx:1.25-alpine
- **副本数**: 2
- **部署方式**: GitOps (Gitea + ArgoCD)
## 快速部署
### 一键部署
```bash
./scripts/deploy-nginx-app.sh
```
这个脚本会自动完成以下步骤:
1. 检查依赖和集群状态
2. 在Gitea中创建nginx-app仓库
3. 推送应用manifests到Git仓库
4. 在ArgoCD中创建Application
5. 等待自动同步完成
### 分步部署
如果需要分步执行,可以运行:
```bash
# 步骤1: 推送应用到Gitea
./scripts/push-nginx-app.sh
# 步骤2: 创建ArgoCD Application
./scripts/create-nginx-argocd-app.sh
```
## 访问应用
### 通过域名访问(推荐)
```bash
# HTTP访问会自动重定向到HTTPS
curl http://ng.jpc.net3w.com
# HTTPS访问
curl https://ng.jpc.net3w.com
# 浏览器访问
https://ng.jpc.net3w.com
```
### 通过NodePort访问
```bash
# 获取Service信息
kubectl get svc nginx-test -n default
# 访问应用
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}')
NODE_PORT=$(kubectl get svc nginx-test -n default -o jsonpath='{.spec.ports[0].nodePort}')
curl http://$NODE_IP:$NODE_PORT
```
## 验证部署
```bash
# 查看Pod状态
kubectl get pods -l app=nginx-test -n default
# 查看Service
kubectl get svc nginx-test -n default
# 查看Ingress
kubectl get ingress nginx-test -n default
# 查看ArgoCD Application状态
kubectl get application nginx-app -n argocd
# 查看详细信息
kubectl describe application nginx-app -n argocd
```
## 更新应用
### 方式1: 使用更新脚本(推荐)
SSH到master节点运行更新脚本
```bash
# SSH到master节点
ssh fei@8.216.38.248
# 进入应用目录
cd /home/fei/k3s/nginx-app
# 更新到v2.0版本
./update-app.sh v2.0
# 更新到v3.0版本
./update-app.sh v3.0
```
### 方式2: 手动修改Git仓库
1. 克隆仓库:
```bash
git clone http://<NODE_IP>:<GITEA_PORT>/k3s-apps/nginx-app.git
cd nginx-app
```
2. 修改配置文件:
```bash
# 修改版本号
vim manifests/configmap.yaml
# 将 "Version: v1.0" 改为 "Version: v2.0"
# 或修改副本数
vim manifests/deployment.yaml
# 将 replicas: 2 改为 replicas: 3
```
3. 提交并推送:
```bash
git add .
git commit -m "Update to v2.0"
git push
```
4. 等待ArgoCD自动同步约3分钟
### 方式3: 通过ArgoCD UI手动同步
1. 访问ArgoCD: https://argocd.jpc.net3w.com
2. 找到nginx-app应用
3. 点击"SYNC"按钮立即同步
## 监控同步状态
```bash
# 实时监控ArgoCD同步状态
watch kubectl get application nginx-app -n argocd
# 查看Pod更新状态
watch kubectl get pods -l app=nginx-test -n default
# 查看应用日志
kubectl logs -l app=nginx-test -n default --tail=50 -f
```
## GitOps工作流
```
开发者修改代码
提交到Git仓库 (Gitea)
ArgoCD检测到变化 (每3分钟轮询)
ArgoCD自动同步
K3s集群自动部署
应用更新完成
```
## 架构说明
### 组件关系
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Gitea │─────▶│ ArgoCD │─────▶│ K3s Cluster│
│ (Git仓库) │ │ (GitOps工具) │ │ (应用运行) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
│ │ │
manifests/ 监控&同步 nginx-test
- deployment.yaml - Deployment
- service.yaml - Service
- ingress.yaml - Ingress
- configmap.yaml - ConfigMap
```
### 网络访问
```
Internet
DNS (ng.jpc.net3w.com)
Nginx Ingress Controller
Service (nginx-test)
Pods (nginx-test)
```
## 配置文件说明
### 1. Deployment (manifests/deployment.yaml)
定义应用的部署配置:
- 副本数: 2
- 镜像: nginx:1.25-alpine
- 资源限制: CPU 100m-200m, Memory 64Mi-128Mi
- 健康检查: liveness和readiness探针
### 2. Service (manifests/service.yaml)
定义服务访问方式:
- 类型: ClusterIP
- 端口: 80
### 3. Ingress (manifests/ingress.yaml)
定义外部访问规则:
- 域名: ng.jpc.net3w.com
- TLS: 自动签发Let's Encrypt证书
- 自动HTTPS重定向
### 4. ConfigMap (manifests/configmap.yaml)
包含两个ConfigMap
- nginx-config: Nginx配置文件
- nginx-html: 自定义HTML页面
## 故障排查
### 问题1: 无法访问域名
```bash
# 检查DNS解析
nslookup ng.jpc.net3w.com
# 检查Ingress状态
kubectl describe ingress nginx-test -n default
# 检查证书状态
kubectl get certificate -n default
```
### 问题2: Pod无法启动
```bash
# 查看Pod详情
kubectl describe pod -l app=nginx-test -n default
# 查看Pod日志
kubectl logs -l app=nginx-test -n default
# 查看事件
kubectl get events -n default --sort-by='.lastTimestamp'
```
### 问题3: ArgoCD不同步
```bash
# 查看Application状态
kubectl describe application nginx-app -n argocd
# 手动触发同步
kubectl patch application nginx-app -n argocd \
--type merge -p '{"operation":{"initiatedBy":{"username":"admin"},"sync":{"revision":"HEAD"}}}'
# 或通过ArgoCD CLI
argocd app sync nginx-app
```
### 问题4: 证书未签发
```bash
# 查看证书请求
kubectl get certificaterequest -n default
# 查看cert-manager日志
kubectl logs -n cert-manager -l app=cert-manager
# 手动删除并重新创建证书
kubectl delete certificate nginx-test-tls -n default
kubectl delete secret nginx-test-tls -n default
```
## 回滚操作
### 通过Git回滚
```bash
# 查看提交历史
git log --oneline
# 回滚到指定版本
git revert <commit-hash>
git push
# ArgoCD会自动同步回滚
```
### 通过ArgoCD回滚
```bash
# 查看历史版本
argocd app history nginx-app
# 回滚到指定版本
argocd app rollback nginx-app <revision-id>
```
## 清理资源
```bash
# 删除ArgoCD Application会自动删除K8s资源
kubectl delete application nginx-app -n argocd
# 删除Gitea仓库通过API
GITEA_USER="argocd"
GITEA_PASSWORD="ArgoCD@2026"
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}')
GITEA_PORT=$(kubectl get svc gitea-http -n gitea -o jsonpath='{.spec.ports[0].nodePort}')
curl -X DELETE \
-u "$GITEA_USER:$GITEA_PASSWORD" \
"http://$NODE_IP:$GITEA_PORT/api/v1/repos/k3s-apps/nginx-app"
```
## 相关链接
- **应用访问**: https://ng.jpc.net3w.com
- **ArgoCD Dashboard**: https://argocd.jpc.net3w.com
- **Gitea仓库**: http://<NODE_IP>:<GITEA_PORT>/k3s-apps/nginx-app
## 技术栈
- **容器编排**: Kubernetes (K3s v1.28.5)
- **Web服务器**: Nginx 1.25 Alpine
- **GitOps工具**: ArgoCD
- **Git仓库**: Gitea
- **Ingress控制器**: Nginx Ingress Controller
- **证书管理**: cert-manager (Let's Encrypt)
## 最佳实践
1. **版本控制**: 所有配置都通过Git管理便于追踪和回滚
2. **自动化部署**: 修改Git仓库后自动部署无需手动操作
3. **声明式配置**: 使用Kubernetes manifests声明期望状态
4. **健康检查**: 配置liveness和readiness探针确保服务可用
5. **资源限制**: 设置CPU和内存限制防止资源耗尽
6. **HTTPS加密**: 自动签发SSL证书保护数据传输
7. **高可用**: 运行2个副本提供冗余
## 注意事项
1. 确保DNS已正确配置ng.jpc.net3w.com指向K3s集群节点IP
2. 首次访问HTTPS可能需要等待证书签发约1-2分钟
3. ArgoCD默认每3分钟检查一次Git仓库更新
4. 可以通过ArgoCD UI手动触发同步以立即部署更改
5. 修改配置前建议先备份或创建Git分支