Files
k3s_auto_deploy/JPD-CLUSTER-DEPLOYMENT.md

14 KiB
Raw Permalink Blame History

JPD集群K3s自动化部署指南

本文档指导你在新的JPD集群上部署K3s并实现GitOps自动化。

集群信息

节点配置

角色 主机名 公网IP 内网IP 域名
Master k3s-master-01 149.13.91.216 10.198.0.112 *.jpd1.net3w.com
Worker1 k3s-worker-01 149.13.91.64 10.198.0.175 *.jpd2.net3w.com
Worker2 k3s-worker-02 149.13.91.59 10.198.0.111 *.jpd3.net3w.com

服务域名

  • 主域名: *.jpd.net3w.com
  • Gitea: git.jpd.net3w.com
  • ArgoCD: argocd.jpd.net3w.com
  • 测试应用: ng.jpd.net3w.com, test.jpd.net3w.com, demo.jpd.net3w.com

部署前准备

1. 配置DNS解析

在域名服务商控制台添加以下DNS记录

# 泛域名解析(推荐)
*.jpd.net3w.com         A    149.13.91.216
*.jpd1.net3w.com        A    149.13.91.216
*.jpd2.net3w.com        A    149.13.91.64
*.jpd3.net3w.com        A    149.13.91.59

# 或者单独配置服务域名
git.jpd.net3w.com       A    149.13.91.216
argocd.jpd.net3w.com    A    149.13.91.216
ng.jpd.net3w.com        A    149.13.91.216
test.jpd.net3w.com      A    149.13.91.216
demo.jpd.net3w.com      A    149.13.91.216

2. 验证服务器连接

# 测试SSH连接
ssh fei@149.13.91.216  # Master
ssh fei@149.13.91.64   # Worker1
ssh fei@149.13.91.59   # Worker2

# 如果连接成功,退出
exit

3. 检查服务器配置

# 在每个节点上执行
ssh fei@149.13.91.216 "uname -a && free -h && df -h"
ssh fei@149.13.91.64 "uname -a && free -h && df -h"
ssh fei@149.13.91.59 "uname -a && free -h && df -h"

快速部署(推荐)

方式1: 使用一键部署脚本

# 进入项目目录
cd /home/fei/opk3s/k3s自动化部署

# 使用JPD集群配置
cp config/jpd-cluster-vars.yml config/cluster-vars.yml

# 运行一键部署脚本
./scripts/deploy-all.sh

# 脚本会自动完成:
# 1. 生成Ansible inventory
# 2. 部署K3s集群
# 3. 配置kubectl
# 4. 部署Gitea
# 5. 部署ArgoCD
# 6. 配置HTTPS
# 7. 部署测试应用

方式2: 分步部署

如果需要更细粒度的控制,可以分步执行:

cd /home/fei/opk3s/k3s自动化部署

# 1. 使用JPD集群配置
cp config/jpd-cluster-vars.yml config/cluster-vars.yml

# 2. 生成Ansible inventory
python3 scripts/generate-inventory.py

# 3. 部署K3s集群
cd k3s-ansible
ansible-playbook playbooks/site.yml -i inventory.yml

# 4. 配置kubectl在本地机器
cd ..
mkdir -p ~/.kube
scp fei@149.13.91.216:/etc/rancher/k3s/k3s.yaml ~/.kube/config-jpd
sed -i 's/127.0.0.1/149.13.91.216/g' ~/.kube/config-jpd
export KUBECONFIG=~/.kube/config-jpd

# 5. 验证集群
kubectl get nodes -o wide

# 6. 部署Gitea
./scripts/deploy-gitea.sh

# 7. 部署ArgoCD
./scripts/deploy-argocd.sh

# 8. 配置HTTPS
./scripts/deploy-https.sh

# 9. 部署测试应用
./scripts/deploy-test-app.sh
./scripts/deploy-nginx-app.sh

部署步骤详解

步骤1: 准备配置文件

