Автор выбрал Tech Education Fund для получения пожертвования в рамках программы Write for DOnations.
Сервисная сеть — это отдельный уровень инфраструктуры, помогающий администраторам организовать взаимодействие между службами (сервисами). Сервисные сети предлагают много мощных инструментов и могут сделать систему более безопасной, надежной и прозрачной.
Linkerd и другие сервисные сети могут автоматически шифровать соединения, обрабатывать повторные запросы и случаи истечения времени запросов, предоставлять информацию телеметрии, в том числе сведения о проценте успешных запросов и времени задержки, и т. д.
В этом обучающем модуле мы установим сервисную сеть Linkerd в кластере Kubernetes, развернем приложение-образец и изучим панель управления Linkerd. Познакомившись с информацией о панели управления, мы настроим Linkerd для принудительного использования политик таймаута
и повторных запросов
для конкретного пода Kubernetes.
В качестве альтернативы вы можете изучить предлагаемую DigitalOcean возможность быстрой установки Linkerd/Kubernetes.
Кластер Kubernetes 1.12+. В этом обучающем модуле будет использоваться кластер DigitalOcean Kubernetes с тремя узлами, но вы можете создать кластер с помощью другого метода.
Инструмент командной строки kubectl
, установленный на сервере разработки и настроенный для подключения к вашему кластеру. Дополнительную информацию об установке kubectl
можно найти в официальной документации.
Чтобы увидеть работу 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
, чтобы назначить файл, который мы хотим применить.
Эта команда выводит список всех созданных ресурсов.
Outputnamespace/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
(Работает), можете продолжать:
OutputNAME 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
службе Kubernetes web-svc
на порту 80
. Это удобный способ доступа к приложению без подходящего балансировщика нагрузки.
Откройте адрес http://localhost:8080
, и вы увидите приложение emojivoto.
Нажмите CTRL + C
в своем терминале. Мы запустили приложение в кластере и теперь можем установить Linkerd и посмотреть на его работу.
Мы запустили приложение и можем переходить к установке Linkerd. Для его установки в кластер Kubernetes нам вначале потребуется интерфейс командной строки Linkerd. Мы будем использовать этот интерфейс командной строки для взаимодействия с Linkerd с вашего локального компьютера. После этого вы можете установить Linkerd в кластер.
Вначале установим интерфейс командной строки с помощью скрипта, предоставленного командой Linkerd:
- curl https://run.linkerd.io/install | sh
Здесь мы используем curl
для загрузки установочного скрипта и перенаправляем вывод в sh
, где скрипт автоматически выполняется. Также можно загрузить интерфейс командной строки напрямую со страницы релизов Linkerd.
Если вы используете скрипт, он установит Linkerd в каталог ~/.linkerd2/bin
. Проверьте работу интерфейса командной строки:
- ~/.linkerd2/bin/linkerd version
Команда выведет примерно следующее:
OutputClient version: stable-2.7.1
Server version: unavailable
Чтобы упростить запуск интерфейса командной строки, добавьте этот каталог в переменную $PATH
:
- export PATH=$PATH:$HOME/.linkerd2/bin
Теперь вы можете напрямую запускать такие команды, как показанная выше:
- linkerd version
В заключение установим Linkerd в кластер Kubernetes. Команда linkerd install
используется для генерирования всех необходимых манифестов yaml
для запуска Linkerd, но эти манифесты не будут использоваться для вашего кластера. Запустите эту команду для проверки ее вывода:
- linkerd install
Вы увидите длинный список всех манифестов yaml для ресурсов, которые Linkerd требуется запустить. Чтобы применить эти манифесты на своем кластере, выполните следующую команду:
- linkerd install | kubectl apply -f -
При запуске команды linkerd install
будут выведены все манифесты, которые вы видели ранее. Затем |
передает вывод в команду kubectl apply
, которая применяет их напрямую.
После запуска этой команды kubectl apply
выведет список всех созданных ресурсов.
Чтобы убедиться, что в кластере запущено все необходимое, выполните команду linkerd check
:
- linkerd check
На кластере будет проведено несколько проверок для подтверждения запуска всех необходимых компонентов:
Outputkubernetes-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. Например, следующая команда позволяет посмотреть детальную статистику развертывания:
- linkerd stat deployments -n linkerd
В этой команде вы указываете, что хотите посмотреть статистику развертываний в пространстве имен linkerd
. Это собственные компоненты Linkerd и, что интересно, вы можете отслеживать их с помощью Linkerd. Вы можете посмотреть такие параметры как количество запросов в секунду (RPS), процент успешных запросов, время задержки и т. д. В столбце Meshed
показано, сколько подов
было вставлено Linkerd:
OutputNAME 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
:
OutputNAME 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 в приложение. Мы сделаем это на следующем шаге.
Мы запустили Linkerd в нашем кластере и теперь можем вставить его в наше приложение emojivoto
.
Linkerd работает через контейнер sidecar в подах
Kubernetes. Это означает, что мы вставим контейнер linkerd proxy в каждый выполняемый под
. Каждый запрос, отправляемый или принимаемый подами
будет проходить через этот компактный прокси-контейнер, который собирает данные о параметрах (процент успешных запросов, количество запросов в секунду, время задержки и т. д.) и принудительно внедряет политики (таймауты, повторы и т. д.).
Вы можете вставить прокси-контейнер 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
, вы увидите, что все развертывания
указаны в столбце Meshed, и через несколько секунд вы увидите те же параметры, которые отображались для пространства имен linkerd
:
- linkerd stat deployments -n emojivoto
Здесь вы видите статистические параметры всех четырех служб, составляющих приложение emojivoto
с указанием процента успешных запросов, количества запросов в секунду и времени задержки, и при этом вам не потребовалось писать или изменять код приложения.
OutputNAME 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 дополнительную информацию о службах для настройки их поведения.
Мы вставили 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
Профиль службы описывает список маршрутов и определяет поведение при запросах, соответствующих заданному условию
. В этом примере мы указываем, что каждый запрос GET
, отправляемый на путь /my/route/path
, будет истекать по таймауту через 100 мс, и что в этом случае возможен повторный запрос.
Создадим профиль для одной из ваших служб. Возьмем в качестве примера службу voting-svc
и для начала используем интерфейс командной строки Linkerd для проверки маршрутов, определенных для этой службы:
- linkerd routes svc/voting-svc -n emojivoto
Здесь мы используем команду linkerd routes
для перечисления всех маршрутов службы voting-svc
в пространстве имен emojiovoto
:
OutputROUTE 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
, который мы только что задали:
OutputROUTE 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 и его использовании для мониторинга приложения-образца. Мы получили полезные данные телеметрии, такие как процент успешных запросов, пропускная способность и время задержки. Также мы настроили профиль службы для сбора показателей каждого маршрута и принудительного внедрения двух политик в приложении emojivoto
.
Если вы хотите узнать больше о Linkerd, воспользуйтесь полезной страницей документации, где можно найти инструкции по защите служб, настройке распределенной трассировки, автоматическому выпуску canary и т. д.
Также вы можете познакомиться с Istio, другой сервисной сетью с другим набором функций и другими особенностями.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!