Самый быстрый способ развернуть приложение Go в Kubernetes

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

В этой статье мы будем использовать Encore Infrastructure SDK , чтобы декларативно определить инфраструктуру, необходимую нашему бэкэнду Go, а затем использовать Encore для автоматического выделения нашего кластера Kubernetes вместе с другой инфраструктурой. прямо в нашем облачном аккаунте.Ваш код можно будет развернуть как в GCP, так и в AWS, а Encore подготовит ваш кластер с помощью GKE или EKS Fargate, в зависимости от того, какое облако вы выберете.

При желании вы также можете выполнить развертывание с использованием бессерверных вычислительных экземпляров, не меняя ни строчки кода. Это отлично подходит для создания дешевых и простых в использовании тестовых сред.

Установите Encore

Установите Encore CLI для запуска локальной среды:

  • macOS: brew install encoredev/tap/encore
  • Linux: curl -L https://encore.dev/install.sh | bash
  • Windows: iwr https://encore.dev/install.ps1 | iex

Создайте свое приложение

Для простоты объяснения того, как работает Encore, мы собираемся клонировать готовое приложение из репозитория шаблонов Encore . Это простой монолит, реализующий сокращатель URL-адресов. Приложение имеет REST API и базу данных PostgreSQL.

Установите его, запустив:

encore app create my-app-name --example=url-shortener

Запуск локально

Чтобы запустить приложение локально, убедитесь, что у вас установлен и работает Docker . Это необходимо для запуска приложений Encore с базами данных SQL.

Затем просто запустите:

encore run

Вы должны увидеть это:

Описание изображения

Попробуйте API

Затем сделайте запрос в свою конечную точку:

curl http://localhost:4000/url -d '{"URL": "https://encore.dev"}'

Вы должны увидеть это:

{
  "ID": "5cJpBVRp",
  "URL": "https://encore.dev"
}

Откройте панель разработчика.

Во время encore run работы откройте http://localhost:9400/ , чтобы просмотреть локальную панель разработчика Encore .

Здесь вы можете просмотреть документацию по API, использовать API через проводник API и просмотреть трассировки с помощью встроенной распределенной трассировки Encore.

Взгляните на код

Это приложение теперь работает локально, без какой-либо ручной работы по настройке локального экземпляра Kubernetes, и мы собираемся развернуть его в нашей облачной учетной записи. Итак, как это работает?

Давайте посмотрим на код.👇

package url

import (
    "context"
    "crypto/rand"
    "encoding/base64"

    "encore.dev/storage/sqldb"
)

type URL struct {
    ID  string // short-form URL id
    URL string // complete URL, in long form
}

type ShortenParams struct {
    URL string // the URL to shorten
}

// Shorten shortens a URL.
//
//encore:api public method=POST path=/url
func Shorten(ctx context.Context, p *ShortenParams) (*URL, error) {
    id, err := generateID()
    if err != nil {
        return nil, err
    } else if err := insert(ctx, id, p.URL); err != nil {
        return nil, err
    }
    return &URL{ID: id, URL: p.URL}, nil
}

// Get retrieves the original URL for the id.
//
//encore:api public method=GET path=/url/:id
func Get(ctx context.Context, id string) (*URL, error) {
    u := &URL{ID: id}
    err := sqldb.QueryRow(ctx, `
        SELECT original_url FROM url
        WHERE id = $1
    `, id).Scan(&u.URL)
    return u, err
}

type ListResponse struct {
    URLs []*URL
}

// List retrieves all URLs.
//
//encore:api public method=GET path=/url
func List(ctx context.Context) (*ListResponse, error) {
    rows, err := sqldb.Query(ctx, `
        SELECT id, original_url FROM url
    `)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    urls := []*URL{}
    for rows.Next() {
        var u URL
        if err := rows.Scan(&u.ID, &u.URL); err != nil {
            return nil, err
        }
        urls = append(urls, &u)
    }

    if err := rows.Err(); err != nil {
        return nil, err
    }
    return &ListResponse{URLs: urls}, nil
}

