首页 > 解决方案 > 扩展后连接到 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 是 statefulset ..

谢谢!!

标签: mysqlkuberneteskubernetes-statefulsethpa

解决方案


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

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

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

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

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


推荐阅读