本文档介绍如何在Kubernetes集群中从零开始部署文件转PDF服务。
- Linux服务器(推荐Ubuntu 18.04+或CentOS 7+)
- Docker已安装
- 至少2GB内存和2CPU核心
- 网络连接正常
# 安装K3s(使用国内镜像源)
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
# 等待安装完成,检查状态
sudo systemctl status k3s
# 配置kubectl
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
chmod 600 ~/.kube/config
# 验证集群状态
kubectl get nodes# 方法1:从华为云拉取预构建镜像(推荐)
docker pull swr.cn-north-4.myhuaweicloud.com/wyyy/convert2pdf_server:0.4.0
# 方法2:本地构建(如果需要自定义)
# docker build -t convert2pdf_server:0.4.0 .
# 导入镜像到K3s
docker save swr.cn-north-4.myhuaweicloud.com/wyyy/convert2pdf_server:0.4.0 > convert2pdf.tar
sudo k3s ctr images import convert2pdf.tar
# 验证镜像导入
sudo k3s ctr images ls | grep convert2pdf# 创建持久化存储目录
sudo mkdir -p /data/V2/k8s/volumes/convert-file2pdf-logs
sudo chmod 755 /data/V2/k8s/volumes/convert-file2pdf-logs
# 确保目录权限正确
sudo chown -R 1000:1000 /data/V2/k8s/volumes/convert-file2pdf-logs在部署前,检查并修改 k8s-deployment.yaml 中的配置:
# 检查当前配置
cat k8s-deployment.yaml | grep -A 5 -B 5 "S3_ENDPOINT_URL\|DOWNLOAD_URL_PREFIX\|path:"需要修改的关键配置:
S3_ENDPOINT_URL: MinIO服务地址DOWNLOAD_URL_PREFIX: 外部访问地址path: 持久化存储路径(确保与步骤3创建的目录一致)
# 首次部署时,建议分步骤执行以便排查问题
# 步骤1: 创建ConfigMap和Secret
kubectl apply -f k8s-deployment.yaml --dry-run=client -o yaml | grep -A 20 "kind: ConfigMap" | kubectl apply -f -
kubectl apply -f k8s-deployment.yaml --dry-run=client -o yaml | grep -A 20 "kind: Secret" | kubectl apply -f -
# 步骤2: 创建PersistentVolume和PVC
kubectl apply -f k8s-deployment.yaml --dry-run=client -o yaml | grep -A 30 "kind: PersistentVolume" | kubectl apply -f -
kubectl apply -f k8s-deployment.yaml --dry-run=client -o yaml | grep -A 15 "kind: PersistentVolumeClaim" | kubectl apply -f -
# 步骤3: 创建Service
kubectl apply -f k8s-deployment.yaml --dry-run=client -o yaml | grep -A 15 "kind: Service" | kubectl apply -f -
# 步骤4: 创建Deployment
kubectl apply -f k8s-deployment.yaml --dry-run=client -o yaml | grep -A 50 "kind: Deployment" | kubectl apply -f -
# 步骤5: 创建Ingress(可选)
kubectl apply -f k8s-deployment.yaml --dry-run=client -o yaml | grep -A 20 "kind: Ingress" | kubectl apply -f -# 确保目录存在且权限正确
sudo mkdir -p /data/V2/k8s/volumes/convert-file2pdf-logs
sudo chown -R 1000:1000 /data/V2/k8s/volumes/convert-file2pdf-logs
# 一键部署所有资源
kubectl apply -f k8s-deployment.yaml问题描述: 部署时出现 "spec.persistentvolumesource is immutable after creation" 错误
解决方案:
# 删除现有的PersistentVolume
kubectl delete pv convert-file2pdf-logs-pv
# 确保新路径目录存在
sudo mkdir -p /data/V2/k8s/volumes/convert-file2pdf-logs
sudo chown -R 1000:1000 /data/V2/k8s/volumes/convert-file2pdf-logs
# 重新应用配置
kubectl apply -f k8s-deployment.yaml问题描述: Pod状态显示 ImagePullBackOff
解决方案:
# 检查镜像是否存在
sudo k3s ctr images ls | grep convert2pdf
# 如果不存在,重新导入
docker save swr.cn-north-4.myhuaweicloud.com/wyyy/convert2pdf_server:0.4.0 > convert2pdf.tar
sudo k3s ctr images import convert2pdf.tar问题描述: Pod状态为 CrashLoopBackOff 或 Error
排查步骤:
# 查看Pod详细信息
kubectl describe pod <pod-name>
# 查看Pod日志
kubectl logs <pod-name>
# 查看事件
kubectl get events --sort-by=.metadata.creationTimestamp# 检查所有资源状态
kubectl get all -l app=convert-file2pdf
# 检查Pod状态(应该显示Running)
kubectl get pods -l app=convert-file2pdf
# 检查服务状态
kubectl get svc convert-file2pdf-service
# 检查PVC状态
kubectl get pvc convert-file2pdf-logs-pvc# 获取服务的NodePort
kubectl get svc convert-file2pdf-service
# 测试健康检查接口(替换<node-ip>和<node-port>)
curl http://<node-ip>:<node-port>/health# 测试文件上传转换(需要准备测试文件)
curl -X POST -F "file=@test.docx" http://<node-ip>:<node-port>/convert# 手动扩容到10个副本
kubectl scale deployment convert-file2pdf-deployment --replicas=10
# 查看当前副本数
kubectl get deployment convert-file2pdf-deployment
# 应用HPA自动扩缩容(可选)
kubectl apply -f k8s-hpa.yaml
kubectl get hpa convert-file2pdf-hpa# 方法1:使用kubectl set image
kubectl set image deployment/convert-file2pdf-deployment \
convert-file2pdf=swr.cn-north-4.myhuaweicloud.com/wyyy/convert2pdf_server:0.5.0
# 方法2:修改YAML文件后重新应用
# 编辑 k8s-deployment.yaml 中的镜像版本,然后:
kubectl apply -f k8s-deployment.yaml
# 查看滚动更新状态
kubectl rollout status deployment/convert-file2pdf-deployment
# 查看更新历史
kubectl rollout history deployment/convert-file2pdf-deployment# 回滚到上一个版本
kubectl rollout undo deployment/convert-file2pdf-deployment
# 回滚到指定版本
kubectl rollout undo deployment/convert-file2pdf-deployment --to-revision=2# 查看所有Pod日志
kubectl logs -l app=convert-file2pdf --tail=100
# 实时查看日志
kubectl logs -f deployment/convert-file2pdf-deployment
# 查看特定Pod日志
kubectl logs <pod-name> -c convert-file2pdf# 查看Pod资源使用情况
kubectl top pods -l app=convert-file2pdf
# 查看节点资源使用情况
kubectl top nodes
# 查看详细资源信息
kubectl describe deployment convert-file2pdf-deployment# 创建新的Secret(生产环境推荐)
kubectl create secret generic convert-file2pdf-secret \
--from-literal=S3_ACCESS_KEY_ID=your_access_key \
--from-literal=S3_SECRET_ACCESS_KEY=your_secret_key
# 更新现有Secret
kubectl patch secret convert-file2pdf-secret -p='{"data":{"S3_ACCESS_KEY_ID":"'$(echo -n "new_access_key" | base64)'"}}'
# 查看Secret内容(base64解码)
kubectl get secret convert-file2pdf-secret -o jsonpath='{.data.S3_ACCESS_KEY_ID}' | base64 -d服务已配置为NodePort类型,可以通过节点IP直接访问:
# 获取NodePort端口
kubectl get svc convert-file2pdf-service
# 获取节点IP
kubectl get nodes -o wide
# 访问服务(替换为实际的节点IP和端口)
curl http://<节点IP>:<NodePort>/health- CPU: 每个Pod建议配置1-2核CPU
- 内存: 每个Pod建议配置1-2GB内存
- 副本数: 根据并发需求调整,建议8-16个副本
# 定期清理日志文件
kubectl exec -it <pod-name> -- find /app/logs -name "*.log" -mtime +7 -delete
# 监控存储使用情况
kubectl exec -it <pod-name> -- df -h /app/logs- 使用NodePort或LoadBalancer提供外部访问
- 配置Ingress实现域名访问和SSL终止
- 考虑使用CDN加速文件下载
# 一键检查脚本
cat << 'EOF' > check-deployment.sh
#!/bin/bash
echo "=== 检查Pod状态 ==="
kubectl get pods -l app=convert-file2pdf
echo -e "\n=== 检查服务状态 ==="
kubectl get svc convert-file2pdf-service
echo -e "\n=== 检查PVC状态 ==="
kubectl get pvc convert-file2pdf-logs-pvc
echo -e "\n=== 检查最近事件 ==="
kubectl get events --sort-by=.metadata.creationTimestamp | tail -10
echo -e "\n=== 检查资源使用 ==="
kubectl top pods -l app=convert-file2pdf 2>/dev/null || echo "Metrics server not available"
EOF
chmod +x check-deployment.sh
./check-deployment.sh如果遇到无法解决的问题,可以完全重新部署:
# 删除所有相关资源
kubectl delete -f k8s-deployment.yaml
# 等待资源完全删除
kubectl get pods -l app=convert-file2pdf
# 确保目录和权限正确
sudo mkdir -p /data/V2/k8s/volumes/convert-file2pdf-logs
sudo chown -R 1000:1000 /data/V2/k8s/volumes/convert-file2pdf-logs
# 重新部署
kubectl apply -f k8s-deployment.yaml按照本指南的步骤,你应该能够:
- ✅ 从零开始搭建K3s集群
- ✅ 正确配置和部署convert-file2pdf服务
- ✅ 处理常见的部署问题(如PV路径冲突)
- ✅ 进行基本的运维管理操作
- ✅ 监控和排查服务问题
如果在部署过程中遇到问题,请按照"常见问题处理"部分的步骤进行排查。