问题描述
嗨!!!
我已经部署到 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 是有状态的..
谢谢!!
解决方法
您不能仅仅扩展独立数据库。将 HPA 用于无状态应用程序有效,但不适用于数据库等有状态应用程序。
增加 StaetefulSet 的副本只会创建另一个带有新 MySQL 实例的 pod。这个新副本不知道旧副本中的数据。基本上,您现在拥有完全不同的两个数据库。这就是为什么您在扩展后无法登录的原因。当您的请求被路由到新副本时,此实例没有您在旧副本中创建的用户信息。
在这种情况下,您应该以集群模式部署数据库。然后,您可以利用水平缩放。
我建议使用 mysql/mysql-operator、presslabs/mysql-operator 或 KubeDB 等数据库运算符来管理 Kubernetes 中的数据库。在这些算子中,KubeDB 具有自动缩放功能。我不确定其他运营商是否提供此功能。
披露:我是 KubeDB 算子的开发者之一。