Запуск приложений Linux как Unikernels с K8S

Если вы читали некоторые из моих предыдущих статей, возможно, вы подумали, что я никогда не напишу это, а? 🙂 Хорошо здесь идет.

Распространенный вопрос, который мы получаем: «Можете ли вы использовать unikernels с K8S?» Ответ — да, однако, есть предостережения. А именно, unikernels поставляются как виртуальные машины, и во многих случаях k8s предоставляется в публичном облаке поверх виртуальных машин. Кроме того, вы должны знать, что предоставление уникальных ядер под k8s сопряжено с рисками безопасности, с которыми вам иначе не пришлось бы иметь дело. Они значительно уменьшились, поскольку гости — это unikernels, а не гости linux, но все же.

Теперь, если у вас есть свои собственные серверы или вы используете k8s на голом железе, вы будете использовать Unikernels Nanos под k8s.

Для этой статьи вам понадобится реальная физическая машина и OPS. Пока ты могу использовать вложенную виртуализацию я бы не стал, потому что вы сильно пострадали от производительности. Google Cloud имеет эту функцию на некоторых их экземплярах, и если вы находитесь на Amazon, вы можете выполнить этот пример на «металлических» экземплярах (я не проверял), хотя, имейте в виду, что оба эти варианта не будут дешевыми по сравнению с простым вращением до t2 нано или микро экземпляра, который вы можете легко сделать с помощью unikernels.

Мы собираемся запустить Go Unikernel для этого примера, но вы можете использовать любой пример OPS, чтобы следовать. Здесь у нас есть простой веб-сервер go, который находится на порте 8083:

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Welcome to my website!")
	})

	fs := http.FileServer(http.Dir("static/"))
	http.Handle("/static/", http.StripPrefix("/static/", fs))

	http.ListenAndServe(":8083", nil)
}

Хорошо, выглядит хорошо. Мы можем быстро создать изображение и убедиться, что все работает нормально, вот так. Мы используем «ночной» вариант сборки здесь:

Здесь также работает Ops build, но команда run запустит его для вас, чтобы убедиться, что сначала он работает локально. Теперь нам нужно поместить его в формат для использования k8s. Сначала сжимаем XZ (sudo apt-get install xz-utils):
cp .ops/images/goweb.img .
xz goweb.img

Оттуда мы должны поместить это в место для k8s, чтобы импортировать это. Я бросил его в облачное ведро, и чтобы эта статья была как можно более простой, оставил ее открытой. (Очевидно, что вы не хотите делать это в реальном сценарии производства.)

  curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
  chmod +x ./kubectl
  mv kubectl /usr/local/bin/.
  sudo mv kubectl /usr/local/bin/.
  kubectl version --client
Теперь давайте установим minikube, Я использую minikube здесь, чтобы, надеюсь, минимизировать количество шагов, которые вам нужно сделать из новой установки, но не стесняйтесь использовать все, что вы хотите.
  curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
  minikube start --vm-driver=kvm2

Затем установите драйвер kvm2. Для этого окна мне нужно было установить набор инструментов libvirt:

sudo apt-get install libvirt-daemon-system libvirt-clients bridge-utils
Libvirt Эта довольно старая и неприятная библиотека, используемая для взаимодействия с KVM, хотя это тонна интеграций и альтернатив не так много.

Если у вас возникли проблемы после этого шага, вы можете запустить эту быструю проверку, чтобы убедиться, что все настроено:

Также убедитесь, что вы находитесь в правильной группе для взаимодействия с KVM:

После установки всего этого вам может понадобиться сбросить сеанс (самый быстрый способ — просто выйти из системы / войти снова).

Далее — давайте установим оператор кубевирта, Это то, что действительно связывает комнату вместе.

  export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- - | sort -V | tail -1 | awk -F':' '{print $2}' | sed 's/,//' | xargs)
  echo $KUBEVIRT_VERSION

  kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml

Тогда давайте создадим ресурс:

  kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml

Теперь давайте установим virtctl. Мы уже устали?

  curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/virtctl-${KUBEVIRT_VERSION}-linux-amd64
  chmod +x virtctl

Тогда мы будем импортировать с CDI.

  wget https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/storage-setup.yml
  kubectl create -f storage-setup.yml
  export VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v(0-9).(0-9)*.(0-9)*")
  kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
  kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml

  kubectl get pods -n cdi

ОК! Whooh! Если вы прошли через все это, мы почти до финиша. Давайте возьмем шаблон для нашей постоянной заявки:

  wget https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/pvc_fedora.yml

Теперь отредактируйте строку, чтобы показать, куда вы вставили исходный образ диска. В моем примере это выглядит так (опять же, это просто пример для простоты — вы не должны / не должны делать это в реальной жизни):

  cdi.kubevirt.io/storage.import.endpoint: "https://storage.googleapis.com/totally-insecure/goweb.img.xz"

Давайте создадим это:

kubectl create -f pvc_fedora.yml
kubectl get pvc fedora -o yaml

Вы можете проверить импорт, как это происходит, но подождите, пока не увидите сообщение об успехе:

    cdi.kubevirt.io/storage.pod.phase: Succeeded

Теперь мы можем создать актуальный VM:

wget https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/vm1_pvc.yml
  kubectl create -f vm1_pvc.yml

Теперь, если вы:

Вы должны увидеть, как работает ваш экземпляр.

Если у вас есть миникуб, вы можете сделать это:

Вот Это Да! Мы только что развернули unikernel на K8S. Легко? Хорошо, я позволю тебе решить это.

Конечно, если вы используете общедоступное облако, такое как AWS или GCP, и вам не нужно проходить через все эти хлопоты, эти 2 команды позволят развернуть один и тот же веб-сервер так же легко, с гораздо меньшими хлопотами, большей безопасностью и более производительность с меньшими затратами:

ops image create -c config.json -a goweb
ops instance create -z us-west2-a -i goweb-image

До скорого.



Источник: Запуск приложений Linux как Unikernels с K8S


Похожие материалы по теме: Запуск приложений Linux как Unikernels с K8S

Leave a comment