K8s卷未与主机分离

时间:2019-02-06 16:08:05

标签: kubernetes vmware

我们正在内部使用Kubernetes,它目前正在VMWare上运行。到目前为止,我们已经能够为我们部署的应用程序配置卷。问题是,如果出于任何原因,吊舱切换到另一个工作程序节点。发生这种情况时,磁盘无法安装到第二个工作服务器,因为该磁盘已经存在于最初运行Pod的第一个工作服务器上。见下文:

就目前而言,worker1或worker2上都没有应用程序:

[root@worker01 ~]# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0                   2:0    1     4K  0 disk
sda                   8:0    0   200G  0 disk
├─sda1                8:1    0   500M  0 part /boot
└─sda2                8:2    0 199.5G  0 part
  ├─vg_root-lv_root 253:0    0    20G  0 lvm  /
  ├─vg_root-lv_swap 253:1    0     2G  0 lvm
  ├─vg_root-lv_var  253:2    0    50G  0 lvm  /var
  └─vg_root-lv_k8s  253:3    0    20G  0 lvm  /mnt/disks
sr0                  11:0    1  1024M  0 rom


[root@worker02 ~]# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0                   2:0    1     4K  0 disk
sda                   8:0    0   200G  0 disk
├─sda1                8:1    0   500M  0 part /boot
└─sda2                8:2    0 199.5G  0 part
  ├─vg_root-lv_root 253:0    0    20G  0 lvm  /
  ├─vg_root-lv_swap 253:1    0     2G  0 lvm
  ├─vg_root-lv_var  253:2    0    50G  0 lvm  /var
  └─vg_root-lv_k8s  253:3    0    20G  0 lvm  /mnt/disks
sr0                  11:0    1   4.5G  0 rom

接下来,我们使用以下内容创建PVC:

[root@master01 ~]$ cat app-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: thin-disk
  namespace: tools
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

[root@master01 ~]$ kubectl create -f app-pvc.yaml
persistentvolumeclaim "app-pvc" created

在创建并绑定磁盘后,此方法工作正常:

[root@master01 ~]$ kubectl get pvc -n tools
NAME        STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
app-pvc   Bound     pvc-d4bf77cc-294e-11e9-9106-005056a4b1c7   10Gi       RWO            thin-disk      12s


[root@master01 ~]$ kubectl get pv -n tools
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM             STORAGECLASS   REASON    AGE
pvc-d4bf77cc-294e-11e9-9106-005056a4b1c7   10Gi       RWO            Delete           Bound     tools/app-pvc   thin-disk                12s

现在,我们可以部署创建pod并对存储进行排序的应用程序了:

[centos@master01 ~]$ cat app.yaml
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: app
  namespace: tools
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - image: sonatype/app3:latest
        imagePullPolicy: IfNotPresent
        name: app
        ports:
        - containerPort: 8081
        - containerPort: 5000
        volumeMounts:
          - mountPath: /app-data
            name: app-data-volume
      securityContext:
        fsGroup: 2000
      volumes:
        - name: app-data-volume
          persistentVolumeClaim:
            claimName: app-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: app-service
  namespace: tools
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 8081
    protocol: TCP
    name: http
  - port: 5000
    targetPort: 5000
    protocol: TCP
    name: docker
  selector:
    app: app

[centos@master01 ~]$ kubectl create -f app.yaml
deployment.extensions "app" created
service "app-service" created

这可以很好地部署:

[centos@master01 ~]$ kubectl get pods -n tools
NAME                     READY     STATUS              RESTARTS   AGE
app-6588cf4b87-wvwg2   0/1       ContainerCreating   0          6s

[centos@neb-k8s02-master01 ~]$ kubectl describe pod app-6588cf4b87-wvwg2 -n tools

Events:
  Type    Reason                  Age   From                         Message
  ----    ------                  ----  ----                         -------
  Normal  Scheduled               18s   default-scheduler           Successfully assigned nexus-6588cf4b87-wvwg2 to neb-k8s02-worker01
  Normal  SuccessfulMountVolume   18s   kubelet, worker01           MountVolume.SetUp succeeded for volume "default-token-7cv62"
  Normal  SuccessfulAttachVolume  15s   attachdetach-controller     AttachVolume.Attach succeeded for volume "pvc-d4bf77cc-294e-11e9-9106-005056a4b1c7"
  Normal  SuccessfulMountVolume   7s    kubelet, worker01           MountVolume.SetUp succeeded for volume "pvc-d4bf77cc-294e-11e9-9106-005056a4b1c7"
  Normal  Pulled                  7s    kubelet, worker01           Container image "acme/app:latest" already present on machine
  Normal  Created                 7s    kubelet, worker01           Created container
  Normal  Started                 6s    kubelet, worker01           Started container