cd /home/fei/opk3s/k3s自动化部署

# 备份原配置(如果需要)
cp config/cluster-vars.yml config/cluster-vars.yml.jpc.bak

# 使用JPD集群配置
cp config/jpd-cluster-vars.yml config/cluster-vars.yml

# 查看配置
cat config/cluster-vars.yml

步骤2: 生成Ansible Inventory

# 生成inventory文件
python3 scripts/generate-inventory.py

# 验证生成的inventory
cat k3s-ansible/inventory.yml

步骤3: 部署K3s集群

cd k3s-ansible

# 部署集群
ansible-playbook playbooks/site.yml -i inventory.yml

# 部署过程约需5-10分钟
# 完成后会看到类似输出:
# PLAY RECAP *********************************************************************
# k3s-master-01              : ok=XX   changed=XX   unreachable=0    failed=0
# k3s-worker-01              : ok=XX   changed=XX   unreachable=0    failed=0
# k3s-worker-02              : ok=XX   changed=XX   unreachable=0    failed=0

步骤4: 配置kubectl

cd /home/fei/opk3s/k3s自动化部署

# 创建kubeconfig目录
mkdir -p ~/.kube

# 从master节点复制kubeconfig
scp fei@149.13.91.216:/etc/rancher/k3s/k3s.yaml ~/.kube/config-jpd

# 修改server地址为master公网IP
sed -i 's/127.0.0.1/149.13.91.216/g' ~/.kube/config-jpd

# 设置KUBECONFIG环境变量
export KUBECONFIG=~/.kube/config-jpd

# 或者永久设置
echo "export KUBECONFIG=~/.kube/config-jpd" >> ~/.bashrc
source ~/.bashrc

# 验证连接
kubectl get nodes -o wide

预期输出:

NAME              STATUS   ROLES                  AGE   VERSION
k3s-master-01     Ready    control-plane,master   5m    v1.28.5+k3s1
k3s-worker-01     Ready    <none>                 4m    v1.28.5+k3s1
k3s-worker-02     Ready    <none>                 4m    v1.28.5+k3s1

步骤5: 部署Gitea

# 运行Gitea部署脚本
./scripts/deploy-gitea.sh

# 等待Gitea Pod就绪约3-5分钟
watch kubectl get pods -n gitea

# 当所有Pod状态为Running时按Ctrl+C退出

# 获取Gitea访问地址
GITEA_PORT=$(kubectl get svc gitea-http -n gitea -o jsonpath='{.spec.ports[0].nodePort}')
echo "Gitea访问地址: http://149.13.91.216:$GITEA_PORT"
echo "Gitea域名访问: http://git.jpd.net3w.com"

步骤6: 部署ArgoCD

# 运行ArgoCD部署脚本
./scripts/deploy-argocd.sh

# 等待ArgoCD Pod就绪约2-3分钟
watch kubectl get pods -n argocd

# 获取ArgoCD admin密码
kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d && echo

# 访问ArgoCD
echo "ArgoCD访问地址: https://argocd.jpd.net3w.com"
echo "用户名: admin"
echo "密码: (上面显示的密码)"

步骤7: 配置HTTPS

# 部署cert-manager和配置HTTPS
./scripts/deploy-https.sh

# 等待证书签发约1-2分钟
watch kubectl get certificate --all-namespaces

# 当所有证书状态为True时按Ctrl+C退出

步骤8: 部署测试应用

# 部署nginx测试应用
./scripts/deploy-nginx-app.sh

# 等待应用就绪
kubectl get pods -l app=nginx-test -n default

# 测试访问
curl http://ng.jpd.net3w.com
curl https://ng.jpd.net3w.com

验证部署

1. 验证集群状态

# 查看节点状态
kubectl get nodes -o wide

# 查看所有Pod
kubectl get pods --all-namespaces

# 查看系统组件
kubectl get pods -n kube-system

# 查看资源使用
kubectl top nodes
kubectl top pods --all-namespaces

