Как установить и использовать Linkerd в Kubernetes

Установка и использование linkerd в kubernetes

Service mesh – это выделенный уровень инфраструктуры, который помогает обрабатывать связь между сервисами. Service mesh поддерживает множество мощных инструментов и может сделать вашу систему более безопасной и отказоустойчивой.

Читайте также: Введение в service mesh: основные функции и преимущества

Например, service mesh под названием Linkerd может автоматически шифровать соединения, обрабатывать повторные запросы и тайм-ауты, а также предоставит вам телеметрию (коэффициент успешности, задержки) и многое другое.

В этом руководстве вы узнаете, как установить Linkerd в своем кластере Kubernetes и развернуть тестовое приложение. Также мы рассмотрим панель управления Linkerd. Ознакомившись с основными функциями панели, мы настроим в Linkerd принудительное применение политик timeout и retry для определенного модуля Kubernetes.

Требования

  • Кластер Kubernetes 1.12+. В этом мануале мы используем кластер из трех нод.
  • Инструмент командной строки kubectl на сервере разработки. У kubectl должен быть доступ к вашему кластеру. Инструкции по установке вы найдете в официальной документации kubectl.

1: Развертывание приложения

Чтобы увидеть Linkerd в действии, нам нужно тестовое приложение, запущенное в нашем кластере. На этом этапе мы развернем приложение под названием emojivoto, разработанное командой Linkerd как раз для таких целей.

В репозитории приложения вы можете увидеть код для четырех сервисов, а также манифест, который поможет вам развернуть эти сервисы в кластере Kubernetes.

Сначала сохраните этот манифест локально:

curl https://run.linkerd.io/emojivoto.yml --output manifest.yaml

Мы извлекаем файл с помощью утилиты curl, а затем передаем ей параметр –output, чтобы указать расположение, где нужно сохранить файл. В этом случае мы создадим файл manifest.yaml.

Чтобы узнать, что будет делать этот файл, просмотрите его содержимое с помощью cat или откройте его в текстовом редакторе:

cat manifest.yaml | less

Нажмите пробел, чтобы пролистать содержимое файла. Вы увидите, что manifest.yaml создает пространство имен Kubernetes под названием emojivoto, в котором будет работать все, что связано с этим приложением, а также несколько развертываний и сервисов Kubernetes.

Затем запустите этот манифест в своем кластере Kubernetes:

kubectl apply -f manifest.yaml

Команду kubectl apply мы используем с флагом -f, чтобы задать файл, который нужно применить.

Эта команда выведет на экран список всех созданных ресурсов:

namespace/emojivoto created

serviceaccount/emoji created

serviceaccount/voting created

serviceaccount/web created

service/emoji-svc created

service/voting-svc created

service/web-svc created

deployment.apps/emoji created

deployment.apps/vote-bot created

deployment.apps/voting created

deployment.apps/web created

Теперь убедитесь, что сервисы запущены:

kubectl -n emojivoto get pods

Команда kubectl выводит список всех модулей, запущенных в вашем кластере, а флаг –n позволяет указать, какие пространства имен вы хотите использовать. Мы указываем пространство имен emojivoto, потому что именно там мы запускаем все эти сервисы.

Когда все поды находятся в состоянии Running, приложение готово:

NAME                        READY   STATUS    RESTARTS   AGE

emoji-566954596f-cw75b      1/1     Running   0          24s

vote-bot-85c5f5699f-7dw5c   1/1     Running   0          24s

voting-756995b6fc-czf8z     1/1     Running   0          24s

web-7f7b69d467-2546n        1/1     Running   0          23s

Чтобы увидеть, как приложение работает в браузере, можно воспользоваться встроенной функцией kubectl для перенаправления локальных запросов в удаленный кластер:

kubectl -n emojivoto port-forward svc/web-svc 8080:80

Примечание: Если вы запускаете эту команду не на локальном компьютере, вам нужно добавить флаг –address 0.0.0.0, чтобы прослушивать все адреса, а не только localhost.

