Pull to refresh

Как завести инстансы в Google Cloud, настроить доступы и подцепить к нему Bucket Google. Howto

Reading time 7 min
Views 34K
Добра всем читающим!
Этот хау-ту размещаю по горячим следам с целью, во-первых, не забыть как делать, а во-вторых, с целью помочь кому-либо создавать инстансы в облаке Google.

Решаемые задачи:
  • три инстанса в разных регионах зоны Европа
  • общий диск для двух инстансов
  • балансировщик нагрузки по http
  • облачная база MySQL
  • из третьего инстанса выкладывать файлы в Bucket Google




Вопрос: «А почему cloud.google?» оставим на совести заказчика. Мопед был не мой, я только разбирался с новой для себя системой управления VPS. А предлагается там следующее (излагаю тезисно):
  • App Engine — Сервис для приложений и совместной работы с кодом. Кому интересно документация
  • Compute Engine — собственно VPS, диски к ним, файрволл(ы), баласировщики (про них дальше, до сих пор в недоумении почему их два), управление снапшотами и квотами
  • Networking — Cloud DNS от Google и VPN
  • Storage — облачное хранилищие, хранилище данных и облачный SQL (MySQL)
  • BigData — нечто сверхпростое и мне совершенно неясное


Воспользовался разделом Compute Engine, Storage, Networking, Storage.

1. Создание инстанса.
Разворачивать любую виртуальную машину начинаю с проектирования диска под нее. Ниже скрин:



На скриншоте открыты области, в которых можно создать диск. Нас интересует Европа. Обращаю внимание, указано что датацентр «a» в Европе будет закрыт. Пытливый читатель может поискать расположение центров b,c и d фактически, меня вопрос физического расположения волнует мало.

В моем аккаунте можно создать «Standard Persistent Disk» максимальным размером до 240 Gb. Примитивный тест скорости чтения/записи диска ниже:

sync; dd if=/dev/zero of=/tempfile bs=1M count=4096; sync && dd if=/tempfile of=/dev/null bs=1M count=4096 && /sbin/sysctl -w vm.drop_caches=3 && dd if=/tempfile of=/dev/null bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 112.806 s, 38.1 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 52.036 s, 82.5 MB/s
vm.drop_caches = 3
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 52.7394 s, 81.4 MB/s

Тип исходника для диска (Source Type): Image, Snapshot, Blank соответственно предустановленный образ ОС, из снапшота системы или пустой диск.



Лично меня интересовал Debian, кроме него Google предлагает развернуть CentOS, CoreOS, OpenSUSE, Ubuntu, RHEL, Sles и Windows Server 2008.

Создал диск на 10 Гб с Debian Wheezy в области «B» и «C» Europe. Потом в области «C» удалил. Задача состоит в том, чтобы развернуть рабочий сервер и сделать его зеркало. А раз так, то диск в области «C» будем разворачивать из снапшота диска в области «B».

Теперь создаем сам инстанс:



Список возможных (доступных мне) вариантов VPS, правда он прикрывает выбор вариантов файрволла дефолтных у google: HTTP Traffic и HTTPS Traffic



Отмечаем оба варианта, идем дальше — выбираем Exiting Disk и говорим какой из дисков подключить к машине. Надо сказать, что второй диск когда я цеплял к инстансу, то все было сделано «на горячую» — появился /dev/sdb, который я успешно разбил и примонтировал не перезагружая инстанс.

Кстати диск во время удаления инстанса можно удалить: необходимо выделить соответствующий пункт ниже выбора типа диска.

Раздел Networking при создании доступен только IP адрес — внутренняя сеть или прилепим белый IP.

Кстати, ISPanel до сих пор не понимает, что есть Amazon, Google и прочие сервисы, у которых не прописывается IP адрес в настройки сети. Установка и лицензирование панели усложняются ожиданием техподдержки или созданием виртуального интерфейса с нужным ISPanel адресом. Ну неудобно же!

