向容器中的现有文件添加持久卷声明

时间:2018-08-23 02:20:20

标签: docker kubernetes docker-volume kubernetes-pvc kubernetes-statefulset

在我的docker映像中,我有一个目录/opt/myapp/etc,其中包含一些文件和目录。我想为我的应用创建statefulset。在该有状态集中,我将创建持久卷声明并附加到/opt/myapp/etc。以下是Statefulset yaml。有人可以告诉我在这种情况下如何将体积连接到容器吗?

apiVersion: apps/v1
kind: StatefulSet
metadata:
 name: statefulset
labels:
 app: myapp
spec:
  serviceName: myapp
 replicas: 1
selector:
matchLabels:
  app: myapp
template:
metadata:
  labels:
    app: myapp
spec:
  containers:
  - image: 10.1.23.5:5000/redis
    name: redis
    ports:
    - containerPort: 6379
      name: redis-port
  - image: 10.1.23.5:5000/myapp:18.1
    name: myapp
    ports:
    - containerPort: 8181
      name: port
    volumeMounts:
    - name: data
      mountPath: /opt/myapp/etc
volumeClaimTemplates:
- metadata:
  name: data
  spec:
   accessModes: [ "ReadWriteOnce" ]
  storageClassName: standard
  resources:
    requests:
        storage: 5Gi

这是describe pod的输出

   Events:
  Type     Reason                  Age              From                     Message
  ----     ------                  ----             ----                     -------
  Warning  FailedScheduling        3m (x4 over 3m)  default-scheduler        pod has unbound PersistentVolumeClaims
  Normal   Scheduled               3m               default-scheduler        Successfully assigned controller-statefulset-0 to dev-k8s-2
  Normal   SuccessfulMountVolume   3m               kubelet, dev-k8s-2       MountVolume.SetUp succeeded for volume "default-token-xpskd"
  Normal   SuccessfulAttachVolume  3m               attachdetach-controller  AttachVolume.Attach succeeded for volume "pvc-77d2cef8-a674-11e8-9358-fa163e3294c1"
  Normal   SuccessfulMountVolume   3m               kubelet, dev-k8s-2       MountVolume.SetUp succeeded for volume "pvc-77d2cef8-a674-11e8-9358-fa163e3294c1"
  Normal   Pulling                 2m               kubelet, dev-k8s-2       pulling image "10.1.23.5:5000/redis"
  Normal   Pulled                  2m               kubelet, dev-k8s-2       Successfully pulled image "10.1.23.5:5000/redis"
  Normal   Created                 2m               kubelet, dev-k8s-2       Created container
  Normal   Started                 2m               kubelet, dev-k8s-2       Started container
  Normal   Pulled                  1m (x4 over 2m)  kubelet, dev-k8s-2       Container image "10.1.23.5:5000/myapp:18.1" already present on machine
  Normal   Created                 1m (x4 over 2m)  kubelet, dev-k8s-2       Created container
  Normal   Started                 1m (x4 over 2m)  kubelet, dev-k8s-2       Started container
  Warning  BackOff                 1m (x7 over 2m)  kubelet, dev-k8s-2       Back-off restarting failed container

存储类定义

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 name: standard
 namespace: controller
provisioner: kubernetes.io/cinder
reclaimPolicy: Retain
parameters:
 availability: nova

2 个答案:

答案 0 :(得分:2)

检查集群中是否定义了存储类。 kubectl get storageclass  如果您使用默认存储类作为主机路径(在minikube的情况下),则无需在模板中包括存储类。

volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 5Gi 通过不指定任何存储类,k8将继续进行操作,并使用默认存储类(在minikube情况下为主机路径)来调度持久卷,并确保/opt/myapp/etc存在于要调度pod的节点上。 / p>

答案 1 :(得分:0)

Kubernetes不允许将2个卷挂载到同一目录。第二次安装将覆盖第一次创建的文件。 在我的情况下,docker映像在etc目录中有一些文件,这些文件在装入卷后被删除。使用子路径解决了问题。