我们还可以看到该磁盘已创建并安装在VMWare中,用于Worker01而不是用于Worker02:

[root@worker01 ~]# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0                   2:0    1     4K  0 disk
sda                   8:0    0   200G  0 disk
├─sda1                8:1    0   500M  0 part /boot
└─sda2                8:2    0 199.5G  0 part
  ├─vg_root-lv_root 253:0    0    20G  0 lvm  /
  ├─vg_root-lv_swap 253:1    0     2G  0 lvm
  ├─vg_root-lv_var  253:2    0    50G  0 lvm  /var
  └─vg_root-lv_k8s  253:3    0    20G  0 lvm  /mnt/disks
sdb                   8:16   0    10G  0 disk /var/lib/kubelet/pods/1e55ad6a-294f-11e9-9175-005056a47f18/volumes/kubernetes.io~vsphere-volume/pvc-d4bf77cc-294e-11e9-9106-005056a4b1c7
sr0                  11:0    1  1024M  0 rom



[root@worker02 ~]# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0                   2:0    1     4K  0 disk
sda                   8:0    0   200G  0 disk
├─sda1                8:1    0   500M  0 part /boot
└─sda2                8:2    0 199.5G  0 part
 ├─vg_root-lv_root 253:0    0    20G  0 lvm  /
  ├─vg_root-lv_swap 253:1    0     2G  0 lvm
  ├─vg_root-lv_var  253:2    0    50G  0 lvm  /var
  └─vg_root-lv_k8s  253:3    0    20G  0 lvm  /mnt/disks
sr0                  11:0    1   4.5G  0 rom

如果Worker01跌倒了,Worker02将启动,我们可以看到磁盘已连接到另一个节点:

[root@worker02 ~]# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0                   2:0    1     4K  0 disk
sda                   8:0    0   200G  0 disk
├─sda1                8:1    0   500M  0 part /boot
└─sda2                8:2    0 199.5G  0 part
  ├─vg_root-lv_root 253:0    0    20G  0 lvm  /
  ├─vg_root-lv_swap 253:1    0     2G  0 lvm
  ├─vg_root-lv_var  253:2    0    50G  0 lvm  /var
  └─vg_root-lv_k8s  253:3    0    20G  0 lvm  /mnt/disks
sdb                   8:16   0    10G  0 disk /var/lib/kubelet/pods/a0695030-2950-11e9-9175-005056a47f18/volumes/kubernetes.io~vsphere-volume/pvc-d4bf77cc-294e-11e9-9106-005056a4b1c7
sr0                  11:0    1   4.5G  0 rom

但是,似乎磁盘现在已连接到Worker01和Worker02,Worker01将不再开始引用vCenter中的以下错误:

Cannot open the disk '/vmfs/volumes/5ba35d3b-21568577-efd4-469e3c301eaa/kubevols/kubernetes-dynamic-pvc-e55ad6a-294f-11e9-9175-005056a47f18.vmdk' or one of the snapshot disks it depends on.

发生此错误的原因是(我假设)Worker02可以访问该磁盘并且正在对其进行读/写操作。如果将磁盘附加到另一个节点,Kubernetes不应将磁盘与不需要磁盘的节点分离。我们该如何解决这个问题?如果由于节点故障Pod移至另一台主机,则我们必须手动分离磁盘,然后手动启动其他工作程序。

任何人和所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

首先,假设您在树形vSphere磁盘中运行。

第二,在这种情况下(对于CSI更是如此),kubernetes无法控制所有卷操作。您正在使用的卷插件中实现了用于管理磁盘的连接和分离的VMWare功能。 Kubernetes并不严格将所有卷的附着/分离语义作为通用函数进行控制。

要查看树内实现的详细信息,请查看:

https://kubernetes.io/docs/concepts/storage/volumes/ #vspherevolume

总的来说,我认为您进行故障转移的方式将意味着,当worker1吊舱死亡时,worker2可以进行调度。那时,worker1应该不能能够抓取相同的PVC,并且应该不能进行调度,直到worker2吊舱死亡。

但是,如果worker1正在调度,则意味着Vsphere试图(错误地)让worker1启动,并且kubelet失败了。

这是VMWare驱动程序中的一个错误,因为即使它尚未准备好,它也将绑定持久卷。

为进一步详细说明,可能会对有关启动worker2的细节有所帮助。它是一个单独的复制控制器吗?还是在kubernetes之外运行?如果是后者,则将无法以相同的方式管理卷,并且您不能使用与锁定机制相同的PVC。