Когда инстанс создан можно зайти в его настройки и увидеть:



И озадачится вопросом: «а как получить доступ по SSH?». Вот собственно я изучал предмет минут 30, вышло следующее:



В блоке управления SSH ключами вводится ключ, сгенерированый, например, PuttyGen.

а) Запускаем
б) нажимаем Generate
в) болтаем мышью
г)получаем ключ
д)меняем Key Comment на имя пользователя
е) Save public key
ж) Save private key — не защищаем паролем файл
з) Copy/Paste из окна в SSH Keys строку вида ssh-rsa ABRAKADABRA dmitry



Если мы прилепили белый IP, то можно идти авторизовываться именем пользователя в созданном инстансе (в Putty файл ключа указывается в настройках: Connection->SSH->Auth). А можно зайти в консоль через веб-интерфейс из гугла (вверху кнопка SSH). А еще наверное можно настроить VPN из соответствующего раздела для доступа к закрытому серверу, не пробовал.


2. Клонирование инстанса
Оказалось проще простого:
  • Compute Engine — New Snapshot
  • обзываем снапшот и выбираем нужный диск
  • Create


В дисках создаем новый диск из снапшота в нужном регионе и прикручиваем его к инстансу. На этом клонирование завершено. Заняло 10 минут.

3. Файрволл
Compute Engine -> Networks -> Default (Network) -> Firewall rules — New
При настройке файрволла руководствуемся здравым смыслом. Синтаксис простой.

Надо сказать, что Google Chrome чудил и минут 30 заводил и не завел ни одно правило. Спас Mozilla, однако заводить правило для файрволла реально долго, около 3 минут у меня заняло.


4. Балансировка нагрузки
Так и не понял чем отличается Network Load Balancing от HTTP Load Balancing. И там и там по-умолчанию тестируется http на 80 порт. Заводим новый балансер, выбираем инстансы, которые анализировать, присваиваем IP.
Более ничего не добавлю, все просто как киянка.


5. Cloud SQL
Чтобы создать облачный MySQL — инстанс, оптимизированный для баз данных — идем Storage -> Cloud SQL -> New. Я выбрал второй в списке: 1Gb ОЗУ, 250 Gb диск. Тестировали базу 800Мб — летает. Ну и с инстанса перенатравили ISPanel на «внешний» сервер MySQL.
Получить доступ к базам данных можно из PHP, Phyton, JAVA, console и тп. Приведу пример для PHP:
// Using PDO_MySQL (connecting from App Engine)
$db = new pdo('mysql:unix_socket=/cloudsql/<тут был ID>:<а тут имя Cloud SQL>'),
  'root',  // username
  ''       // password
);

// Using mysqli (connecting from App Engine)
$sql = new mysqli(
  null, // host
  'root', // username
  '',     // password
  '', // database name
  null,
  '/cloudsql/<тут был ID>:<а тут имя Cloud SQL>'
  );

// Using MySQL API (connecting from APp Engine)
$conn = mysql_connect(':/cloudsql/<тут был ID>:<а тут имя Cloud SQL>,
  'root', // username
  ''      // password
  );

И понаделать пользователей через спец.консоль.
И дать доступы с выбранных инстансов или IP адресов.



В консоли управления Cloud SQL через кнопку EDIT можно найти привычные настройки для my.cnf.




6. Цепляем Cloud Storage
По незнанию я создавал Bucket из веб-интерфейса, хотя проще бы было зайти в консоль сервера и создать оттуда. У Google есть API, который предустановлен в инстансах. Я воспользовался gsutil:

gsutil
Usage: gsutil [-D] [-DD] [-h header]... [-m] [-o] [-q] [command [opts...] args...]

Сначала нужно обновится:

gcloud components update

Авторизоваться:

root@host:~# gcloud auth login
You are running on a GCE VM. It is recommended that you use
service accounts for authentication.

