Kubernetes 重新创建 Pod 时出现负载均衡器错误

49次阅读
没有评论

问题描述

在创建一个 Nextcloud POC 的 k8s 集群时,第一次部署时一切都很正常。应用程序在 localhost:8080 上配置并正常工作。但是,当用户尝试模拟一个 Pod 丢失后的重新创建时,应用程序不再工作。在查看负载均衡器的日志时,用户发现了以下错误:

[error] 50#50: *219 connect() failed (111: Connection refused) while connecting to upstream, client: 172.23.0.1, server: 0.0.0.0:30000, upstream: "172.23.0.3:30000", bytes from/to client:0/0, bytes from/to upstream:0/0
Inaccessible by localhost:8080 - This page isn’t working localhost didn’t send any data.

用户提供了他使用的 yaml 文件和部署过程。

k3d cluster create nextcloud -p "8080:30000@loadbalancer"

持久卷:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-mysql
  labels:
    type: local
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /meubanco/
  storageClassName: pv-mysql
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nextcloud-config
  labels:
    type: local
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /config/
  storageClassName: pv-nextcloud-config
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nextcloud-config
  labels:
    type: local
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /config/
  storageClassName: pv-nextcloud-config

如果需要,我会更新相应的声明。
部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        resources: {}
        ports:
        - containerPort: 3306
          name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "931814"
        - name: MYSQL_DATABASE
          value: "nextcloud"
        - name: MYSQL_USER
          value: "nextcloud"
        - name: MYSQL_PASSWORD
          value: "nc123456"
        volumeMounts:
        - name: pv-mysql
          mountPath: /var/lib/mysql
      volumes:
      - name: pv-mysql
        persistentVolumeClaim:
          claimName: pvc-mysql
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
    type: ClusterIP
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextcloud
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nextcloud
  template:
    metadata:
      labels:
        app: nextcloud
    spec:
      containers:
      - name: nextcloud
        image: nextcloud:23.0.12-apache
        resources: {}
        ports:
        - containerPort: 80
        env:
        - name: MYSQL_DATABASE
          value: "nextcloud"
        - name: MYSQL_USER
          value: "nextcloud"
        - name: MYSQL_PASSWORD
          value: "nc123456"
        - name: MYSQL_HOST
          value: "mysql"
        - name: NEXTCLOUD_ADMIN_USER
          value: "joaopblume"
        - name: NEXTCLOUD_ADMIN_PASSWORD
          value: "123456789j"
        volumeMounts:
        - name: pv-nextcloud-data
          mountPath: /var/www/html/data
        - name: pv-nextcloud-config
          mountPath: /var/www/html/config
      volumes:
      - name: pv-nextcloud-data
        persistentVolumeClaim:
          claimName: pvc-nextcloud-data
      - name: pv-nextcloud-config
        persistentVolumeClaim:
          claimName: pvc-nextcloud-config

服务:

apiVersion: v1
kind: Service
metadata:
  name: load-balancer
spec:
  selector:
    app: nextcloud
  ports:
  - port: 8080
    targetPort: 80
    nodePort: 30000
  type: LoadBalancer

用户没有进行其他配置。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户提供的信息,负载均衡器出现错误是因为在重新创建 Pod 后,负载均衡器无法连接到上游服务。这可能是由于 Pod 的 IP 地址发生了变化,但负载均衡器仍然尝试连接到旧的 IP 地址导致的。
为了解决这个问题,可以尝试以下步骤:
1. 删除负载均衡器服务:

kubectl delete service load-balancer
  1. 删除 Nextcloud 部署:
kubectl delete deployment nextcloud
  1. 等待一段时间,确保所有相关的资源都被删除。
  2. 重新部署 Nextcloud:
kubectl apply -f deployment-nextcloud.yaml
  1. 重新创建负载均衡器服务:
kubectl apply -f load-balancer.yaml

这样,负载均衡器将会重新连接到新创建的 Pod,并且应用程序应该能够正常工作。

方案2

使用脚本或工具来管理负载均衡器的配置可能会增加复杂性,并且需要确保负载均衡器与 Pod 之间的依赖关系正确设置。
另一种方法是使用脚本或工具来控制负载均衡器的配置。你可以使用 kubectl 命令手动删除和重新创建负载均衡器服务,或者使用一些第三方工具来管理负载均衡器的依赖关系。
以下是一个简单的 bash 脚本示例,可以在重新创建 Pod 后删除和重新创建负载均衡器服务:

#!/bin/bash
# 删除负载均衡器服务
kubectl delete service load-balancer
# 删除 Nextcloud 部署
kubectl delete deployment nextcloud
# 等待一段时间,确保所有相关的资源都被删除
sleep 10
# 重新部署 Nextcloud
kubectl apply -f deployment-nextcloud.yaml
# 重新创建负载均衡器服务
kubectl apply -f load-balancer.yaml

在这个示例中,我们首先使用 kubectl delete 命令删除负载均衡器服务和 Nextcloud 部署。然后,等待一段时间,确保所有相关的资源都被删除。接下来,使用 kubectl apply 命令重新部署 Nextcloud 和创建负载均衡器服务。
请注意,这只是一个示例脚本,你可能需要根据你的实际情况进行修改和调整。

总结

在重新创建 Pod 后出现负载均衡器错误的情况下,可以尝试删除和重新创建负载均衡器服务,或者使用脚本或工具来管理负载均衡器的配置。这样可以确保负载均衡器能够正确连接到新创建的 Pod,并且应用程序能够正常工作。

正文完