Добрый день, уважаемые коллеги!
Меня зовут Анкин Николай и это мой первый пост. На текущий момент я тружусь в должности DevOps Engineer в компании Altenar. История о том , как я сэкономил денег своему любимому работодателю.
На что мы тратим 3k$ в месяц ?
![](https://habrastorage.org/getpro/habr/upload_files/052/88e/727/05288e72710bc1e957a743a0b2ebd4c8.png)
Во время очередной оценки наших затрат на услуги GCP мы обратили внимание , что платим 3k$ на Inter Zone Egress. Как у любознательных и бережливых инженеров у нас возникло 2 вопроса:
что такое Inter Zone Egress ?
как нам минимизировать его использование ?
Ваш покорный слуга взял на себя расследование первого вопроса.
Гугловая документация нам подсказывает , что это любой исходящий трафик между VM (в том числе в рамках k8s) , и в зависимости от местоположения источника и получателя трафика - он имеет разную стоимость:
![](https://habrastorage.org/getpro/habr/upload_files/d70/832/727/d7083272722bf2fdd93aed093adc3aad.png)
Итого: мы узнали , что за исходящий трафик в гугле надо платить, осталось найти источники этого трафика и по возможности угомонить их.
Для того чтобы найти источник трафика нам нужно включить VPC логирование в гугле для наших сетей. После этого мы можем пойти в Log Explorer и внимательно изучить logName:("projects/your-project/logs/compute.googleapis.com%2Fvpc_flows").
В логах вы увидите большое количество сообщений:
![](https://habrastorage.org/getpro/habr/upload_files/7ee/069/95d/7ee06995d31419cb813065bc18b9f942.png)
Как понять, какие из них являются Egress , т. е. исходящими ? Здесь нам на помощь придет jsonPayload.reporter:
![](https://habrastorage.org/getpro/habr/upload_files/e1a/0f0/040/e1a0f0040a54726ee9150a1417292423.png)
Он имеет 2 значения «DEST» для входящего и SRC для исходящего, добавляем условие в запрос и получаем весь Egress трафик:
![](https://habrastorage.org/getpro/habr/upload_files/468/8ed/d1b/4688edd1b5a55994c9c6fafb5e75e471.png)
logName:("projects/yourproject/logs/compute.googleapis.com%2Fvpc_flows") AND jsonPayload.reporter = SRC
Количество сообщений уменьшилось в 2 раза и это значит мы на правильном пути.
Далее нам стоит внимательнее изучить jsonPayload , возможно умные гугловые инженеры прикрутили туда полезную инфу , чтобы точнее идентифицировать наш трафик ?
![](https://habrastorage.org/getpro/habr/upload_files/7f1/df1/cf9/7f1df1cf9369019e6e1f091090541e9d.png)
И слава инженерной мысли — в блоках dest_instance и src_instance содержится информация об источнике и получателе пакета, в том числе , в каких зонах они находятся. Наш пример как раз показывает, что трафик между разными зонами присутствует. Увы движок Log Explorer не смог удовлетворить моим потребностям к формату выходных данных. Чтобы проанализировать данные на предмет количества подобных сообщений и объем трафика я использовал Log Analytics. Давайте же подготовимся к передаче лога в этот замечательный инструмент.
По умолчанию использование Log Analytics отключено для Log Bucket и у меня не было желания включать его для текущего — я создал новый Log Bucket и настроил на него SINK нужного лога.
![](https://habrastorage.org/getpro/habr/upload_files/e8a/83a/280/e8a83a2803f0e4180d0451b4d3119151.png)
Далее включаем функцию Log Analytics для созданного бакета и ждем накопления данных.
Ну и самый вкусный этап - создание sql запроса для получения желаемых данных, какой же объем трафика передается и откуда и куда ?
Меня в частности интересовала сумма переданного трафика (json_payload.bytes_sent) , под источник/получателя (json_payload.src_gke_details.pod.pod_name)/(json_payload.dest_instance.zone) , зона источника/получателя (json_payload.src_instance.zone)/(json_payload.dest_instance.zone) и главные условия выборки — Egress Traffic ((json_payload.reporter) = "SRC") и что у источника и получателя разные зоны.
Пропустив эти вводные через призму суммирования и группировки получаем следующий запрос:
SELECT
sum(cast(JSON_VALUE(json_payload.bytes_sent) as int)) / 1024/1024/1024 as Gb, JSON_VALUE(json_payload.dest_gke_details.pod.pod_name) as dest_pod , JSON_VALUE(json_payload.dest_instance.zone) as dest_zone ,JSON_VALUE(json_payload.src_gke_details.pod.pod_name) as src_pod, JSON_VALUE(json_payload.src_instance.zone) as src_zone
FROM
`yourproject.global.VPC-logs._AllLogs`
WHERE
JSON_VALUE(json_payload.src_instance.zone) <> JSON_VALUE(json_payload.dest_instance.zone)
AND JSON_VALUE(json_payload.reporter) = "SRC"
AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
group by dest_pod, src_pod, dest_zone, src_zone
orderby Gb desc
и не менее интересный вывод:
![](https://habrastorage.org/getpro/habr/upload_files/8a8/ad4/d37/8a8ad4d37670bc852d508ef0432f4a3c.png)
Т.е. поды нашего приложения ходят за данными в БД из другой зоны , генерируя при этом достаточно дорогой трафик.
Для понимания происходящего ниже представлена схема движения трафика:
![](https://habrastorage.org/getpro/habr/upload_files/277/6b4/ee3/2776b4ee34dc3067e11649e54102350b.png)
На этом расследование завершено, далее обучаем приложение ходить в БД в своей зоне , об этом подробнее расскажем во второй части.
На затравку сравнение расходов на Inter Zone Egress после применения нашего решения в трехмесячной перспективе:
![](https://habrastorage.org/getpro/habr/upload_files/dfa/796/869/dfa796869aedd1a7962a11eff40df737.png)