You can run:

  $ gcloud config set account ``ACCOUNT''

to switch accounts if necessary.

Your credentials may be visible to others with access to this
virtual machine. Are you sure you want to authenticate with
your personal account?

Do you want to continue (Y/n)? y

Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?
Enter verification code:

Ссылка была на 10 строк, я ее немного сократил. По этой ссылке мы даем доступ от пользователя Google, получаем ID, который вбиваем в verification code:

Имеем доступ, в моем случае, к Bucket. Ну или можем создать:

:~# gsutil ls
gs://storage/

ИЛИ ниже создает Bucket

gsutil mb
CommandException: The mb command requires at least 1 argument. Usage:

  gsutil mb [-c class] [-l location] [-p proj_id] uri..

Смотрим что вышло
:~# gsutil ls gs://storage/
gs://storage/gcsfs_0.15-1_amd64.deb

Это я туда файлик закинул.

Можем синхронизировать Bucket и каталог системы:

gsutil rsync -d -r gs://zp-storage/ /usr/src

Ну и так далее и тому подобное.

Для того, чтобы примонтировать Bucket gs://zp-storage/ как каталог, необходимо воспользоваться парой сторонних утилит:

s3fuse — утилита, которая используется для аналогичных целей, например, для монтирования Amazon S3. Пишут, что с ее помощью можно монтировать Cloud Storage (google), но что-то я не нашел вразумительного конфига хотя бы с комментарием сего действа.

gcsfs — утилита, которая работает с Cloud Storage (google).

Из пакетов по зависимостям s3fuse не встала, собирал из исходников. Сборка идет ./configure && make && make install, а вот перечень зависимостей:

aptitude install mpi-default-bin mpi-default-dev libboost-all-dev povray libxml++2.6-2 libxml++2.6-dev libfuse-dev libfuse 

А вот gcsfs встал из пакета deb.

Необходимые изменения в conf-файлах для подключения Google Cloud Storage:

nano /etc/gcsfs.conf

bucket_name=<имя bucket-а>
service=google-storage
gs_token_file=/etc/gs.token

touch /etc/gs.token

gcsfs_gs_get_token /etc/gs.token


Последняя комманда запускает авторизацию через WEB по ссылке вида
accounts.google.com/o/oauth2/auth?client_idbLaBlABBBBLLLLAAAA

С получением authorization code, который необходимо ввести в строку для создания токена подключения к Storage.

:/etc# /usr/bin/gcsfs
Usage: gcsfs [options] <mountpoint>

Options:
  -f                   stay in the foreground (i.e., do not daemonize)
  -h, --help           print this help message and exit
  -o OPT...            pass OPT (comma-separated) to FUSE, such as:
     allow_other         allow other users to access the mounted file system
     allow_root          allow root to access the mounted file system
     default_permissions enforce permissions (useful in multiuser scenarios)
     gid=<id>            force group ID for all files to <id>
     config=<file>       use <file> rather than the default configuration file
     uid=<id>            force user ID for all files to <id>
  -v, --verbose        enable logging to stderr (can be repeated for more verbosity)
  -vN, --verbose=N     set verbosity to N
  -V, --version        print version and exit


монтирую так:

/usr/bin/gcsfs -o allow_other /<каталог>




Тут хаутушечке конец, кто открыл хоть один спойлер — молодец.

Большая просьба. Опираясь на предыдущий опыт написания на Habrahabre статей, прошу минусовать обоснованно. Иначе рискую никогда не понять в чем мои недочеты: в стиле изложения, в конкретике, в восприятии и изложении мной информации. За каждый коммент буду слать позитивные лучи.

UPD<12.03.2015>: Выяснилось что в инстансе Google Cloud закрыта отправка через 25 порт (и коннект к другому серверу по 25 порту). Совсем. Вместо этого предлагается использовать релейный почтовый сервер с отправкой по порту 587.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+9
Comments 5
Comments Comments 5

Articles