362 lines
7.9 KiB
Markdown
362 lines
7.9 KiB
Markdown
# 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分支
|