将EFS卷附加到Kubernetes Pod时遇到问题

时间:2018-07-27 16:37:21

标签: amazon-web-services docker amazon-ec2 kubernetes amazon-efs

我正在aws eks上使用kubernetes集群运行docker容器。我的两个Docker容器正在使用共享卷,并且这两个容器都在两个不同的容器中运行。所以我想要一个可以被aws上的两个吊舱使用的通用卷。

我创建了一个EFS卷并安装了它。我正在跟踪创建PersistentVolumeClaim的链接。但是当efs-provider pod尝试附加已挂载的EFS卷空间时,出现超时错误。 VolumeId,区域仅正确。

针对Pod的详细错误消息描述:

超时已到期,正在等待附加或挂接Pod“默认” /“ efs-provisioner-55dcf9f58d-r547q”的卷。未安装卷列表= [pv-volume]。未连接卷的列表= [pv-volume default-token-lccdw] 卷“ pv-volume”的MountVolume.SetUp失败:安装失败:退出状态32

3 个答案:

答案 0 :(得分:1)

对我来说,问题是我在PV中指定的路径不同于/。并且在该路径之外被引用的NFS服务器上的目录尚不存在。我必须先手动创建该目录。

答案 1 :(得分:0)

AWS EFS使用NFS类型的卷插件,并且按照 Kubernetes Storage Classes NFS卷插件没有EBS之类的内部Provisioner。

因此步骤将是:

  1. 为NFS卷插件创建外部置备器。
  2. 创建一个存储类。
  3. 创建一个批量声明。
  4. 在部署中使用批量声明。

    • 在configmap部分中,更改file.system.id:和aws.region:以匹配您创建的EFS的详细信息。

    • 在“部署”部分中,将服务器:更改为您创建的EFS的DNS端点。


---
apiVersion: v1
kind: ConfigMap
metadata:
  name: efs-provisioner
data:
  file.system.id: yourEFSsystemid
  aws.region: regionyourEFSisin
  provisioner.name: example.com/aws-efs

---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: efs-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate 
  template:
    metadata:
      labels:
        app: efs-provisioner
    spec:
      containers:
        - name: efs-provisioner
          image: quay.io/external_storage/efs-provisioner:latest
          env:
            - name: FILE_SYSTEM_ID
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: file.system.id
            - name: AWS_REGION
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: aws.region
            - name: PROVISIONER_NAME
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: provisioner.name
          volumeMounts:
            - name: pv-volume
              mountPath: /persistentvolumes
      volumes:
        - name: pv-volume
          nfs:
            server: yourEFSsystemID.efs.yourEFSregion.amazonaws.com
            path: /

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: aws-efs
provisioner: example.com/aws-efs

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: efs
  annotations:
    volume.beta.kubernetes.io/storage-class: "aws-efs"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

有关更多说明和详细信息,请访问https://github.com/kubernetes-incubator/external-storage/tree/master/aws/efs

答案 2 :(得分:0)

问题是,我有2个ec2实例正在运行,但是我仅将EFS卷安装到其中一个ec2实例,而kubectl始终在没有安装卷的ec2实例上部署pod。现在,我将相同的卷安装到两个实例上,并使用如下所示的PVC,PV。一切正常。

ec2安装:AWS EFS mounting with EC2

PV.yml

<?php

 namespace App\Entity;

 use Doctrine\ORM\Mapping as ORM;
 use Gedmo\Mapping\Annotation;


/**
 * LoginAttempts
 *        @ORM\Entity(repositoryClass="App\Repository\LoginAttemptsRepository")
 * @ORM\Table(name="login_attempts")
 */
class LoginAttempts
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="username", type="string", length=100, nullable=false)
 */
private $username;

/**
 * @var string
 *
 * @ORM\Column(name="email", type="string", length=100, nullable=false)
 */
private $email;

/**
 * @var string
 *
 * @ORM\Column(name="time", type="string", length=100, nullable=false)
 */
private $time;

public function getId(): ?int
{
    return $this->id;
}

public function getUsername(): ?string
{
    return $this->username;
}

public function setUsername(string $username): self
{
    $this->username = $username;

    return $this;
}

public function getEmail(): ?string
{
    return $this->email;
}

public function setEmail(string $email): self
{
    $this->email = $email;

    return $this;
}

public function getTime(): ?string
{
    return $this->time;
}

public function setTime(string $time): self
{
    $this->time = $time;

    return $this;
}


}

PVC.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  nfs:
    server: efs_public_dns.amazonaws.com
    path: "/"

replicaset.yml

-----仅卷部分-----

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: efs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi