【问题标题】:Kubernetes: mount: special device does not exist when attaching AWS EBS volumeKubernetes:mount:附加AWS EBS卷时不存在特殊设备
【发布时间】:2017-02-27 18:38:51
【问题描述】:

尊敬的 Kubernetes 大师!

我使用“contrib”Ansible playbook (https://github.com/kubernetes/contrib/tree/master/ansible) 在手动创建的 AWS 主机上构建了 kube 1.4.1 集群。

我的问题是 Kube 没有将 EBS 驱动器连接到 minion 主机。如果我将 pod 定义如下:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata:
  name: kafka1
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: kafka1
        image: daniilyar/kafka
        ports:
        - containerPort: 9092 
          name: clientconnct
          protocol: TCP
        volumeMounts:
        - mountPath: /kafka
          name: storage
      volumes:
      - name: storage
        awsElasticBlockStore:
          volumeID: vol-56676d83
          fsType: ext4

我在 kubelet.log 中收到以下错误:

Mounting arguments: /var/lib/kubelet/plugins/kubernetes.io/aws-ebs/mounts/vol-56676d83 /var/lib/kubelet/pods/db213783-9477-11e6-8aa9-12f3d1cdf81a/volumes/kubernetes.io~aws-ebs/storage  [bind]
Output: mount: special device /var/lib/kubelet/plugins/kubernetes.io/aws-ebs/mounts/vol-56676d83 does not exist

EBS 卷在此期间一直处于“可用”状态,所以我确信 Kube 根本没有将卷附加到主机,因此 没有挂载 它。 我 100% 确定这是 Kubernetes 本身的问题,而不是权限问题,因为我可以从这个 minion 中手动将相同的卷挂载到这个 minion 上就好了:

$ aws ec2 --region us-east-1 attach-volume --volume-id vol-56676d83 --instance-id $(wget -q -O - http://instance-data/latest/meta-data/instance-id) --device /dev/sdc
{
    "AttachTime": "2016-10-18T15:02:41.672Z", 
    "InstanceId": "i-603cfb50", 
    "VolumeId": "vol-56676d83", 
    "State": "attaching", 
    "Device": "/dev/sdc"
}

谷歌搜索、黑客攻击和尝试较旧的 K8 版本并没有帮助我解决这个问题。 谁能指出我还能做些什么来理解这个问题,以便我可以解决它?非常感谢任何帮助。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 kubernetes amazon-ebs


    【解决方案1】:

    在 K8 Slack 频道没有人帮助我,所以在拔掉头发一天后,我自己找到了解决方案:

    要让 'contrib' Ansible playbook (https://github.com/kubernetes/contrib/tree/master/ansible) 正确安装 EBS 卷安装 K8 集群,除了 IAM 角色设置,您需要添加 --cloud-provider=aws标记到您现有的集群:所有 kubelet、apiserver 和控制器管理器。

    如果没有 --cloud-provider=aws 标志,Kubernetes 会给你一个不友好的“mount: special device xxx does not exist”错误,而不是真正的原因。

    【讨论】:

    • 我也有同样的问题。如何添加标志?是否有我应该编辑的特定配置文件?
    • @JiashenCao ,可以在 /etc K8 配置文件中更改,例如 Debian 上的 kubelet 是 /etc/sysconfig/kubelet,等等..
    【解决方案2】:

    使用 kubeadm 配置,配置定义在: /var/lib/kubelet/config.yaml/var/lib/kubelet/kubeadm-flags.env

    我遇到的问题是环境变量是在kubeadm-flags.env 的主节点上定义的,但不是在第二个节点中。

    为了手动解决这个问题,我将--cloud-provider=aws 标记添加到kubeadm-flags.env 并重新启动服务,从而解决了问题: systemctl daemon-reload && systemctl restart kubelet

    【讨论】:

    • 对我来说同样的问题。在 master 而不是 worker 上添加了 --cloud-provider 标志
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多