2. 验证Gitea

# 获取Gitea NodePort
GITEA_PORT=$(kubectl get svc gitea-http -n gitea -o jsonpath='{.spec.ports[0].nodePort}')
echo "Gitea NodePort: $GITEA_PORT"

# 测试访问
curl -I http://149.13.91.216:$GITEA_PORT
curl -I http://git.jpd.net3w.com

# 浏览器访问
echo "在浏览器中访问: http://git.jpd.net3w.com"
echo "用户名: gitea_admin"
echo "密码: GitAdmin@2026"

3. 验证ArgoCD

# 获取ArgoCD密码
ARGOCD_PASSWORD=$(kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d)

echo "ArgoCD访问地址: https://argocd.jpd.net3w.com"
echo "用户名: admin"
echo "密码: $ARGOCD_PASSWORD"

# 测试访问
curl -k -I https://argocd.jpd.net3w.com

4. 验证应用

# 查看所有Ingress
kubectl get ingress --all-namespaces

# 测试应用访问
curl http://ng.jpd.net3w.com
curl https://ng.jpd.net3w.com

# 查看证书状态
kubectl get certificate --all-namespaces

访问信息汇总

服务访问地址

服务 访问地址 用户名 密码
Gitea http://git.jpd.net3w.com gitea_admin GitAdmin@2026
ArgoCD https://argocd.jpd.net3w.com admin (见下方命令)
Nginx测试应用 http://ng.jpd.net3w.com - -

获取ArgoCD密码

kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d && echo

SSH访问

# Master节点
ssh fei@149.13.91.216

# Worker节点
ssh fei@149.13.91.64
ssh fei@149.13.91.59

部署新应用

使用手动部署指南

参考 MANUAL-DEPLOYMENT-GUIDE.md 创建新应用。

快速示例

# 1. 创建项目目录
mkdir -p ~/my-app/manifests

# 2. 创建Kubernetes manifests
# 参考 MANUAL-DEPLOYMENT-GUIDE.md 中的模板

# 3. 在Gitea中创建仓库
# 访问 http://git.jpd.net3w.com

# 4. 推送代码
cd ~/my-app
git init -b main
git add .
git commit -m "Initial commit"
git remote add origin http://gitea_admin:GitAdmin%402026@149.13.91.216:<GITEA_PORT>/k3s-apps/my-app.git
git push -u origin main

# 5. 在ArgoCD中创建Application
# 访问 https://argocd.jpd.net3w.com

常见问题

Q1: DNS解析不生效怎么办

A: DNS传播需要时间5-30分钟。可以先使用NodePort访问

# 获取服务NodePort
kubectl get svc -n gitea
kubectl get svc -n argocd

# 通过IP:Port访问
http://149.13.91.216:<NodePort>

Q2: Pod一直处于Pending状态

A: 检查节点资源和Pod事件

# 查看节点资源
kubectl top nodes

# 查看Pod详情
kubectl describe pod <pod-name> -n <namespace>

# 查看事件
kubectl get events -n <namespace> --sort-by='.lastTimestamp'

Q3: 证书未签发?

A: 检查cert-manager和DNS配置

# 查看cert-manager日志
kubectl logs -n cert-manager -l app=cert-manager --tail=50

# 查看证书请求
kubectl get certificaterequest --all-namespaces

# 查看证书详情
kubectl describe certificate <cert-name> -n <namespace>

Q4: 如何切换回JPC集群

A: 切换kubeconfig

# 切换到JPC集群
export KUBECONFIG=~/.kube/config

# 或者切换到JPD集群
export KUBECONFIG=~/.kube/config-jpd

# 验证当前集群
kubectl cluster-info
kubectl get nodes

Q5: 如何同时管理多个集群?

A: 使用kubectl context

# 合并kubeconfig
KUBECONFIG=~/.kube/config:~/.kube/config-jpd kubectl config view --flatten > ~/.kube/config-merged
cp ~/.kube/config-merged ~/.kube/config

