扩展后连接到 apache 的问题,我在 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 是有状态的..

谢谢!!

解决方法

您不能仅仅扩展独立数据库。将 HPA 用于无状态应用程序有效,但不适用于数据库等有状态应用程序。

增加 StaetefulSet 的副本只会创建另一个带有新 MySQL 实例的 pod。这个新副本不知道旧副本中的数据。基本上,您现在拥有完全不同的两个数据库。这就是为什么您在扩展后无法登录的原因。当您的请求被路由到新副本时,此实例没有您在旧副本中创建的用户信息。

在这种情况下,您应该以集群模式部署数据库。然后,您可以利用水平缩放。

我建议使用 mysql/mysql-operatorpresslabs/mysql-operatorKubeDB 等数据库运算符来管理 Kubernetes 中的数据库。在这些算子中,KubeDB 具有自动缩放功能。我不确定其他运营商是否提供此功能。

披露:我是 KubeDB 算子的开发者之一。