问题描述
在创建一个 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
- 删除 Nextcloud 部署:
kubectl delete deployment nextcloud
- 等待一段时间,确保所有相关的资源都被删除。
- 重新部署 Nextcloud:
kubectl apply -f deployment-nextcloud.yaml
- 重新创建负载均衡器服务:
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,并且应用程序能够正常工作。