# 查看所有context
kubectl config get-contexts

# 切换context
kubectl config use-context <context-name>

# 查看当前context
kubectl config current-context

故障排查

1. 集群部署失败

# 查看Ansible日志
cat k3s-ansible/ansible.log

# 检查节点连接
ansible all -i k3s-ansible/inventory.yml -m ping

# 重新部署
cd k3s-ansible
ansible-playbook playbooks/reset.yml -i inventory.yml  # 清理
ansible-playbook playbooks/site.yml -i inventory.yml   # 重新部署

2. kubectl连接失败

# 检查kubeconfig
cat ~/.kube/config-jpd

# 检查master节点K3s服务
ssh fei@149.13.91.216 "sudo systemctl status k3s"

# 检查防火墙
ssh fei@149.13.91.216 "sudo ufw status"

# 测试API连接
curl -k https://149.13.91.216:6443

3. Pod无法启动

# 查看Pod状态
kubectl get pods --all-namespaces -o wide

# 查看Pod日志
kubectl logs <pod-name> -n <namespace>

# 查看Pod事件
kubectl describe pod <pod-name> -n <namespace>

# 查看节点事件
kubectl get events --all-namespaces --sort-by='.lastTimestamp'

4. 服务无法访问

# 查看Service
kubectl get svc --all-namespaces

# 查看Ingress
kubectl get ingress --all-namespaces

# 查看Ingress详情
kubectl describe ingress <ingress-name> -n <namespace>

# 测试Service内部访问
kubectl run test-pod --rm -it --image=curlimages/curl -- \
  curl http://<service-name>.<namespace>.svc.cluster.local

备份和恢复

备份集群

# 备份etcd
ssh fei@149.13.91.216 "sudo k3s etcd-snapshot save --name jpd-backup"

# 下载备份
scp fei@149.13.91.216:/var/lib/rancher/k3s/server/db/snapshots/jpd-backup* ./backups/

# 备份Kubernetes资源
kubectl get all --all-namespaces -o yaml > backups/jpd-all-resources.yaml

恢复集群

参考 CLUSTER-MIGRATION-GUIDE.md 中的恢复步骤。


性能优化

1. 调整资源限制

# 编辑Deployment
kubectl edit deployment <deployment-name> -n <namespace>

# 修改resources部分
resources:
  requests:
    memory: "128Mi"
    cpu: "100m"
  limits:
    memory: "256Mi"
    cpu: "200m"

2. 配置HPA水平自动扩缩容

# 创建HPA
kubectl autoscale deployment <deployment-name> \
  --cpu-percent=80 \
  --min=2 \
  --max=10 \
  -n <namespace>

# 查看HPA状态
kubectl get hpa -n <namespace>

3. 配置节点亲和性

# 在Deployment中添加
spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - k3s-worker-01

监控和日志

1. 查看资源使用

# 节点资源
kubectl top nodes

# Pod资源
kubectl top pods --all-namespaces

# 持续监控
watch kubectl top pods --all-namespaces

2. 查看日志

# 查看Pod日志
kubectl logs <pod-name> -n <namespace>

# 实时查看日志
kubectl logs -f <pod-name> -n <namespace>

# 查看多个Pod日志
kubectl logs -l app=<app-name> -n <namespace> --tail=50

3. 部署监控系统(可选)

# 部署Prometheus和Grafana
# 参考官方文档或使用Helm安装

下一步

  1. 集群已部署完成
  2. Gitea和ArgoCD已配置
  3. HTTPS已启用
  4. 测试应用已部署

现在你可以:

  • 📝 参考 MANUAL-DEPLOYMENT-GUIDE.md 部署新应用
  • 🔄 使用GitOps工作流管理应用
  • 📊 配置监控和告警
  • 🔐 配置备份策略

相关文档


部署完成时间: 预计30-60分钟 文档版本: 1.0 最后更新: 2026-02-04