带有 Kubernetes 和 persistentDisk 的 Postgres

Postgres with Kubernetes and persistentDisk

我刚开始使用 Kubernates,在使用带有 GCE 永久磁盘的 Kubernetes 安装 Postgres 时遇到了问题。 我可以使用 Kubernates 演练和以下指南成功安装 Mysql:http://amygdala.github.io/kubernetes/2015/01/13/k8s1.html

然而,当我尝试用 postgres 实现类似的事情时,它似乎在附加到磁盘或使用磁盘时失败了。 我已经根据上面 post 中的 mysql 创建了一个 pod yaml,但替换为 postgres docker 图像:

apiVersion: v1beta1
id: postgres
desiredState:
  manifest:
    version: v1beta1
    id: postgres
    containers:
      - name: postgres
        image: postgres
        env:
          - name: DB_PASS
            value: password
        cpu: 100
        ports:
          - containerPort: 5432
        volumeMounts:
            # name must match the volume name below
          - name: persistent-storage
            # mount path within the container
            mountPath: /var/lib/postgresql/data
    volumes:
      - name: persistent-storage
        source:
          persistentDisk:
            # This GCE PD must already exist and be formatted ext4
            pdName: postgres-disk
            fsType: ext4
labels:
  name: postgres
kind: Pod

但是当我创建

$ kubectl create -f postgres.yaml

我收到以下错误:

$ kubectl logs postgres
$ postgres cannot access the server configuration file "/var/lib/postgresql/data/postgresql.conf": No such file or directory

我可以看到 postgres-disk 连接到一个 minion 服务器,所以我想知道它是否与我正在使用的 docker 图像中的卷有关,或者如果我需要 postgresql.conf 文件的单独挂载路径。

现在,如果我更改安装路径(例如 mountPath: /var/lib/postgresql),pod 将正常启动,但它似乎没有使用持久数据。 检查 minion 上的 docker 容器中的卷给我:

"Volumes": {
        "/dev/termination-log": "/var/lib/kubelet/pods/52177db4-149c-11e5-a64b-42010af06968/containers/postgres/91ecf33c939588b4165865f46b646677bf964fab81ea7ec08b598568513d4644",
        "/var/lib/postgresql": "/var/lib/kubelet/pods/52177db4-149c-11e5-a64b-42010af06968/volumes/kubernetes.io~gce-pd/pgdata",
        "/var/lib/postgresql/data": "/var/lib/docker/vfs/dir/c3ecda11de6a598d99842c06bee22097f1cb63a6e467cbe7af874d003140a4af",
        "/var/run/secrets/kubernetes.io/serviceaccount": "/var/lib/kubelet/pods/52177db4-149c-11e5-a64b-42010af06968/volumes/kubernetes.io~secret/default-token-b6s28"
    },

我也尝试过将 json 文件与 v1beta3 一起使用,结果相似:

{
  "kind": "Pod",
  "apiVersion": "v1beta3",
  "metadata": {
    "name": "postgres"
  },
  "spec": {
    "volumes": [{
      "name": "pgdata",
      "gcePersistentDisk": {
        "pdName": "postgres-disk",
        "fsType": "ext4"
      }
    }],
    "containers": [
      {
        "name": "postgres",
        "image": "postgres",
        "ports": [
          {
            "name": "postgres-ports",
            "hostPort": 5432,
            "containerPort": 5432
          }
        ],
        "env": [
          {
            "name": "DB_USER",
            "value": "postgres"
          },
          {
            "name": "DB_PASS",
            "value": "password"
          }
        ],
        "volumeMounts": [
          {
            "name": "pgdata",
            "readOnly": false,
            "mountPath": "/var/lib/postgresql/data"
          }
        ]
      }
    ]
  }
}

我很可能只是错过了 doco 中的某些内容,但是如果有任何帮助,我们将不胜感激!

你的 yaml 有 "persistentDisk" 而它应该有 "gcePersistentDisk"。使用 kubectl create -f <file> --validate 来捕捉这样的错误。不过,您的 json 看起来是正确的。

postgres 是否可能要求该配置文件已经存在?

请检查卷的文档 https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/volumes.md#gcepersistentdisk

在将 GCE PD 与 pod 一起使用之前,您需要先创建它。

gcloud compute disks create --size=500GB --zone=us-central1-a pg-data-disk

这将是您的配置,请注意 gcePersistentDisk

apiVersion: v1beta1
id: postgres
desiredState:
  manifest:
    version: v1beta1
    id: postgres
    containers:
      - name: postgres
        image: postgres
        env:
          - name: DB_PASS
            value: password
        cpu: 100
        ports:
          - containerPort: 5432
        volumeMounts:
            # name must match the volume name below
          - name: persistent-storage
            # mount path within the container
            mountPath: /var/lib/postgresql/data
    volumes:
      - name: persistent-storage
        source:
          gcePersistentDisk:
            # This GCE PD must already exist and be formatted ext4
            pdName: pg-data-disk
            fsType: ext4
labels:
  name: postgres
kind: Pod

我也遇到了同样的问题 - 这是因为数据库初始化脚本错误地假设非空卷目录意味着它已经被初始化。

不幸的是,新的 GCE 持久性磁盘包含一个 lost+found 目录。

我已经提交了 docker 图片的修复 here