VirtualBox внутри контейнера kubernetes - PullRequest
1 голос
/ 25 марта 2019

Headless VirtualBox успешно работает внутри контейнера Docker

docker run --device=/dev/vboxdrv:/dev/vboxdrv my-vb

Мне нужно запустить этот образ в Kubernetes, и я получаю:

VBoxHeadless: Error -1909 in suplibOsInit!
VBoxHeadless: Kernel driver not accessible

Объект Kubernetes:

metadata:
  name: vbox
  labels:
    app: vbox
spec:
  selector:
    matchLabels:
      app: vbox
  template:
    metadata:
      labels:
        app: vbox
    spec:
      securityContext:
        runAsUser: 0
      containers:
      - name: vbox-vm
        image: my-vb
        imagePullPolicy: 'Always'
        ports:
        - containerPort: 6666

        volumeMounts:
        - mountPath: /root/img.vdi
          name: img-vdi

        - mountPath: /dev/vboxdrv
          name: vboxdrv

      volumes:
      - name: img-vdi
        hostPath:
          path: /root/img.vdi
          type: File

      - name: vboxdrv
        hostPath:
          path: /dev/vboxdrv
          type: CharDevice

Этот образ работает в Docker, поэтому проблема должна быть в конфигурации Kubernetes.

1 Ответ

3 голосов
/ 25 марта 2019

В настройке для этой работы требуется небольшая модификация:

metadata:
  name: vbox
  labels:
    app: vbox
spec:
  selector:
    matchLabels:
      app: vbox
  template:
    metadata:
      labels:
        app: vbox
    spec:
      securityContext:
        runAsUser: 0
      containers:
      - name: vbox-vm
        image: my-vb
        imagePullPolicy: 'Always'
        securityContext:  # << added
          privileged: true

        ports:
        - containerPort: 6666

        volumeMounts:
        - mountPath: /root/img.vdi
          name: img-vdi

        - mountPath: /dev/vboxdrv
          name: vboxdrv

      volumes:
      - name: img-vdi
        hostPath:
          path: /root/img.vdi
          type: File

      - name: vboxdrv
        hostPath:
          path: /dev/vboxdrv
          type: CharDevice

Для запуска привилегированных контейнеров вам необходимо:

  • kube-apiserver runningс --allow-privileged
  • kubelet (все хосты, которые могут иметь этот контейнер), работающего с --allow-privileged = true

Подробнее см. https://kubernetes.io/docs/concepts/workloads/pods/pod/#privileged-mode-for-pod-containers

Как только он заработает, сделайте это правильно через PodSecurityPolicy

...