Предисловие
Что касается удаленной отладки golang-программ в k8s, то можно обратиться к использованию dlv. Однако недостатки этого метода также очевидны. Развернутую рабочую нагрузку необходимо пересоздавать и перераспределять, что также навязчиво для бизнеса и негибко. достаточно.
В этой статье представлен метод, который больше подходит для удаленной отладки бизнеса, развернутого в k8s. Этот метод также рекомендуется k8s в официальной документации: телеприсутствие.
https://github.com/telepresenceio/telepresence
1.Подготовка
телеприсутствие скачать
https://www.telepresence.io/docs/latest/install/
kubectl скачать
https://kubernetes.io/docs/tasks/tools/
2. Определение версии
$telepresence version
Client: v2.5.3 (api v3)
Root Daemon: not running
User Daemon: not running
Примечание. Если версия ниже v2.0.3.,вам нужно обновитьtelepresence(https://www.telepresence.io/docs/latest/install/upgrade/)
3. Подключитесь к кластеру k8s.
Выполните следующую команду для подключения к кластеру k8s:
$telepresence connect
Launching Telepresence Root Daemon
Need root privileges to run: /usr/local/bin/telepresence daemon-foreground /Users/xxx/Library/Logs/telepresence '/Users/xxx/Library/Application Support/telepresence'
Password:
Launching Telepresence User Daemon
Connected to context kubernetes-admin@kubernetes (https://8.16.0.211:6443)
Примечание. Подключенный кластер — это кластер, указанный в kubeconfig, и он должен быть действительно доступен. При этом телеприсутствие автоматически откроет браузер и попросит авторизоваться:
Этот шаг нельзя пропустить, иначе последующие шаги потребуют входа в систему, прежде чем вы сможете продолжить.
После выполнения вышеуказанных шагов проверьте кластер k8s и вы обнаружите, что в кластере будет создан контроллер с именем Traffic-Manager:
$kubectl get po -n ambassador
NAME READY STATUS RESTARTS AGE
traffic-manager-5bcfc9766f-lbrsz 1/1 Running 0 15m
4.Перехватчик
Как показано на рисунке выше, в k8s развернуты две службы: «Пользователи» и «Заказы».
В качестве примера мы возьмем Сервисные Заказы. В обычных обстоятельствах запрос на доступ к Заказам будет отправлен и получен в обычном режиме. Функция телеприсутствия заключается в перехвате запросов, отправленных в Заказы, и пересылке их на указанный пользователем адрес (обычно локальный).
Поэтому, прежде чем приступить к настройке, нужно понять концепцию перехватчиков в телеприсутствии:
• Глобальный перехват: перехватывайте весь трафик, обращающийся к услуге в k8s, и пересылайте его на локальный сервер.
Как показано на рисунке, с помощью глобального перехвата весь трафик, обращающийся к сервису Orders, можно перехватить и перенаправить на локальный. Конечно, нам нужно запускать локальный код для получения перенаправленных запросов. В то же время мы можем использовать любой инструмент отладки для локальной отладки.
• Персональный перехват: выборочно перехватывать только часть трафика службы, не мешая остальному трафику.
Вы можете установить идентификатор того, следует ли перехватывать запрос, через следующие параметры:
--http-match=key=value Определите, нужно ли перехватывать и пересылать запрос, на основе заголовка запроса.
--http-path-equal <path> На основе пути запроса
--http-path-prefix <prefix> На основе пути префикс запроса
--http-path-regex <regex> На основе пути запроса Соответствовать ли данному регулярному выражению
5. Практика
Перед началом необходимо развернуть сервис удаленной отладки на кластере k8s:
$kubectl get po,svc -lk8s-app=lsh-mcp-idp-cd-test
NAME READY STATUS RESTARTS AGE
pod/lsh-mcp-idp-cd-6c68876d48-v6c88 1/1 Running 0 30s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/lsh-mcp-idp-cd NodePort 20.102.1.158 <none> 9090:30323/TCP,2345:30886/TCP 30s
И запустите код lsh-mcp-idp-cd в локальной отладке:
Затем используйте следующую команду, чтобы найти службу для перехвата пересылки, а именно lsh-mcp-idp-cd:
$telepresence list
lsh-mcp-idp-cd: ready to intercept (traffic-agent not yet installed)
Обратите внимание: если вы хотите указать пространство имен, вы можете добавить параметр --namespace, как показано ниже:
$telepresence list --namespace=kube-system
Добавьте глобальный перехватчик:
telepresence intercept <service-name> --port <local-port>[:<remote-port>] --http-match=all --env-file <path-to-env-file> [--namespace необязательный]
Соответствует практическим сценариям:
$telepresence intercept lsh-mcp-idp-cd --port 9090:9090 --http-match=all --env-file ~/lsh-mcp-idp-cd-intercept.env
Flag --http-match has been deprecated, use --http-header
Using Deployment lsh-mcp-idp-cd
intercepted
Intercept name : lsh-mcp-idp-cd
State : ACTIVE
Workload kind : Deployment
Destination : 127.0.0.1:9090
Service Port Identifier: 9090
Volume Mount Error : sshfs is not installed on your local machine
Intercepting : matching all HTTP requests
Preview URL : https://sad-thompson-7927.preview.edgestack.me
Layer 5 Hostname : lsh-mcp-idp-cd.default.svc.cluster.local
После завершения выполнения вы обнаружите, что рабочая нагрузка была внедрена с помощью сайдкара:
$kubectl get po -lk8s-app=lsh-mcp-idp-cd-test -oyaml | grep -A 5 containerID
- containerID: docker://6aea792f32af00b2e71f643ea41630de9bb6b0ebbe91251877fd79f67630efa1
image: registry.cn-beijing.aliyuncs.com/launcher-agent-only-dev/idp:v1
imageID: docker-pullable://registry.cn-beijing.aliyuncs.com/launcher-agent-only-dev/idp@sha256:c3be2545c30eb75fb652d383e9ec5545df9142e40d3b6f7f78633316b0db8103
lastState: {}
name: idp-cd
ready: true
--
- containerID: docker://5acc04048950fdd38be3a8012c4cc0edbfd83079883717e34992f6f31036176f
image: datawire/ambassador-telepresence-agent:1.11.10
imageID: docker-pullable://datawire/ambassador-telepresence-agent@sha256:9008fc1a6a91dd27baf3da9ebd0aee024f0d6d6a3f9c24611476474f6583e7f8
lastState: {}
name: traffic-agent
ready: true
Добавляется контейнер с именем Traffic-Agent. Именно этот контейнер отвечает за перехват трафика, отправляемого в под, и его пересылку.
Выполните следующую команду в кластере k8s, чтобы запросить службу lsh-mcp-idp-cd:
$curl 20.102.1.158:9090/version
Снова взглянув на локальный код, мы обнаружим, что запрос получен:
Вышеизложенное представляет собой практическую часть глобального перехвата. Студенты, интересующиеся личным перехватом, могут практиковать его самостоятельно. Кроме того, что касается личного перехвата, кажется, что существует ограничение на количество использований для каждой учетной записи. превышено, то при создании персонального перехватчика будет выдано сообщение об ошибке:
telepresence: error: Failed to establish intercept: intercept in error state AGENT_ERROR: You’ve reached your limit of personal intercepts available for your subscription. See usage and available plans at https://app.getambassador.io/cloud/subscriptions
See logs for details (1 error found): "/Users/xxx/Library/Logs/telepresence/daemon.log"
See logs for details (13609 errors found): "/Users/xxx/Library/Logs/telepresence/connector.log"
If you think you have encountered a bug, please run `telepresence gather-logs` and attach the telepresence_logs.zip to your github issue or create a new one: https://github.com/telepresenceio/telepresence/issues/new?template=Bug_report.md .
6.Удалить
Удаление перехватчика: после выполнения добавленный в рабочую нагрузку дополнительный компонент будет удален.
$telepresence leave lsh-mcp-idp-cd
Удалите агенты и менеджеры телеприсутствия, очистите все коляски и контроллеры диспетчера трафика после выполнения и закройте локальный фоновый процесс телеприсутствия.
$telepresence uninstall --everything
Telepresence Network quitting...done
Telepresence Traffic Manager quitting...done
Исходный текст: LStack Langcheyun
- END -