Рубрики
Uncategorized

Государственные без сервера с Unikernels

Как вы запускаете Stateful без сервера и сохраняете настойчивость? Как бы вы запустили приложение Cloud Native Stateful? Помечено Unikernels, без сервера, JavaScript, DevOps.

Одной из больших проблем с облачными нативными вычислениями является нежелание использовать так называемый сервис. Подумайте, от баз данных до простого регистрации веб -приложения и фактически хранить эти журналы. Для некоторых из нас это звучит немного безумно, чтобы даже различать «государственные» и «без гражданства». Если вы не находитесь в каком -то функциональном программировании, вы собираетесь иметь дело с государством.

Если вы решите использовать традиционные облачные приложения, нативные приложения, вы можете узнать обо всем, от наборов Stateful, до постоянных объемов до всего остального. Для вашего обычного разработчика это слишком много сумасшествия.

Это становится действительно сумасшедшим, когда вы начинаете думать, что большинство облачных собственных и без серверных фреймворков уже работают Помимо общедоступных облачных сред, таких как AWS или Google Cloud. Если вам не сказали, что «облако»-это просто API для виртуализации-и существует нетривиальное количество программного обеспечения, которое делает эту работу. AWS и Google Cloud старались изо всех сил обеспечить действительно облачный нативный опыт, написав основную инфраструктуру для создания сети, хранения и всего остального. Чтобы быть ясным — я не говорю о ECS и GKE здесь. Я говорю о том, когда вы идете и загружаете виртуальную машину в одной из этих соответствующих систем, думают о том, что все происходит внизу.

Это почти заставляет задуматься, почему команды разработчиков предпочли бы переписать все это, прекрасно зная, что они собираются выполнять более хрустящую работу, чем инфраструктурные команды в Google/Amazon. Для загрузки большая часть облачной нативной экосистемы требует серьезных хитов производительности от необходимости воспроизведения сетевых слоев и хранения поверх существующей инфраструктуры, и они страдают от серьезных проблем безопасности, таких как CryptoJacking Анкет

Недавно я пересматривал этот разговор от Эндрю Таненбаума, и он задает очень острый вопрос:

«Почему наши операционные системы не такие, как наши телевизоры? Вы нажимаете на телевизор, и вы нажимаете на него, и он просто работает ».

Хороший вопрос, Эндрю!

Облачная экосистема облегчает жизнь некоторым разработчикам, потому что им не нужно связываться с настройкой или развертыванием базовой операционной системы, но нет ли что -то вроде контейнера, но также имеет упорство и безопасность? Вы когда -нибудь хотели, чтобы у вас был настоящий облачный вариант без сервера, но с реальной реальной настойчивостью?

Ну, вы можете. Сегодня мы покажем вам, как развернуть Statefullesfless Server с Unikernels.

Stateful Serverless

Для этого урока вы захотите схватить OPS Анкет Если вы хотите построить из источника, проверьте, проверьте GitHub Repo . Мы будем развертываться в Google Cloud сегодня, но вы также можете поднять его для AWS Анкет В Google Cloud вам нужно ведро для хранения ваших изображений и Ключ обслуживания (что я придерживаюсь ~/gcloud.json), а затем создаю этот config.json:

{
    "CloudConfig" :{
        "ProjectID" :"my-project",
        "Zone": "us-west1-b",
        "BucketName":"my-bucket"
    }
}

Теперь давайте посмотрим на какой -то пример кода. У нас есть очень простой веб -сервер Node.js, который делает две вещи. Он либо добавляет к файлу через URL -адрес ‘/savelog, либо показывает то, что находится в журнале через URL’/getLog ‘.

Кроме того — я не практикующий разработчик узлов, поэтому, пожалуйста, извините за не -идиоматическое сумасшествие кода. Извиняюсь заранее.

Я оставил порт настраиваемым здесь, чтобы вы могли попробовать его на другом порте, прежде чем развернуть его на GCLOUD.

const fs = require('fs');
var http = require('http');

var logfile = 'bob.log';
var port = 80;

http.createServer(function (req, res) {

    if (req.url == '/getlog') {

      if(!fs.existsSync(logfile)) {
        console.log("File not found");
      } else {
        var contents = fs.readFileSync(logfile).toString();
        console.log(contents);
      }

      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end(contents + '\n');

    } else if (req.url == "/savelog") {
      fs.appendFileSync(logfile, 'test' + '\n');

      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('logged\n');

    } else {

      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello World\n');

    }

}).listen(port, "0.0.0.0");

console.log('Server running at http://127.0.0.1:' + port);

Мы можем построить наше изображение, просто заявив, что мы хотим, чтобы узел версии 12.13.0 и указав его на нашу входную файл bob.js.

export GOOGLE_APPLICATION_CREDENTIALS=~/gcloud.json

ops image create -c config.json -p node_v12.13.0 -a bob.js

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

➜  stateful-serverless  ./build.sh
[node bob.js]
bucket found: my-bucket
Image creation started. Monitoring operation operation-1573675163382-5973fcd1af403-c6abea13-cf898ff6.
...............
Operation operation-1573675163382-5973fcd1af403-c6abea13-cf898ff6 completed successfully.
Image creation succeeded node-image.
gcp image 'node-image' created...

