如何重新启动kubernetes pod并保留数据

时间:2017-07-08 10:10:37

标签: docker kubernetes

我现在正在使用kubernetes来运行Docker容器。我只是创建了容器,我使用SSH连接到我的pod。

我需要进行一些系统配置更改,所以我需要重新启动容器,但是当我重新启动容器时,它将丢失容器中的所有数据。 kubernetes将像Docker图像原始一样运行一个新的pod。

那么如何重启pod并将数据保存在其中呢?

kubernetes提供了我的Bluemix

2 个答案:

答案 0 :(得分:4)

您需要了解有关容器的更多信息,因为您的问题表明您并未完全掌握这些概念。

  1. 在容器中运行SSH是一种反模式,容器不是虚拟机。所以从中删除SSH服务器。
  2. 您运行SSH的事实表明您可能正在为每个容器运行多个进程。这通常是不好的做法。因此,请删除该主管并直接在入口点调用主进程。
  3. 设置容器映像主进程,以便在运行时使用环境变量或配置文件进行配置。
  4. 最后一项意味着您可以在Pod清单中定义环境变量,或使用Kubernetes配置文件来存储配置文件。您的Pod将读取这些内容,您的容器中的进程将得到正确配置。如果不是你的Pod会死,或者你的进程无法正常运行,你可以编辑环境变量或配置映射。

    我的主要建议是,在您正确编写Docker镜像并仔细考虑配置之前,不要使用Kubernetes,您不必在容器中执行以使您的进程运行。

    最后,更一般地说,你不应该将状态保存在容器中。

答案 1 :(得分:0)

为了存储您需要设置持久存储的数据,如果您使用Google Cloud作为平台,则需要创建一个磁盘来存储数据,并定义此磁盘的使用情况。你的清单。

使用Bluemix,您只需要创建卷并使用它们。

bx ic volume-create myapplication_volume ext4 

bx ic run --volume myapplication_volume:/data --name myapplication registry.eu-gb.bluemix.net/<my_namespace>/my_image

Bluemix - Persistent storage documentation

我自己不使用Bluemix所以我将使用Google的永久磁盘继续使用示例清单。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapplication
  namespace: default
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: myapplication
  template:
    metadata:
      labels:
        app: myapplication
    spec:
      containers:
      - name: myapplication
        image: eu.gcr.io/myproject/myimage:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        - containerPort: 443
        volumeMounts:
        - mountPath: /data
          name: myapplication-volume
      volumes:
      - name: myapplication-volume
        gcePersistentDisk:
          pdName: mydisk-1
          fsType: ext4

此处磁盘mydisk-1映射到/data挂载点。 重新启动后将保留的唯一数据将位于该文件夹中。

例如,如果要存储日志,可以对日志文件夹进行符号链接。

/var/log/someapplication -> /data/log/someapplication

它有效,但推荐

我不清楚你是在搜索节点还是使用某种工具来执行容器内的shell。即使每个容器运行多个进程是不好的做法,但如果你密切关注内存和cpu的使用,它似乎运行得很好。

例如,在同一容器中运行ssh服务器和cronjobs绝对有效,尽管它不是最好的解决方案。

我们一直在使用多个(2-5)生产过程的主管超过一年,而且它的工作效果非常好。

有关各种平台中持久卷的更多信息。 https://kubernetes.io/docs/concepts/storage/persistent-volumes/