// generateID generates a random short ID.
func generateID() (string, error) {
    var data [6]byte // 6 bytes of entropy
    if _, err := rand.Read(data[:]); err != nil {
        return "", err
    }
    return base64.RawURLEncoding.EncodeToString(data[:]), nil
}

// insert inserts a URL into the database.
func insert(ctx context.Context, id, url string) error {
    _, err := sqldb.Exec(ctx, `
        INSERT INTO url (id, original_url)
        VALUES ($1, $2)
    `, id, url)
    return err
}

Как вы можете видеть, здесь нет конфигурации Kubernetes или другой конфигурации инфраструктуры. Это все код Go и почти только бизнес-логика.

Мы просто определили конечную точку API с помощью аннотации //encore:api и импортировали encore.dev/storage/sqldb пакет.

Во время компиляции Encore анализирует код, чтобы понять, каковы требования к инфраструктуре для запуска приложения, а затем генерирует необходимый шаблонный код.

При локальном запуске CLI заботится о настройке локальных версий инфраструктуры, а в облаке Encore предоставляет необходимые вам облачные сервисы на основе ваших параметров конфигурации при создании среды. Теперь давайте продолжим и сделаем именно это!

Подключите свой облачный аккаунт

Сначала нам нужно подключить облачный аккаунт к Encore. Сделайте это с помощью облачной панели управления > (выберите свое приложение) > Настройки приложения > Интеграции > Подключить облако .

AWS

Если вы используете AWS, следуйте инструкциям на странице, чтобы создать роль IAM, а затем подключите эту роль к Encore.

В целях вашей безопасности обязательно проверьте Require external ID и укажите внешний идентификатор, указанный в инструкции.

Подключите AWS

GCP

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

Organization account Примечание. Чтобы создавать учетные записи служб, вам необходим GCP .

Подключить ГПК

Создать среду

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

На этой странице вы можете настроить:

  • В каком облаке выполнить развертывание (выберите то, к которому вы подключаете свою учетную запись)
  • Регион (выберите тот, который вам больше нравится)
  • Вычислительный экземпляр (выберите Kubernetes)
  • Распределение процессов (Выберите All processes in one service)

Затем нажмите «Создать» , чтобы сохранить среду.💾

Создать среду

Наконец, давайте убедимся, что только что созданная среда установлена ​​в качестве цели развертывания по умолчанию:

  • Зайдите в раздел «Основные» в меню настроек приложения.
  • В разделе «Основная среда» выберите только что созданную среду и нажмите «Обновить» .

Теперь мы готовы к развертыванию!✨

Развертывание в Kubernetes

Прежде чем нажать кнопку, помните: Encore предоставит в вашей учетной записи реальный работающий кластер Kubernetes, а также передовые меры безопасности. Это означает, что развертывание повлечет за собой расходы на вашем аккаунте.

Чтобы развернуть приложение и создать новый кластер Kubernetes, просто запустите:

$ git add -A .
$ git commit -m 'Initial commit'
$ git push encore

Теперь Encore создаст и протестирует ваше приложение, предоставит необходимую инфраструктуру, включая кластер Kubernetes и кластер базы данных, а также развернет ваше приложение в облаке.🚀

После запуска развертывания вы увидите URL-адрес, по которому можно просмотреть ход выполнения на облачной панели управления Encore.

Это будет выглядеть примерно так:https://app.encore.dev/$APP_ID/deploys/...

Отсюда вы также можете просмотреть метрики, трассировки и подключить свою учетную запись GitHub.

Теперь у вас есть полноценный Go-бэкенд, работающий в Kubernetes!

Примечание. Если вы хотите контролировать расходы, вам следует удалить все созданные ресурсы, если вы не хотите продолжать использовать новый кластер. Это легко сделать с консоли вашего облачного провайдера.

Отличная работа – все готово!

Теперь у вас есть начало масштабируемого бэкенда Go, работающего в Kubernetes.