Как установить и использовать Linkerd в Kubernetes
Development | Комментировать запись
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: Kubernetes, Linkerd