Здесь мы снова используем kubectl в пространствах имен emojivoto, но теперь мы вызываем подкоманду port-forward для пересылки всех локальных запросов с порта 8080 на порт 80 сервиса Kubernetes web-svc. Это удобный способ получить доступ к приложению без настройки балансировщика нагрузки.

Теперь посетите http://localhost:8080, и вы увидите приложение emojivoto.

Нажмите CTRL+C в своем терминале. Теперь, когда в кластере запущено приложение, мы готовы установить Linkerd и посмотреть, как он работает.

2: Установка Linkerd

Теперь, когда приложение запущено, давайте установим Linkerd. Чтобы установить его в кластер Kubernetes, нам сначала понадобится Linkerd CLI. Этот интерфейс командной строки мы будем использовать для взаимодействия с Linkerd с вашего локального компьютера. После этого мы сможем установить Linkerd в свой кластер.

Сначала давайте установим интерфейс командной строки с помощью сценария, предоставленного командой Linkerd:

curl https://run.linkerd.io/install | sh

curl загружает сценарий установки, а затем вывод отправляется в команду sh, которая автоматически выполняет полученный сценарий. Также вы можете загрузить CLI прямо с этой страницы Linkerd.

Если вы используете сценарий, он установит Linkerd в ~/.linkerd2/bin. Теперь убедитесь, что CLI работает правильно:

~/.linkerd2/bin/linkerd version

Команда выведет примерно такой результат:

Client version: stable-2.7.1

Server version: unavailable

Затем, чтобы упростить запуск CLI, добавьте этот каталог в $PATH:

export PATH=$PATH:$HOME/.linkerd2/bin

Теперь запускать команды можно напрямую:

linkerd version

Пора установить Linkerd в вашем кластере Kubernetes. Команда linkerd install используется для создания всех манифестов yaml, необходимых для запуска Linkerd, но она не применяет эти манифесты к кластеру. Запустите эту команду, чтобы изучить ее вывод:

linkerd install

Вы увидите длинный вывод, в котором перечислены все манифесты yaml для ресурсов, необходимых для запуска Linkerd. Чтобы применить эти манифесты к вашему кластеру, запустите:

linkerd install | kubectl apply -f -

Запуск этой команды выведет все манифесты, которые вы видели ранее. Символ | затем направляет этот вывод в команду kubectl apply, которая применяет их.

После этого kubectl apply выведет список всех созданных ресурсов.

Чтобы убедиться, что в вашем кластере все работает, используйте команду linkerd check:

linkerd check

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

kubernetes-api

--------------

√ can initialize the client

√ can query the Kubernetes API

[...]

control-plane-version

---------------------

√ control plane is up-to-date

√ control plane and cli versions match

Status check results are √

Запустите следующую команду, чтобы открыть встроенную панель управления Linkerd в браузере (помните, что вам нужно добавить флаг –address 0.0.0.0, если вы запускаете ее не на локальном компьютере):

linkerd dashboard

Большую часть информации, которую вы видите на панели инструментов, вы можете получить с помощью Linkerd CLI. Например, запустите эту команду, чтобы увидеть развертывание статистики высокого уровня:

linkerd stat deployments -n linkerd

Эта команда выведет статистику развертываний, запущенных в пространстве имен linkerd. Это компоненты Linkerd – и, что интересно, вы можете использовать для их мониторинга сам Linkerd. С его помощью можно собрать статистику, такую ​​как количество запросов в секунду (RPS), коэффициент успеха, задержку и многое другое. Обратите внимание на столбец Meshed, в котором указано, сколько подов внедрил Linkerd:

NAME                     MESHED   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONN

linkerd-controller          1/1   100.00%   0.4rps           1ms          87ms          98ms          5

linkerd-destination         1/1   100.00%   0.3rps           1ms           2ms           2ms         13

linkerd-grafana             1/1   100.00%   0.3rps           2ms           3ms           3ms          2

