Как запустить экземпляр Google Cloud с изображением контейнера из клиента Node.JS? - PullRequest
0 голосов
/ 11 ноября 2019

Я хочу запустить экземпляр vm с изображением контейнера из облачной функции Google в Node.JS.

Я не могу понять, как вызвать функцию createVM с указанным изображением контейнера.

const [vm, operation] = await zone.createVM(vmName, {os: 'ubuntu'});

Я не вижу этого нигде в документации https://googleapis.dev/nodejs/compute/latest/index.html

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Насколько я понимаю, вы хотите получить в итоге новый экземпляр GCP Compute Engine, работающий под управлением оптимизированной для контейнера ОС (COS), которая запускает Docker, который создает экземпляр контейнера из образа контейнера, размещенного в репозитории. Для достижения этой цели вы также хотите использовать API-интерфейс Node.JS.

Хитрость (для меня) заключается в создании экземпляра Compute Engine вручную через облачную консоль GCP. После этого мы можем войти в экземпляр и получить необработанные метаданные, выполнив:

wget --output-document=- --header="Metadata-Flavor: Google" --quiet http://metadata.google.internal/computeMetadata/v1/?recursive=true

В результате мы получим JSON-представление этих метаданных. Отсюда мы находим, что наша реальная цель в создании желаемого Compute Engine через API - создать этот Compute Engine с использованием стандартного API, а затем определить необходимые метаданные. Похоже, что оптимизированная для контейнера ОС просто имеет скрипт / программу, которая читает метаданные и использует их для запуска Docker.

Когда я исследовал данные для контейнера, работающего в Compute Engine, я обнаружил атрибут с именем:

attribute.gce-container-объявление

Содержит:

"spec:\n  containers:\n    - name: instance-1\n      image: nodered/node-red\n      stdin: false\n      tty: false\n  restartPolicy: Always\n\n# This container declaration format is not public API and may change without notice. Please\n# use gcloud command-line tool or Google Cloud Console to run Containers on Google Compute Engine."

, что является YAML, и если мы отформатируем его красиво, мы найдем:

spec:
containers:
- name: instance-1
  image: nodered/node-red
  stdin: false
  tty: false
restartPolicy: Always

# This container declaration format is not public API and may change without notice. Please
# use gcloud command-line tool or Google Cloud Console to run Containers on Google Compute Engine.

И у нас это есть. Чтобы создать GCP Compute Engine, содержащий образ контейнера, мы должны создать образ контейнера с ОС, оптимизированной для работы с контейнерами (например, «image»: «projects / cos-cloud / global / images / cos-stable-77-12371-114-0 ") и установите метаданные, чтобы определить контейнер для запуска.

0 голосов
/ 11 ноября 2019

При создании экземпляра в консоли Google Cloud я смог скопировать эквивалентную команду REST, взять JSON и вставить ее в конфигурацию SDK Google Cloud Compute Node.js.

const Compute = require('@google-cloud/compute');

  // Creates a client
  const compute = new Compute();


  // Create a new VM using the latest OS image of your choice.
  const zone = compute.zone('us-east1-d');
// The above object will auto-expand behind the scenes to something like the
// following. The Debian version may be different when you run the command.
//-
const config = 
{
  "kind": "compute#instance",
  "name": "server",
  "zone": "projects/projectName/zones/us-east1-d",
  "machineType": "projects/projectName/zones/us-east1-d/machineTypes/f1-micro",
  "displayDevice": {
    "enableDisplay": false
  },
  "metadata": {
    "kind": "compute#metadata",
    "items": [
      {
        "key": "gce-container-declaration",
        "value": "spec:\n  containers:\n    - name: game-server\n      image: gcr.io/projectName/imageName\n      stdin: false\n      tty: false\n  restartPolicy: Never\n\n# This container declaration format is not public API and may change without notice. Please\n# use gcloud command-line tool or Google Cloud Console to run Containers on Google Compute Engine."
      },
      {
        "key": "google-logging-enabled",
        "value": "true"
      }
    ]
  },
  "tags": {
    "items": [
      "https-server"
    ]
  },
  "disks": [
    {

      ... //Copied from Google Cloud console -> Compute Engine -> Create VM Instance -> copy equivalent REST command (at the bottom of the page)

  ]
};

//-
// If the callback is omitted, we'll return a Promise.
//-
zone.createVM('new-vm-name', config).then(function(data) {
  const vm = data[0];
  const operation = data[1];
  const apiResponse = data[2];
  res.status(200).send(apiResponse);
});
...