Тот, который сделан, мы можем создать такой экземпляр, как:

 ops instance create -z us-west1-b -i node-image
ProjectId not provided in config.CloudConfig. Using my-project from default credentials.Instance creation started using image projects/my-project/global/images/node-image. Monitoring operation operation-1573675228678-5973fd0ff4976-a6b7132d-9aa57c18.
.....
Operation operation-1573675228678-5973fd0ff4976-a6b7132d-9aa57c18 completed successfully.
Instance creation succeeded node-image-1573675228.

Тогда мы можем несколько раз ударить его, запросив «/Савелог». После этого мы можем просмотреть «/getLog», чтобы увидеть, что мы сохранили наши данные.

eyberg@box:~/stateful-services$ curl -XGET http://34.83.134.230/savelog
logged
eyberg@box:~/stateful-services$ curl -XGET http://34.83.134.230/savelog
logged
eyberg@box:~/stateful-services$ curl -XGET http://34.83.134.230/savelog
logged
eyberg@box:~/stateful-services$ curl -XGET http://34.83.134.230/getlog
test
test
test

Теперь давайте остановим экземпляр — не прекратим его, а остановим. Вот где традиционные нативные решения в облаке и другие варианты без серверов, как правило, имеют проблемы. Они рассматривают бегущее изображение как эфемерное и никогда не возвращаются. Однако для таких нативных приложений облака, как Unikernels, это просто не так. Все, что мы делаем, это говорите Google просто остановить экземпляр, а не убить его. Это хорошо, если вы хотите сказать кашель Облачная нативная база данных кашель .

Мы можем пойти дальше и остановить экземпляр, а затем перезапустить его.

eyberg@box:~/stateful-services$ ops instance stop -p my-project -z us-west1-b node-image-1573676028
Instance stopping started. Monitoring operation operation-1573676572018-5974021110877-37b0f038-95aa93d0.
.............................................................
eyberg@box:~/stateful-services$ ops instance list -p my-project -z us-west1-b
+----------------------------------+------------+-------------------------------+-------------+---------------+
|               NAME               |   STATUS   |            CREATED            | PRIVATE IPS |  PUBLIC IPS   |
+----------------------------------+------------+-------------------------------+-------------+---------------+
| node-image-1573676028            | TERMINATED | 2019-11-13T12:13:50.106-08:00 | 10.240.0.50 |               |
+----------------------------------+------------+-------------------------------+-------------+---------------+
| releases-150719-14-07-1563179925 | TERMINATED | 2019-07-15T01:38:47.354-07:00 | 10.240.0.9  | 35.233.232.59 |
+----------------------------------+------------+-------------------------------+-------------+---------------+
eyberg@box:~/stateful-services$ ops instance start -p my-project -z us-west1-b node-image-1573676028
Instance started. Monitoring operation operation-1573676869968-5974032d363e0-d0a18a2c-0d56186d.
...
Operation operation-1573676869968-5974032d363e0-d0a18a2c-0d56186d completed successfully.
Instance started node-image-1573676028.
eyberg@box:~/stateful-services$ ops instance list -p my-project -z us-west1-b
+----------------------------------+------------+-------------------------------+-------------+---------------+
|               NAME               |   STATUS   |            CREATED            | PRIVATE IPS |  PUBLIC IPS   |
+----------------------------------+------------+-------------------------------+-------------+---------------+
| node-image-1573676028            | RUNNING    | 2019-11-13T12:13:50.106-08:00 | 10.240.0.50 | 34.82.108.88  |
+----------------------------------+------------+-------------------------------+-------------+---------------+
| releases-150719-14-07-1563179925 | TERMINATED | 2019-07-15T01:38:47.354-07:00 | 10.240.0.9  | 35.233.232.59 |
+----------------------------------+------------+-------------------------------+-------------+---------------+
eyberg@box:~/stateful-services$ curl -XGET http://34.82.108.88/getlog
test
test
test
test
test

Ура — ваши данные все еще там. Это именно то, что вы бы увидели в традиционной среде Linux, но теперь вы получаете выгоду от атмосферы, подобной контейнеру/без сервера.

Вы заметите, что к IP может измениться, поскольку к нему нет упругого/статического IP -адреса — это нормально и ожидается. Если вы на самом деле развернули в Prod, вы можете назначить один или затопить это за балансировщиком нагрузки.

Если вы новичок в этом стиле инфраструктуры, стоит указать на несколько вещей. Эти экземпляры не являются экземплярами Linux — так как у них вообще нет ядра Linux. У них нет концепции имен пользователей/паролей. Вы не можете войти в них, и они не могут запустить более одной программы на экземпляр. Это все по дизайну, чтобы сделать их быстрее, более безопасными и проще в управлении, чем существующие варианты.

Это был просто быстрый и грязный пример, чтобы показать вам основные концепции, лежащие в основе идеи состояния без сервера. Никаких серверов, с которыми нужно иметь дело, но вы можете сохранить свой государственный торт и съесть его тоже.

Что вы будете развернуть?

Оригинал: «https://dev.to/eyberg/stateful-serverless-with-unikernels-4ma7»