linkerd-identity            1/1   100.00%   0.3rps           1ms           2ms           2ms         10

linkerd-prometheus          1/1   100.00%   0.7rps          35ms         155ms         191ms          9

linkerd-proxy-injector      1/1   100.00%   0.3rps           2ms           3ms           3ms          2

linkerd-sp-validator        1/1   100.00%   0.3rps           1ms           5ms           5ms          2

linkerd-tap                 1/1   100.00%   0.3rps           1ms           4ms           4ms          6

linkerd-web                 1/1   100.00%   0.3rps           1ms           2ms           2ms          2

Теперь попробуйте эту команду в своем пространстве имен emojivoto:

linkerd stat deployments -n emojivoto

Вы можете видеть здесь свои четыре сервиса, но никакие статистические данные, которые вы видели ранее, недоступны для этих развертываний, и в столбце Meshed вы можете увидеть значение 0/1:

NAME       MESHED   SUCCESS   RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONN

emoji         0/1         -     -             -             -             -          -

vote-bot      0/1         -     -             -             -             -          -

voting        0/1         -     -             -             -             -          -

web           0/1         -     -             -             -             -          -

Такой вывод означает, что вы еще не внедрили Linkerd в приложение. Этим мы займемся в следующем разделе.

3: Внедрение Linkerd в приложение

Linkerd запущен в кластере, и теперь мы готовы внедрить его в приложение emojivoto.

Linkerd работает путем запуска контейнера sidecar в модулях Kubernetes. То есть он вставляет легкий прокси-контейнер linkerd в каждый запущенный модуль. Каждый запрос, который затем отправляют или получают модули, будет проходить через этот прокси-сервер, и он сможет собирать метрики (например, коэффициент успешности, количество запросов в секунду и так далее) и применять политики.

Вы можете внедрить прокси Linkerd вручную с помощью этой команды:

kubectl get deployments -n emojivoto -o yaml | linkerd inject - | kubectl apply -f -

Сначала команда kubectl get получает все развертывания Kubernetes, которые у вас запущены в пространстве имен emojivoto; затем мы указываем, что хотим получить вывод в формате yaml. Этот вывод отправляется команде linkerd inject. Она файл yaml с текущими запущенными манифестами и изменит его, чтобы включить прокси-сервер linkerd в каждое развертывание.

Наконец, измененный манифест применяется к кластеру с помощью kubectl apply.

После выполнения этой команды вы увидите сообщение о том, что все четыре сервиса emojivoto (emoji, vote-bot, voting и web) были успешно внедрены.

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

linkerd stat deployments -n emojivoto

Здесь вы можете увидеть статистику для всех четырех сервисов, составляющих приложение emojivoto, без необходимости писать или изменять какой-либо код приложения.

NAME       MESHED   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONN

emoji         1/1   100.00%   1.9rps           1ms           2ms           2ms          2

vote-bot      1/1         -        -             -             -             -          -

voting        1/1    85.96%   0.9rps           1ms           1ms           1ms          2

web           1/1    93.04%   1.9rps           8ms          27ms          29ms          2

Сервис vote-bot не показывает никакой статистики, потому что это просто бот, который отправляет запросы другим сервисам и, следовательно, не получает никакого трафика, что само по себе является ценной информацией.

Теперь давайте посмотрим, как предоставить Linkerd дополнительную информацию о сервисах, чтобы настроить их поведение.

4: Определение профиля сервиса

Теперь, когда вы внедрили Linkerd в свое приложение, вы можете начать получать ценную информацию о том, как работает каждый ваш сервис. Более того, вы добились этого без необходимости настраивать какие-либо пользовательские конфигурации или изменять код вашего приложения. Однако если вы предоставите Linkerd некоторую дополнительную информацию, он сможет применять свои многочисленные политики, а также предоставлять метрики для каждого маршрута.

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

Вот пример манифеста такого профиля:

