Files
k3s_auto_deploy/NGINX-APP-GUIDE.md

7.9 KiB
Raw Permalink Blame History

Nginx测试应用 - 自动化部署指南

概述

这是一个基于GitOps模式的Nginx测试应用用于演示K3s集群的自动化部署流程。

应用信息

  • 应用名称: nginx-test
  • 域名: ng.jpc.net3w.com
  • 镜像: nginx:1.25-alpine
  • 副本数: 2
  • 部署方式: GitOps (Gitea + ArgoCD)

快速部署

一键部署

./scripts/deploy-nginx-app.sh

这个脚本会自动完成以下步骤:

  1. 检查依赖和集群状态
  2. 在Gitea中创建nginx-app仓库
  3. 推送应用manifests到Git仓库
  4. 在ArgoCD中创建Application
  5. 等待自动同步完成

分步部署

如果需要分步执行,可以运行:

# 步骤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仓库

  1. 克隆仓库:
git clone http://<NODE_IP>:<GITEA_PORT>/k3s-apps/nginx-app.git
cd nginx-app
  1. 修改配置文件:
# 修改版本号
vim manifests/configmap.yaml
# 将 "Version: v1.0" 改为 "Version: v2.0"

# 或修改副本数
vim manifests/deployment.yaml
# 将 replicas: 2 改为 replicas: 3
  1. 提交并推送:
git add .
git commit -m "Update to v2.0"
git push
  1. 等待ArgoCD自动同步约3分钟

方式3: 通过ArgoCD UI手动同步

  1. 访问ArgoCD: https://argocd.jpc.net3w.com
  2. 找到nginx-app应用
  3. 点击"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"

相关链接

技术栈

  • 容器编排: 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分支