2016-07-28 81 views
1

我想将卷用于具有多个副本的部署。如何定义一个PersistentVolumeClaim,以便为每个副本生成?此刻(请参阅下面的示例),我可以生成一个卷并将其分配给Pod。问题是,只有一个卷被产生这会导致此错误消息:如何在Kubernetes部署中使用卷?

38m 1m 18 {kubelet worker-1.loc}  Warning FailedMount Unable to mount volumes for pod "solr-1254544937-zblou_default(610b157c-549e-11e6-a624-0238b97cfe8f)": timeout expired waiting for volumes to attach/mount for pod "solr-1254544937-zblou"/"default". list of unattached/unmounted volumes=[datadir] 
    38m 1m 18 {kubelet worker-1.loc}  Warning FailedSync Error syncing pod, skipping: timeout expired waiting for volumes to attach/mount for pod "solr-1254544937-zblou"/"default". list of unattached/unmounted volumes=[datadir] 

我怎么能告诉Kubernetes生成每个副本的音量?

我正在使用Kubernetes 1.3。


实施例:

--- 
kind: PersistentVolumeClaim 
apiVersion: v1 
metadata: 
    name: solr-datadir 
    annotations: 
    volume.alpha.kubernetes.io/storage-class: anything 
spec: 
    accessModes: 
    - ReadWriteOnce 
    resources: 
    requests: 
     storage: 50Gi 
--- 
apiVersion: extensions/v1beta1 
kind: Deployment 

metadata: 
    name: solr 
    labels: 
    team: platform 
    tier: search 
    app: solr 

spec: 
    revisionHistoryLimit: 3 
    replicas: 3 

    template: 
    metadata: 
     name: solr 
     labels: 
     team: platform 
     tier: search 
     app: solr 

    spec: 
     containers: 
     - name: solr 
     image: solr:6-alpine 
     imagePullPolicy: IfNotPresent 
     ports: 
     - name: http 
      containerPort: 80 
     resources: 
      requests: 
      cpu: 512m 
      memory: 512Mi 
     command: 
     - /bin/bash 
     args: 
     - -c 
     - /opt/solr/bin/solr start -f -z zookeeper:2181 
     volumeMounts: 
     - mountPath: "/opt/solr/server/solr/mycores" 
      name: datadir 
     volumes: 
     - name: datadir 
     persistentVolumeClaim: 
      claimName: solr-datadir 

生成荚:

$ kubectl get pods -lapp=solr 
NAME     READY  STATUS    RESTARTS AGE 
solr-1254544937-chenr 1/1  Running    0   55m 
solr-1254544937-gjud0 0/1  ContainerCreating 0   55m 
solr-1254544937-zblou 0/1  ContainerCreating 0   55m 

生成卷:

$ kubectl get pv 
NAME          CAPACITY ACCESSMODES STATUS CLAIM       REASON AGE 
pvc-3955e8f1-549e-11e6-94be-060ea3314be5 50Gi  RWO   Bound  default/solr-datadir     57m 

生成的声明:

$ kubectl get pvc 
NAME     STATUS VOLUME          CAPACITY ACCESSMODES AGE 
solr-datadir   Bound  pvc-3955e8f1-549e-11e6-94be-060ea3314be5 0      57m 

回答

9

副本将卷视为无状态卷。如果您的replicaset pod模板指定只能附加读写的卷,则该复制数据集中的所有窗格使用相同的卷。如果该卷一次只能附加读写到一个节点(如GCE PD),那么在第一个pod成功调度并启动后,如果将pod安排到不同的节点,则后续的pod实例将无法启动,因为卷将无法附加到第二个节点。

您正在寻找的是Pet Sets,它允许您为每个副本生成一个卷。请参阅http://kubernetes.io/docs/user-guide/petset/该功能目前处于Alpha版,但应解决您的用例问题。

更新:在Kubernetes 1.5+ PetSets被重命名为StatefulSets。请参阅文档here

+0

请注意,部署目前仅支持Pod和副本集,而不支持PetSets。 –

+0

至少在测试版中,GKE还不支持:( –

+0

在GKE上等待1.5 –