apiVersion: linkerd.io/v1alpha2

kind: ServiceProfile

metadata:

  name: my-service.my-namespace.svc.cluster.local

spec:

  routes:

  - name: My Route Name

    isRetryable: true # Define it's safe to retry this route

    timeout: 100ms # Define a timeout for this route

    condition:

      method: GET

      pathRegex: /my/route/path

Профиль сервиса описывает список маршрутов, а затем определяет, как будут вести себя запросы, соответствующие указанному условию (condition). В этом примере каждый запрос GET, отправленный в /my/route/path, будет истекать через 100 мс, а если запрос не удалось обработать, его можно повторить.

Давайте теперь создадим профиль для одного из ваших сервисов. В качестве примера возьмем voting-svc, сначала используйте Linkerd CLI, чтобы проверить маршруты, которые вы определили для этого сервиса:

linkerd routes svc/voting-svc -n emojivoto

Здесь вы используете команду linkerd routes для вывода списка всех маршрутов сервиса voice-svc в пространстве имен emojiovoto:

ROUTE          SERVICE   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99

[DEFAULT]   voting-svc    83.05%   1.0rps           1ms           1ms           2ms

Вы найдете только один маршрут, [DEFAULT]. Все запросы группируются здесь, пока вы не определите профиль сервиса.

Теперь откройте nano или другой редактор, чтобы создать файл service-profile.yaml:

nano service-profile.yaml

Добавьте в этот файл следующее определение профиля:

apiVersion: linkerd.io/v1alpha2

kind: ServiceProfile

metadata:

  name: voting-svc.emojivoto.svc.cluster.local

  namespace: emojivoto

spec:

  routes:

  - name: VoteDoughnut

    isRetryable: true

    timeout: 100ms

    condition:

      method: POST

      pathRegex: /emojivoto.v1.VotingService/VoteDoughnut

Теперь сохраните файл и закройте редактор.

Здесь мы объявили профиль для сервиса voting-svc в пространстве имен emojivoto. Мы определили один маршрут, VoteDoughnut, который сопоставляет любой POST-запрос с путем /emojivoto.v1.VotingService/VoteDoughnut. Если обработка запроса, соответствующий этим критериям, занимает более 100 мс, Linkerd отменит его, и клиент получит ответ 504. Если этот запрос не выполняется, Linkerd сможет его повторить.

Теперь примените этот файл к своему кластеру:

kubectl apply -f service-profile.yaml

Через несколько секунд перепроверьте маршруты для этого сервиса:

linkerd routes svc/voting-svc -n emojivoto

И вы увидите свой недавно определенный маршрут VoteDoughnut:

ROUTE             SERVICE   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99

VoteDoughnut   voting-svc     0.00%   0.2rps           1ms           1ms           1ms

[DEFAULT]      voting-svc   100.00%   0.8rps           1ms           4ms           4ms

Вы можете увидеть несколько пользовательских метрик для этого конкретного маршрута, таких как коэффициент успешности, количество запросов в секунду и задержка. Обратите внимание, конечная точка VoteDoughnut намеренно настроена так, чтобы всегда возвращать ошибку, и она выдает показатель успеха 0%, в то время как маршрут [DEFAULT] выдает 100%.

Итак, предоставив Linkerd кое-какую информацию о вашем сервисе, вы получили пользовательские метрики для каждого маршрута, а также применили две политики.

Заключение

В этом мануале вы установили Linkerd в кластер Kubernetes и использовали его для мониторинга приложения. Вы извлекли полезную информацию: коэффициент успешности, пропускную способность и задержку. Также вы настроили профиль сервиса Linkerd для сбора метрик каждого маршрута и применили две политики в приложении emojivoto.

Если вам интересно узнать о Linkerd больше, вы можете просмотреть его прекрасную документацию, где вы найдете подробную информацию о том, как защитить свои сервисы, настроить распределенную трассировку, автоматизировать canary релизы и многое другое.

Tags: ,

Добавить комментарий