#!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" CONFIG_FILE="$PROJECT_DIR/config/cluster-vars.yml" echo "=== 推送Nginx测试应用到Gitea ===" # 读取配置 GITEA_USER=$(yq eval '.gitea_user_name' "$CONFIG_FILE") GITEA_PASSWORD=$(yq eval '.gitea_user_password' "$CONFIG_FILE") GITEA_ORG=$(yq eval '.gitea_org_name' "$CONFIG_FILE") NGINX_REPO=$(yq eval '.nginx_app_repo_name' "$CONFIG_FILE") NGINX_DOMAIN=$(yq eval '.nginx_app_domain' "$CONFIG_FILE") # 获取Gitea NodePort GITEA_NODEPORT=$(kubectl get svc gitea-http -n gitea -o jsonpath='{.spec.ports[0].nodePort}') NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="ExternalIP")].address}') if [ -z "$NODE_IP" ]; then NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}') fi GITEA_URL="http://$NODE_IP:$GITEA_NODEPORT" REPO_URL="$GITEA_URL/$GITEA_ORG/$NGINX_REPO.git" # 创建临时目录 TEMP_DIR=$(mktemp -d) cd "$TEMP_DIR" echo "📝 创建Nginx应用清单..." # 创建manifests目录 mkdir -p manifests # 创建Nginx Deployment cat > manifests/deployment.yaml < manifests/configmap.yaml < Nginx Test - GitOps Demo
🚀

Nginx Test Application

Version: v1.0
域名: ${NGINX_DOMAIN}
应用名称: nginx-test
镜像: nginx:1.25-alpine
副本数: 2
部署方式: GitOps (ArgoCD)
✓ Kubernetes ✓ GitOps ✓ ArgoCD ✓ Nginx
EOF # 创建Service cat > manifests/service.yaml < manifests/ingress.yaml < README.md <: \`\`\` ## 更新应用 ### 方式1: 修改版本号 编辑 \`manifests/configmap.yaml\` 中的 HTML 内容,修改版本号: \`\`\`html
Version: v2.0
\`\`\` ### 方式2: 修改副本数 编辑 \`manifests/deployment.yaml\`: \`\`\`yaml spec: replicas: 3 # 修改副本数 \`\`\` ### 方式3: 更新Nginx配置 编辑 \`manifests/configmap.yaml\` 中的 nginx 配置。 提交更改后,ArgoCD会在3分钟内自动检测并部署新版本。 ## 监控部署状态 \`\`\`bash # 查看ArgoCD Application状态 kubectl get application nginx-app -n argocd # 查看Pod状态 kubectl get pods -l app=nginx-test -n default # 查看Ingress状态 kubectl get ingress nginx-test -n default # 查看应用日志 kubectl logs -l app=nginx-test -n default --tail=50 \`\`\` ## 健康检查 应用提供了健康检查端点: \`\`\`bash curl https://${NGINX_DOMAIN}/health \`\`\` ## 故障排查 ### 检查Pod状态 \`\`\`bash kubectl describe pod -l app=nginx-test -n default \`\`\` ### 检查Ingress \`\`\`bash kubectl describe ingress nginx-test -n default \`\`\` ### 检查ArgoCD同步状态 \`\`\`bash kubectl describe application nginx-app -n argocd \`\`\` ## GitOps工作流 1. 开发者修改 \`manifests/\` 目录下的配置文件 2. 提交并推送到Git仓库 3. ArgoCD自动检测到变化(每3分钟轮询一次) 4. ArgoCD自动同步并部署到K3s集群 5. 应用自动更新,无需手动执行kubectl命令 ## 回滚操作 如果需要回滚到之前的版本: \`\`\`bash # 查看Git历史 git log --oneline # 回滚到指定commit git revert git push # 或者通过ArgoCD UI进行回滚 \`\`\` ## 技术栈 - **容器编排**: Kubernetes (K3s) - **Web服务器**: Nginx 1.25 - **GitOps工具**: ArgoCD - **Git仓库**: Gitea - **Ingress控制器**: Nginx Ingress Controller - **证书管理**: cert-manager (Let's Encrypt) ## 注意事项 1. 确保DNS已正确配置,${NGINX_DOMAIN} 指向K3s集群节点IP 2. 首次访问HTTPS可能需要等待证书签发(约1-2分钟) 3. ArgoCD默认每3分钟检查一次Git仓库更新 4. 可以通过ArgoCD UI手动触发同步以立即部署更改 ## 相关链接 - ArgoCD Dashboard: https://argocd.jpc.net3w.com - Gitea Repository: http://:/k3s-apps/nginx-app - Application URL: https://${NGINX_DOMAIN} EOF # 创建更新脚本 cat > update-app.sh <<'SCRIPT_EOF' #!/bin/bash set -e VERSION=${1:-v2.0} echo "🔄 更新Nginx应用到版本 $VERSION" # 修改版本号 sed -i "s/Version: v[0-9.]*/Version: $VERSION/" manifests/configmap.yaml # 根据版本修改背景色 case $VERSION in v1.0) COLOR="linear-gradient(135deg, #667eea 0%, #764ba2 100%)" ;; v2.0) COLOR="linear-gradient(135deg, #f093fb 0%, #f5576c 100%)" ;; v3.0) COLOR="linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)" ;; *) COLOR="linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)" ;; esac sed -i "s|background: linear-gradient([^)]*)|background: $COLOR|" manifests/configmap.yaml # 提交更改 git add manifests/configmap.yaml git commit -m "Update nginx-app to $VERSION Co-Authored-By: Claude Sonnet 4.5 " git push echo "✅ 更新完成!" echo "⏳ 等待ArgoCD同步(约3分钟)..." echo "🌐 访问 https://ng.jpc.net3w.com 查看更新" SCRIPT_EOF chmod +x update-app.sh # 初始化Git仓库 echo "🔧 初始化Git仓库..." git init -b main git config user.name "$GITEA_USER" git config user.email "$GITEA_USER@example.com" git add . git commit -m "Initial commit: Add nginx test application Co-Authored-By: Claude Sonnet 4.5 " # 推送到Gitea echo "📤 推送到Gitea..." git remote add origin "$REPO_URL" # URL encode the password to handle special characters ENCODED_PASSWORD=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$GITEA_PASSWORD'))") git push -u origin main || { echo "⚠️ 首次推送失败,尝试使用凭证..." git remote set-url origin "http://$GITEA_USER:$ENCODED_PASSWORD@$NODE_IP:$GITEA_NODEPORT/$GITEA_ORG/$NGINX_REPO.git" git push -u origin main } # 清理 cd "$PROJECT_DIR" rm -rf "$TEMP_DIR" echo "" echo "✅ Nginx测试应用推送成功!" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📊 仓库信息:" echo " - 仓库地址: $REPO_URL" echo " - Gitea访问: $GITEA_URL/$GITEA_ORG/$NGINX_REPO" echo "" echo "🌐 应用信息:" echo " - 域名: https://${NGINX_DOMAIN}" echo " - 应用名称: nginx-test" echo " - 命名空间: default" echo "" echo "📝 下一步:" echo " 1. 运行: ./scripts/create-nginx-argocd-app.sh" echo " 2. 等待ArgoCD同步(约3分钟)" echo " 3. 访问: https://${NGINX_DOMAIN}" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"