Files
k3s_auto_deploy/TROUBLESHOOTING-ACCESS.md

6.6 KiB
Raw Blame History

🔥 紧急修复:无法访问服务的问题

问题诊断

服务状态正常:

argocd-server    NodePort   80:31875/TCP,443:31064/TCP
gitea-http       NodePort   3000:32158/TCP
demo-nginx       NodePort   80:30080/TCP
test-app         NodePort   80:30081/TCP

问题原因阿里云ECS安全组未开放NodePort端口

从本地无法访问这些端口但从master节点内部可以访问说明是云服务器安全组阻止了外部访问。

🔧 解决方案

方案1: 配置阿里云安全组(推荐)

步骤1: 登录阿里云控制台

  1. 访问 https://ecs.console.aliyun.com/
  2. 登录你的阿里云账号

步骤2: 找到安全组

  1. 左侧菜单选择 网络与安全安全组
  2. 找到你的ECS实例所在的安全组

步骤3: 添加入方向规则

点击 配置规则入方向手动添加,添加以下规则:

端口范围 授权对象 描述
30080/30080 0.0.0.0/0 Demo App
30081/30081 0.0.0.0/0 Test App
31875/31875 0.0.0.0/0 ArgoCD HTTP
31064/31064 0.0.0.0/0 ArgoCD HTTPS
32158/32158 0.0.0.0/0 Gitea HTTP
30625/30625 0.0.0.0/0 Gitea SSH

或者一次性开放NodePort范围

端口范围 授权对象 描述
30000/32767 0.0.0.0/0 K3s NodePort范围

注意: 如果只想允许特定IP访问0.0.0.0/0 改为你的公网IP。

步骤4: 保存并等待生效

保存规则后等待1-2分钟生效。

方案2: 使用Traefik Ingress推荐用于生产

Traefik已经部署并监听在80和443端口我们可以通过Ingress访问服务。

2.1 配置ArgoCD Ingress

ssh fei@8.216.38.248
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server
  namespace: argocd
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
    traefik.ingress.kubernetes.io/router.tls: "false"
spec:
  rules:
  - host: argocd.jpc.net3w.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              number: 80
EOF

2.2 配置Gitea Ingress

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gitea
  namespace: gitea
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: git.jpc.net3w.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: gitea-http
            port:
              number: 3000
EOF

2.3 配置Demo App Ingress

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metad name: demo-app
  namespace: default
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: demo.jpc.net3w.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: demo-nginx
            port:
              number: 80
EOF

2.4 配置DNS或hosts文件

选项A: 配置DNS生产环境 在DNS管理面板添加A记录

argocd.jpc.net3w.com  → 8.216.38.248
git.jpc.net3w.com     → 8.216.38.248
demo.jpc.net3w.com    → 8.216.38.248
test.jpc.net3w.com    → 8.216.38.248

选项B: 配置本地hosts文件测试

Linux/Mac:

sudo tee -a /etc/hosts <<EOF
8.216.38.248 argocd.jpc.net3w.com
8.216.38.248 git.jpc.net3w.com
8.216.38.248 demo.jpc.net3w.com
8.216.38.248 test.jpc.net3w.com
EOF

Windows (管理员权限):

编辑 C:\Windows\System32\drivers\etc\hosts
添加:
8.216.38.248 argocd.jpc.net3w.com
8.216.38.248 git.jpc.net3w.com
8.216.38.248 demo.jpc.net3w.com
8.216.38.248 test.jpc.net3w.com

然后访问:

方案3: 使用SSH端口转发临时测试

如果暂时无法修改安全组可以使用SSH端口转发

# 转发Arsh -L 8080:localhost:31875 fei@8.216.38.248 -N &

# 转发Gitea
ssh -L 8081:localhost:32158 fei@8.216.38.248 -N &

# 转发Demo App
ssh -L 8082:localhost:30080 fei@8.216.38.248 -N &

# 转发Test App
ssh -L 8083:localhost:30081 fei@8.216.38.248 -N &

然后在本地浏览器访问:

🎯 推荐方案

短期(立即可用)

  1. 使用SSH端口转发方案3- 立即可用,无需等待
  2. 配置阿里云安全组方案1- 开放NodePort端口

长期(生产环境)

  1. 使用Traefik Ingress方案2- 只需开放80/443端口
  2. 配置HTTPS证书 - 使用cert-manager + Let's Encrypt
  3. 配置DNS解析 - 使用域名访问

📊 验证访问

验证NodePort访问需要开放安全组

# 从本地测试
curl http://8.216.38.248:30080  # Demo App
curl http://8.216.38.248:30081  # Test App
curl http://8.216.38.248:32158  # Gitea
curl -k https://8.216.38.248:31875  # ArgoCD

验证Ingress访问需要配置DNS或hosts

curl http://demo.jpc.net3w.com
curl http://test.jpc.net3w.com
curl http://git.jpc.net3w.com
curl http://argocd.jpc.net3w.com

从master节点内部测试已验证可用

ssh fei@8.216.38.248
curl http://localhost:30080  # Demo App ✅
curl http://localhost:30081  # Test App ✅
curl http://localhost:32158  # Gitea ✅
curl -k https://localhost:31875  # ArgoCD ✅

🔍 故障排查

1. 检查服务状态

kubectl get svc -A | grep NodePort
kubectl get ingress -A

2. 检查Pod状态

kubectl get pods -A
kubectl logs -n argocd deployment/argocd-server
kubectl logs -n gitea -l app.kubernetes.io/name=gitea

3. 检查Traefik

kubectl get pods -n kube-system -l app.kubernetes.io/name=traefik
kubectl logs -n kube-system -l app.kubernetes.io/name=traefik

4. 测试端口连通性

# 从本地测试
nc -zv 8.216.38.248 80
nc -zv 8.216.38.248 443
nc -zv 8.216.38.248 30080
nc -zv 8.216.38.248 31875

📝 总结

当前状态:

  • K3s集群运行正常
  • 所有服务部署成功
  • 从master节点内部可以访问
  • 从外部无法访问(安全组未开放)

立即可用的解决方案:

  1. 使用SSH端口转发方案3- 无需等待
  2. 配置阿里云安全组方案1- 需要1-2分钟生效

生产环境推荐:

  1. 使用Traefik Ingress方案2
  2. 只开放80/443端口
  3. 配置HTTPS证书
  4. 使用域名访问