Files
k3s_auto_deploy/NGINX-APP-GUIDE.md

362 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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分支