扩展后与 apache 的连接出现问题,我在 Kubernetes 上的有状态数据库
Problem with connection to apache after scaling up, my stateful database on Kubernetes
嗨!!!
我已经部署到 Kubernetes keyrock、apache 和 mysql..
在我使用 hpa 和我的有状态数据库扩展后,我无法登录到我的简单站点..
这是我的 sql 代码:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: mysql
replicas: 1
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7.21
imagePullPolicy: Always
resources:
requests:
memory: 50Mi #50
cpu: 50m
limits:
memory: 500Mi #220?
cpu: 400m #65
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
subPath: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret # MARK P
key: password
- name: MYSQL_ROOT_HOST
valueFrom:
secretKeyRef:
name: mysql-secret # MARK P
key: host
volumeClaimTemplates:
- metadata:
name: mysql-storage
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard #?manual
resources:
requests:
storage: 5Gi
而且是无头服务:
# Headless service for stable DNS entries of StatefulSet members.
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql #x-app #
spec:
ports:
- name: mysql
port: 3306
clusterIP: None
selector:
app: mysql #x-app
谁能帮帮我?
我正在使用 gke..Keyrock 和 apache 是部署,mysql 是 statefulset..
谢谢!!
您不能只扩展独立数据库。将 HPA 用于无状态应用程序有效,但不适用于数据库等有状态应用程序。
增加 StaetefulSet 的副本只会创建另一个带有新 MySQL 实例的 pod。这个新副本不知道旧副本中的数据。基本上,您现在拥有完全不同的两个数据库。这就是为什么您在放大后无法登录的原因。当您的请求被路由到新副本时,此实例没有您在旧副本中创建的用户信息。
在这种情况下,您应该以集群模式部署数据库。然后,您可以利用水平缩放。
我建议使用像 mysql/mysql-operator, presslabs/mysql-operator, or KubeDB 这样的数据库操作员来管理 Kubernetes 中的数据库。在这些运算符中,KubeDB 具有自动缩放功能。我不确定其他运营商是否提供此功能。
披露:我是 KubeDB 算子的开发者之一。
嗨!!!
我已经部署到 Kubernetes keyrock、apache 和 mysql..
在我使用 hpa 和我的有状态数据库扩展后,我无法登录到我的简单站点.. 这是我的 sql 代码:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: mysql
replicas: 1
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7.21
imagePullPolicy: Always
resources:
requests:
memory: 50Mi #50
cpu: 50m
limits:
memory: 500Mi #220?
cpu: 400m #65
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
subPath: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret # MARK P
key: password
- name: MYSQL_ROOT_HOST
valueFrom:
secretKeyRef:
name: mysql-secret # MARK P
key: host
volumeClaimTemplates:
- metadata:
name: mysql-storage
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard #?manual
resources:
requests:
storage: 5Gi
而且是无头服务:
# Headless service for stable DNS entries of StatefulSet members.
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql #x-app #
spec:
ports:
- name: mysql
port: 3306
clusterIP: None
selector:
app: mysql #x-app
谁能帮帮我?
我正在使用 gke..Keyrock 和 apache 是部署,mysql 是 statefulset..
谢谢!!
您不能只扩展独立数据库。将 HPA 用于无状态应用程序有效,但不适用于数据库等有状态应用程序。
增加 StaetefulSet 的副本只会创建另一个带有新 MySQL 实例的 pod。这个新副本不知道旧副本中的数据。基本上,您现在拥有完全不同的两个数据库。这就是为什么您在放大后无法登录的原因。当您的请求被路由到新副本时,此实例没有您在旧副本中创建的用户信息。
在这种情况下,您应该以集群模式部署数据库。然后,您可以利用水平缩放。
我建议使用像 mysql/mysql-operator, presslabs/mysql-operator, or KubeDB 这样的数据库操作员来管理 Kubernetes 中的数据库。在这些运算符中,KubeDB 具有自动缩放功能。我不确定其他运营商是否提供此功能。
披露:我是 KubeDB 算子的开发者之一。