Postgres与Kubernetes和persistentDisk

时间:2015-06-17 03:05:26

标签: postgresql docker kubernetes

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

然而,当我尝试用postgres实现类似的东西时,它似乎在连接到磁盘或使用磁盘时失败。 我已经根据上面帖子中的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镜像中的Volumes相关,或者我是否需要为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"
    },

我也尝试过使用带有类似结果的v1beta的json文件:

{
  "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中错过了一些东西,但任何帮助都会受到赞赏!

3 个答案:

答案 0 :(得分:4)

请查看卷的文档 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

答案 1 :(得分:4)

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

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

我已经为docker image here提交了修复程序。

答案 2 :(得分:1)

你的yaml有&#34; persistentDisk&#34;它应该在哪里&#34; gcePersistentDisk&#34;。使用kubectl create -f <file> --validate来捕获这样的错误。不过,你的json看起来是正确的。

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