Kubernetes + MySQL:在Kubernetes容器中创建自定义数据库和用户

4

我正在尝试使用Google容器引擎和Kubernetes创建一个Django + MySQL应用程序。遵循官方MySQL docker镜像的文档和Kubernetes文档来创建MySQL容器,我创建了以下复制控制器

apiVersion: v1
kind: ReplicationController
metadata:
  labels:
    name: mysql
  name: mysql
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
      - image: mysql:5.6.33
        name: mysql
        env:
          #Root password is compulsory
        - name: "MYSQL_ROOT_PASSWORD"
          value: "root_password"
        - name: "MYSQL_DATABASE"
          value: "custom_db"
        - name: "MYSQL_USER"
          value: "custom_user"
        - name: "MYSQL_PASSWORD"
          value: "custom_password"
        ports:
        - name: mysql
          containerPort: 3306
        volumeMounts:
          # This name must match the volumes.name below.
          - name: mysql-persistent-storage
            mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          gcePersistentDisk:
            # This disk must already exist.
            pdName: mysql-disk
            fsType: ext4

根据文档,传递环境变量MYSQL_DATABASE. MYSQL_USER, MYSQL_PASSWORD,将创建一个新用户并分配权限到新创建的数据库。但实际上并未发生这种情况。当我通过SSH进入容器时,ROOT密码已设置。但是既没有创建用户也没有创建数据库。
我已经进行了本地测试,并传递了相同的环境变量,如下所示:
docker run -d --name some-mysql \
    -e MYSQL_USER="custom_user" \
    -e MYSQL_DATABASE="custom_db" \
    -e MYSQL_ROOT_PASSWORD="root_password" \
    -e MYSQL_PASSWORD="custom_password" \
    mysql

当我SSH进入该容器时,数据库和用户被创建,一切正常。

我不确定我做错了什么。有人能指出我的错误吗?我已经在这里忙了一整天。

编辑:2016年9月20日

如要求 @Julien Du Bois 磁盘已创建。它出现在云控制台中,当我运行描述命令时,我得到以下输出

Command : gcloud compute disks describe mysql-disk

Result: 
creationTimestamp: '2016-09-16T01:06:23.380-07:00'
id: '4673615691045542160'
kind: compute#disk
lastAttachTimestamp: '2016-09-19T06:11:23.297-07:00'
lastDetachTimestamp: '2016-09-19T05:48:14.320-07:00'
name: mysql-disk
selfLink: https://www.googleapis.com/compute/v1/projects/<details-withheld-by-me>/disks/mysql-disk
sizeGb: '20'
status: READY
type: https://www.googleapis.com/compute/v1/projects/<details-withheld-by-me>/diskTypes/pd-standard
users:
- https://www.googleapis.com/compute/v1/projects/<details-withheld-by-me>/instances/gke-cluster-1-default-pool-e0f09576-zvh5
zone: https://www.googleapis.com/compute/v1/projects/<details-withheld-by-me>

我参考了许多教程和 Google Cloud 的示例。在本地运行 mysql docker 容器时,我主要参考了 Docker Hub 上的官方镜像页面 https://hub.docker.com/_/mysql/
这对我来说是有效的,容器在本地创建了一个新的数据库和具有正确权限的用户。
对于 Kubernetes,我的主要参考资料是以下内容:https://cloud.google.com/container-engine/docs/tutorials/persistent-disk/
我只是尝试使用 Django 容器连接到它。

你的磁盘是在GCE上创建的吗?能展示一下日志输出吗? - Dubs
你能提供一下你所参考的文档链接吗? - Anirudh Ramanathan
@JulienDuBois 和 Anirudh Ramanathan。我已按要求编辑了问题并提供了更多细节。如果需要其他信息,请告诉我。目前,我已经通过SSH登录到容器中,并创建了所需的用户和数据库以继续开发。但是,我仍然需要一种方法来自动化此过程,以便在我想要部署到生产环境时使用。 - Cognoscis
你能让它运行起来吗?我也遇到了同样的问题。 - Suraj N
2个回答

2
我曾经在使用卷并将它们挂载到mysql pod时遇到了同样的问题。如mysql的docker镜像文档中所述:
“当您开始mysql镜像时,您可以通过在docker run命令行上传递一个或多个环境变量来调整MySQL实例的配置。请注意,如果您使用已经包含数据库的数据目录启动容器,则以下任何变量都不会产生任何效果:容器启动时始终保留任何现有的数据库。”
因此,在经过一番努力之后,我设法通过将我创建的卷的hostPath从“/data/mysql-pv-volume”更改为“/var/lib/mysql”来解决这个问题。
下面是可能有帮助的代码片段,可用于创建卷。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  persistentVolumeReclaimPolicy: Delete /* For development Purposes only */
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/var/lib/mysql"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

最初的回答。希望对你有所帮助。

0

您在部署中设置了mysql-disk,但您拥有的磁盘是custom-disk。将pdName更改为custom-disk即可解决问题。


非常抱歉,这是我的错误。我正在编辑名称,因为我不确定在公共平台上发布时需要保护多少信息。我会更改的。但磁盘名称是正确的。正如我在问题中提到的那样,我进入了该容器,创建了数据库,然后将Django连接到它,它可以正常工作。但是当我创建Pod时,数据库没有被创建。 - Cognoscis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接