# 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://:/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 git push # ArgoCD会自动同步回滚 ``` ### 通过ArgoCD回滚 ```bash # 查看历史版本 argocd app history nginx-app # 回滚到指定版本 argocd app rollback nginx-app ``` ## 清理资源 ```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://:/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分支