7.9 KiB
7.9 KiB
Nginx测试应用 - 自动化部署指南
概述
这是一个基于GitOps模式的Nginx测试应用,用于演示K3s集群的自动化部署流程。
应用信息
- 应用名称: nginx-test
- 域名: ng.jpc.net3w.com
- 镜像: nginx:1.25-alpine
- 副本数: 2
- 部署方式: GitOps (Gitea + ArgoCD)
快速部署
一键部署
./scripts/deploy-nginx-app.sh
这个脚本会自动完成以下步骤:
- 检查依赖和集群状态
- 在Gitea中创建nginx-app仓库
- 推送应用manifests到Git仓库
- 在ArgoCD中创建Application
- 等待自动同步完成
分步部署
如果需要分步执行,可以运行:
# 步骤1: 推送应用到Gitea
./scripts/push-nginx-app.sh
# 步骤2: 创建ArgoCD Application
./scripts/create-nginx-argocd-app.sh
访问应用
通过域名访问(推荐)
# HTTP访问(会自动重定向到HTTPS)
curl http://ng.jpc.net3w.com
# HTTPS访问
curl https://ng.jpc.net3w.com
# 浏览器访问
https://ng.jpc.net3w.com
通过NodePort访问
# 获取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
验证部署
# 查看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节点,运行更新脚本:
# 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仓库
- 克隆仓库:
git clone http://<NODE_IP>:<GITEA_PORT>/k3s-apps/nginx-app.git
cd nginx-app
- 修改配置文件:
# 修改版本号
vim manifests/configmap.yaml
# 将 "Version: v1.0" 改为 "Version: v2.0"
# 或修改副本数
vim manifests/deployment.yaml
# 将 replicas: 2 改为 replicas: 3
- 提交并推送:
git add .
git commit -m "Update to v2.0"
git push
- 等待ArgoCD自动同步(约3分钟)
方式3: 通过ArgoCD UI手动同步
- 访问ArgoCD: https://argocd.jpc.net3w.com
- 找到nginx-app应用
- 点击"SYNC"按钮立即同步
监控同步状态
# 实时监控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: 无法访问域名
# 检查DNS解析
nslookup ng.jpc.net3w.com
# 检查Ingress状态
kubectl describe ingress nginx-test -n default
# 检查证书状态
kubectl get certificate -n default
问题2: Pod无法启动
# 查看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不同步
# 查看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: 证书未签发
# 查看证书请求
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回滚
# 查看提交历史
git log --oneline
# 回滚到指定版本
git revert <commit-hash>
git push
# ArgoCD会自动同步回滚
通过ArgoCD回滚
# 查看历史版本
argocd app history nginx-app
# 回滚到指定版本
argocd app rollback nginx-app <revision-id>
清理资源
# 删除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)
最佳实践
- 版本控制: 所有配置都通过Git管理,便于追踪和回滚
- 自动化部署: 修改Git仓库后自动部署,无需手动操作
- 声明式配置: 使用Kubernetes manifests声明期望状态
- 健康检查: 配置liveness和readiness探针确保服务可用
- 资源限制: 设置CPU和内存限制防止资源耗尽
- HTTPS加密: 自动签发SSL证书保护数据传输
- 高可用: 运行2个副本提供冗余
注意事项
- 确保DNS已正确配置,ng.jpc.net3w.com指向K3s集群节点IP
- 首次访问HTTPS可能需要等待证书签发(约1-2分钟)
- ArgoCD默认每3分钟检查一次Git仓库更新
- 可以通过ArgoCD UI手动触发同步以立即部署更改
- 修改配置前建议先备份或创建Git分支