На коленке: агрегация VPN, или надежная связь на ненадежных каналах

Представьте задачу: необходимо обеспечить стабильным интернетом и покрыть бесшовным Wi-Fi здание площадью 300 м2 с возможной расчетной нагрузкой до 100 человек. На первый взгляд, “вроде изян”. Но стоит добавить пару деталей, и задача усложняется:




  • здание стоит в лесопарковой зоне, где нет оптики, так что наш вариант – мобильная связь;
  • нужно обеспечить регулярные видеотрансляции, то есть добиться стабильного интернета при единственном GSM-провайдере;
  • бюджет ограничен.




Итого: потери и отвалы от базовой станции подкрадываются в самое неподходящее время.




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




В статье покажу, как в одном проекте я решил эти задачи “дешево и сердито” – такой вариант подойдет малому бизнесу. В конце предложу варианты решения для менее скромного бюджета – для крупных заказчиков.




Схема решения вкратце




Итак, при первом столкновении с проблемой отвалов я начал с агрегации частот и убедился, что это не поможет. Смена категории LTE-модема с Cat4 на Cat6 или – еще круче – Cat12 давала преимущество в скорости, но в потерях и отвалах – нет. Пришел к выводу, что нужен второй LTE-провайдер. При этом при переключении не должен потеряться ни один кадр и трансляция не должна отвалиться.




На помощь пришла такая связка: агрегация, она же bonding, и TCP-OpenVPN-туннель поверх этого.




  1. в облаке создал “сервер агрегации” – виртуалку с CLOUD HOSTED ROUTER (CHR) на базе Router OS;
  2. на ней поднял L2TP-сервер с включенным шифрованием IPsec;
  3. поверх L2TP over IPsec создал два EoIP-туннеля;
  4. EoIP-туннели агрегированы bonding-интерфейсом;
  5. вишенка на торте – TCP-шный OpenVPN-туннель.




Итоговая схема:







Вместо виртуальной машины в дата-центре в качестве R1 может выступать любая железка с достаточной производительностью. Например, тот же MikroTik серии CCR, компьютер, размещенный где угодно. Главное – позаботиться о производительности и стабильных каналах связи, использовать схемы активного резервирования (VRRP в помощь).




Поддержка OpenVPN UDP реализована только в 7-й версии RouterOS, поэтому в этой конфигурации безальтернативно используется протокол TCP.




Сейчас схема стабильно работает, но нет предела совершенству. Для надежности можно добавить еще LTE-провайдеров или проводные каналы связи, когда такая возможность появится.




Теперь расскажу подробнее о строительстве схемы. Начнем с R1 (облачного маршрутизатора) и – далее – R2 (филиального).




Маршрутизатор R1




  1. Сначала берем второй белый IP в дата-центре. У меня CHR находился за Edge в облаке VMware, так что обязательно пробрасываем порты на Edge UDP 1701, 500 и 4500 NAT-T – IPSec Network Address Translator Traversal. Также делаем разрешающее правило в межсетевом экране Edge.
  2. Добавляем в таблицу firewall filter разрешающее правило доступа к маршрутизатору извне для портов UDP 1701, 500 и 4500. Если у вас белые IP непосредственно на маршрутизаторе без пробросов через Edge, галочку NAT Traversal НУЖНО СНЯТЬ!Проверяем дефолтный IPsec-профиль:







/ip ipsec profile
set [ find default=yes ] dh-group=modp1024 enc-algorithm=3de




  1. Создаем профиль для L2TP-туннелей:







/ppp profile
add change-tcp-mss=no name=profile01 use-compression=no use-encryption=no use-mpls=no use




и настраиваем учетные записи:







/ppp secret
add local-address=172.16.0.1 name=l2tp_R1-R2_ISP1 password=ros7.elements.forever profile=profile01 remote-address=172.16.0.2 service=l2tp
add local-address=172.16.0.5 name=l2tp_R1-R2_ISP2 password=ros7.elements.forever profile=profile01 remote-address=172.16.0.6 service=l2tp




  1. Активируем L2TP-сервер и включаем шифрование IPsec:







/interface l2tp-server server
set authentication=mschap2 caller-id-type=number default-profile=profile01 enabled=yes ipsec-secret=ВАШ КРУТОЙ ПАРОЛЬ use-ipsec=yes




  1. Поднимаем два EoIP-туннеля поверх L2TP/IPsec-туннелей:







/interface eoip
add keepalive=1s,5 local-address=172.16.0.1 mac-address=00:00:00:00:00:A1 name=eoip-tun1_over_l2tp_R1-R2_ISP1 remote-address=172.16.0.2 tunnel-id=1
add keepalive=1s,5 local-address=172.16.0.5 mac-address=00:00:00:00:00:B1 name=eoip-tun2_over_l2tp_R1-R2_ISP2 remote-address=172.16.0.6 tunnel-id=2




Обязательно указываем минимальный keepalive timeout равным 1 секунде и для каждого EoIP-туннеля указываем уникальный ID.




  1. Настраиваем bonding и назначаем на него IP-адрес:







/interface bonding
add lacp-rate=1sec mii-interval=1ms mode=broadcast name=bonding1 slaves=eoip-tun1_over_l2tp_R1-R2_ISP1,eoip-tun2_over_l2tp_R1-R2_ISP2




/ip address
add address=172.16.1.1/30 interface=bonding1




Тут важно заметить, что в поле mode (режим работы bonding-интерфейса) я указал broadcast, чтобы пакеты отправлялись сразу по двум тоннелям. Таким образом потеря пакета на любом из двух интерфейсов не приведет к потере пакета на bonding-интерфейсе. Остальные значения устанавливаем, как на картинке.




Активируем OpenVPN-сервер




Так как у меня OpenVPN использовался еще и для внешних подключений, то я предварительно сгенерировал сертификаты и импортировал их в CHR. На этом останавливаться подробно не буду.




Создаем /ppp profile и /ppp secret для OpenVPN:










/ppp profile
add change-tcp-mss=no name=profile02 use-compression=no use-encryption=no use-mpls=no use
/ppp secret
add local-address=172.16.2.1 name=ovpn_over_bonding1 password=ros7.elements.forever profile=profile02 remote-address=172.16.2.2 service=ovpn
/interface ovpn-server server
set auth=sha1 certificate=server.crt_0 cipher=aes256 default-profile=profile02 enabled=yes keepalive-timeout=30 port=1194 require-client-certificate=yes




Обязательно прописываем в nat-таблицу межсетевого экрана правило для нашей серой филиальной сети за маршрутизатором R2, чтобы трафик выходил наружу через R1:







/ip firewall nat
add action=masquerade chain=srcnat out-interface-list=WAN src-address=192.168.1.0/24




Обратный маршрут до серой сети за маршрутизатором R2 указываем через OpenVPN-туннель:







/ip route
add check-gateway=ping distance=1 dst-address=192.168.1.0/24 gateway=172.16.2.2




Маршрутизатор R2




  1. Первым делом прописываем маршруты от одного интерфейса LTE-модема до одного белого IP-адреса дата-центра. Запрещаем в настройках межсетевого экрана в цепочке output прохождение пакетов с другого интерфейса:




/ip route
add distance=1 dst-address= 198.51.100.10/32 gateway=lte1
add distance=1 dst-address= 198.51.100.20/32 gateway=lte2
/ip firewall filter
add action=drop chain=output dst-address= 198.51.100.10 out-interface=lte2
add action=drop chain=output dst-address= 198.51.100.20 out-interface=lte1




  1. Приводим в соответствие с R1 дефолтный конфиг /ip ipsec profile:







/ip ipsec profile
set [ find default=yes ] dh-group=modp1024 enc-algorithm=3de




  1. Создаем /ppp profile:







и два L2TP/IPsec-подключения к дата-центру для каждого из провайдеров:







/ppp profile
add change-tcp-mss=no name=profile01 use-compression=no use-encryption=no use-mpls=no use
/interface l2tp-client
add allow=mschap2 connect-to= 198.51.100.10 disabled=no ipsec-secret= ros7.elements.forever keepalive-timeout=30 name=l2tp_to_R1_over_ISP1 password=ros7.elements.forever
    profile=profile01 use-ipsec=yes user=l2tp_R1-R2_ISP1
add allow=mschap2 connect-to= 198.51.100.20 disabled=no ipsec-secret= ros7.elements.forever keepalive-timeout=30 name=l2tp_to_R1_over_ISP2 password=ros7.elements.forever
    profile=profile01 use-ipsec=yes user=l2tp_R1-R2_ISP2




  1. Создаем EoIP-туннели по аналогии с R1, только меняем местами local и remote IP L2TP/IPsec-линков маршрутизатора R2. Bonding-интерфейс такой же, как на R1:







/interface eoip
add keepalive=1s,5 local-address=172.16.0.2 mac-address=00:00:00:00:00:A2 name=eoip-tun1_over_l2tp_R1-R2_ISP1 remote-address=172.16.0.1 tunnel-id=1
add keepalive=1s,5 local-address=172.16.0.6 mac-address=00:00:00:00:00:B2 name=eoip-tun2_over_l2tp_R1-R2_ISP2 remote-address=172.16.0.5 tunnel-id=2
/interface bonding
add lacp-rate=1sec mii-interval=1ms mode=broadcast name=bonding1 slaves=eoip-tun1_over_l2tp_R1-R2_ISP1,eoip-tun2_over_l2tp_R1-R2_ISP2
/ip address
add address=172.16.1.2/30 interface=bonding1




  1. Также импортируем сертификаты, создаем профиль:










Настраиваем OpenVPN-клиента на R2:







/ppp profile
add change-tcp-mss=no name=profile02 use-compression=no use-encryption=no use-ipv6=no use-mpls=no use-upnp=no
/interface ovpn-client
add certificate=client.crt_0 cipher=aes256 connect-to=172.16.1.1 mac-address=00:00:00:00:00:C2 name=ovpn_over_bonding1 password=ВАШ КРУТОЙ ПАРОЛЬ profile=profile02 use-peer-dns=no user="ovpn_over_bonding1 " verify-server-certificate=yes




  1. Туннели загорелись волшебной буквой R, а EoIP – еще и RS. OpenVPN тоже завелся. Теперь можно направлять трафик с компьютера трансляций в наш слоеный бутерброд – в OpenVPN-туннель. Для этого создаем правило /ip firewall mangle и прописываем сразу новую таблицу маршрутизации:







/ip firewall mangle
add action=mark-routing chain=prerouting dst-address-list=google_sites dst-port=1935 new-routing-mark=pc_to_stream-youtube_over_R1 passthrough=yes protocol=tcp src-address=192.168.1.1




  1. Создаем маршрут через наш OpenVPN-туннель с данной таблицей маршрутизации:







/ip route
add check-gateway=ping distance=1 gateway=172.16.2.1 routing-mark=pc_to_stream-youtube_over_R1




И готово!




Траблшутинг




  • При развертывании конфигурации на действующем железе нужно обязательно переключить прямой и обратный маршруты с туннелей L2TP на OpenVPN-туннель. Если, например, переключить только прямой маршрут, а обратный оставить на L2TP вместо OpenVPN, агрегация полностью работать не будет и пакеты все равно будут теряться.
  • Утилиты RouterOS в разделе /tools очень полезны при траблшутинге. Еще неплохо работает связка /tools Packet Sniffer + Wireshark.
  • Не забудьте “поиграться с mtu”, чтобы достичь лучшей производительности туннелей.
  • Качество сигнала никто не отменял. RSRP, RSRQ и SINR покажут, насколько все хорошо. При большом удалении от базовой станции и плохом сигнале помогут внешние направленные антенны.
  • Важно! Если провайдер фильтрует трафик и идет блокировка L2TP, то можно поднять другие туннели в качестве основы для EoIP, например: OpenVPN или SSTP.
  • Чтобы проверить все в деле, можно сымитировать сбой. Отключаем любой из LTE-интерфейсов или создаем потери искусственно: добавляем в межсетевой экран правило частичной блокировки пакетов и указываем при создании нового правила значение в поле random.




Что еще можно улучшить и оптимизировать




  • Не рекомендую заворачивать весь интернет-трафик, так как это вызовет повышенные накладные расходы (утилизация процессоров, каналов и др.). Лучше пользоваться маркировкой для гарантированной доставки действительно необходимого трафика, а все остальное отправлять на LTE-провайдеров. К примеру, я так делал с загрузкой видеофайлов на облачный диск.
  • QOS – хорошая штука, особенно на каналах LTE, и особенно с VoIP. Не забываем про это, чтобы остальной трафик не забил и так не слишком широкий канал.
  • Можно усилить безопасность, если ограничить подключение извне к портам для L2TP и IPsec маршрутизатора R1. Указываем белый IP LTE-провайдера  с помощью firewall и адресных листов. Хоть адрес и из NAT и на нем висит не один клиент, все равно будет лучше. Так как IP динамический, то нужно включить на MikroTik функцию ip – cloud, чтобы DNS-сервера всегда знали актуальный IP, технология DDNS.




Конечно же, у схемы есть коммерческие аналоги с возможностями работы из коробки, например: peplink MAX HD4 LTE и тому подобное оборудование, – агрегирующие соединения. Тут бизнес сам оценивает их стоимость для себя.




Источник: https://uni.dtln.ru/digest/na-kolenke-agregaciya-vpn-ili-nadezhnaya-svyaz-na-nenadezhnyh-kanalah



2022-08-08T00:33:16
Network

Mkrotik и vlan по быстрому.

Купили новый маленький роутер от Mikrotik — RB4011iGS+RM. Решили попробовать как он будет работать в маленькой сетке в качестве роутера (странно? Да? 🙂 ). У него есть 10G SFP+ интерфейс, подключенный непосредственно к процессору. Если включить FastPath, то по идее должен справляться.




SFP+ интерфейс естественно в trank. На всякий пожарный eth6, тоже в транк. Eth с 1-го по 5-й в 1-й vlan, в режиме access mode, что бы подключаться прямо в серверной к коммутаторам, если вдруг чего. Остальные не задействованы.




При обращении к Google с вопросом Mirotik+vlan вываливается куча страниц с описанием настройки vlan. Но, проблема в том, что они блин все устарели! В новых версиях router os все уже не так.




Как сейчас рулить vlan с возможностью маршрутизации? Теперь там все через bridge интерфейс.




В первую очередь добавляем сам мост:




> /interface bridge




/interface bridge> add name=core




Добавим к мосту порты, в которых будут бегать тегированные пакеты:




/interface bridge> port




/interface bridge port> add bridge=core interface=sfp-trunk




/interface bridge port> add bridge=core interface=ether6




Порты, работающие в access режиме:




/interface bridge port> add bridge=core interface=ether1




/interface bridge port> add bridge=core interface=ether2




/interface bridge port> add bridge=core interface=ether3




/interface bridge port> add bridge=core interface=ether4




/interface bridge port> add bridge=core interface=ether5




Там же, в разделе bridge есть возможность указывать какие vlan на каком интерфейсе и режим работы интерфейса.




/interface bridge port> /interface bridge vlan




/interface bridge vlan> add bridge=core tagged=sfp-trunk,ether6,core untagged=ether1,ether2,ether3,ether4,ether5 vlan-ids=1




/interface bridge vlan> add bridge=core tagged=sfp-trunk,ether6,core vlan-ids=1010,1011,1254




Итак, мы добавили vlan 1 к нужным нам интерфейсам и заодно определили режимы работы самих интерфейсов. Так же были определены другие vlan, которые будут приходить на mikrotik и в дальнейшем мы будем заниматься маршрутизацией между этими сетями.




На данном этапе пакеты Ethernet начнут бегать в своих vlan.




Пришло время заняться маршрутизацией.




Обязательно добавляйте интерфейс моста в параметре tagget при добавлении vlan в разделе bridge! Без этого у нас ничего не получиться на 3-м уровне 🙁




Для того, что бы маршрутизатор смог маршрутизировать 🙂 нам необходимо для каждого vlan создать свой интерфейс и задать им параметры ip.




Как обычно, интерфейсы создаём в разделе interface vlan (не bridge vlan!).




> /interface vlan




/interface vlan> add interface=core name=VLAN-1254 vlan-id=1254




/interface vlan> add interface=core name=VLAN-1010 vlan-id=1010




/interface vlan> add interface=core name=VLAN-1011 vlan-id=1011




Обратите внимание, что vlan-ы мы добавляем к bridge интерфейсу core. Не зря мы включали на этом интерфейсе режим работы tagged.




Осталось добавить ip адреса на интерфейсы:




> /ip address




/ip address> add address=192.168.1.1/24 interface=core network=192.168.1.0




/ip address> add address=192.168.10.1.24 interface=VLAN-1010 network=192.168.10.0




/ip address> add address=192.168.11.1/24 interface=VLAN-1011 network=192.168.11.0




/ip address> add address=192.168.254.1/24 interface=VLAN-1254 network=192.168.254.0




Наши админы очень любят DHCP сервер mikrotik, поэтому его тоже придется поднимать на этом устройстве. Поскольку интерфейсы сконфигурированы, DHCP сервер настраивается обычным образом.




Вот и все.




Источник: https://www.kryukov.biz/2019/04/mkrotik-i-vlan-po-bystromu/



2022-08-08T00:24:11
Network

Pfsense и MikroTik, настройка VPN туннеля

Инструкция по настройке VPN туннеля типа IpSec между облачным роутером Pfsense и MikroTik. В результате настройки должно получиться объединение двух сетей, за MikroTik и за Pfsense.







Что такое Pfsense




PfSense — дистрибутив для создания межсетевого экрана/маршрутизатора, основанный на FreeBSD. PfSense предназначен для установки на персональный компьютер, известен своей надежностью и предлагает функции, которые часто можно найти только в дорогих коммерческих межсетевых экранах. Настройки можно проводить через web-интерфейс, что позволяет использовать его без знаний базовой системы FreeBSD. Сетевые устройства с pfSense обычно применяются в качестве периметровых брандмауэров, маршрутизаторов, серверов DHCP/DNS, и в технологии VPN в качестве узла топологии hub/spoke.




Настройка VPN в MikroTik для подключения к Pfsense




Со стороны роутера MikroTik будет настроен стандартный VPN туннель типа IpSec. Больше сведений по настройке VPN типа IpSec представлено в статье:




VPN туннель IpSec состоит из двух фаз:




  • PHASE-1 – идентификация устройств между собой, по заранее определенному IP адресу и ключу.
  • PHASE-2 – определение политики для трафика между туннелей: шифрование, маршрутизация, время жизни туннеля.




Создание профиля для MikroTik IpSec phase-1




Настройка находится в IP→IPsec→Profile




Pfsense и MikroTik, создание профиля для IpSec phase-1




Создание Peer для MikroTik IpSec phase-1




Настройка находится в IP→IPsec→Peers




Pfsense и MikroTik, создание Peer для IpSec phase-1




Определение ключа MikroTik IpSec phase-1




Настройка находится в IP→IPsec→Identities




Pfsense и MikroTik, определение ключа IpSec phase-1




Настройка параметров MikroTik Proposal IpSec phase-2




Настройка находится в IP→IPsec→Proposals




Pfsense и MikroTik, настройка параметров Proposal IpSec phase-2




Создание политики(Policies) MikroTik IpSec phase-2




Настройка находится в IP→IPsec→Policies




Pfsense и MikroTik, создание политики(Policies) IpSec phase-2




Настройка политики(Policies) MikroTik IpSec phase-2




Настройка находится в IP→IPsec→Policies→Action




Pfsense и MikroTik, настройка политики(Policies) IpSec phase-2




/ip ipsec profile
add dh-group=modp1024 enc-algorithm=3des hash-algorithm=md5 lifetime=8h name=Pfsense
/ip ipsec peer
add address=10.10.10.10/32 name=Pfsense profile=Pfsense
/ip ipsec proposal
add auth-algorithms=md5 enc-algorithms=3des lifetime=8h name=Pfsense
/ip ipsec policy
add dst-address=192.168.5.0/24 peer=Pfsense proposal=Pfsense 
sa-dst-address=10.10.10.10 sa-src-address=0.0.0.0 src-address=
192.168.1.0/24 tunnel=yes
/ip ipsec identity
add peer=Pfsense secret=Pt36ENepT3t3




Настройка VPN в Pfsense для подключения к MikroTik




Pfsense имеет удобный web интерфейс, с помощью которого и будет производиться настройка VPN туннеля типа IpSec для связи с роутером MikroTik.




Настройка phase-1 для Pfsense IpSec




Создание phase-1 для Pfsense IpSec







Настройка phase-2 для Pfsense IpSec




Настройка phase-2 для Pfsense IpSec




Настройка phase-2 для Pfsense IpSec, шифрование




Настройка phase-2 для Pfsense IpSec, общие параметры




Настройка Pfsense Firewall




Настройка Pfsense Firewall, разрешение внешнего подключения IpSec




Настройка Pfsense Firewall, обмен трафиком внутри VPN




Результат настройки VPN IpSec между Pfsense и MikroTik




После успешно принятых настроек, проверить соединение VPN типа IpSec между Pfsense и MikroTik можно так:




Pfsense и MikroTik, статус VPN туннеля IpSec




MikroTik и Pfsense, статус VPN IpSec туннеля




Источник: https://xn—-7sba7aachdbqfnhtigrl.xn--j1amh/pfsense-i-mikrotik-nastrojka-vpn-tunnelya/



2022-08-08T00:21:27
Network

Как диагностировать проблемы соединения в Kubernetes при помощи Mizu

Стоит попробовать Mizu – это ПО для мониторинга Kubernetes-трафика. Программа может сильно упростить ежедневную диагностику сетей, да и жизнь в целом.




Одна из наиболее частых задач, с которыми сталкиваются администраторы Kubernetes по ходу тестирования и дебаггинга – проверка коммуникаций между компонентами внутри сети. 




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




Чтобы не натыкаться на кучу проблем по ходу мониторинга сети, советую использовать утилиту Mizu. Многие программисты, работающие с Kubernetes, мечтали бы найти подобный инструмент раньше.




Mizu можно описать как простой, но при этом мощный инструмент для отслеживания трафика в Kubernetes. Он позволяет отслеживать все API-коммуникации между микросервисами независимо от используемого протокола и упрощает процесс дебаггинга соединений.




Установка Mizu




Процесс установки довольно простой. Все что нужно – загрузить бинарный файл Mizu и настроить соответствующие разрешения в системе. Выбор бинарного файла (установщика) зависит от архитектуры устройства. Например, чтобы установить Mizu на компьютер Apple с чипом Intel нужно ввести в терминал команду:




‌curl -Lo mizu github.com/up9inc/mizu/releases/latest/download/mizu_darwin_amd64 && chmod 755 mizu && mv mizu /usr/local/bin




Обычно этого достаточно. Загруженный бинарный файл теперь можно использовать для подключения к кластеру Kubernetes и работы с Kubernetes API, но для этого нужно внести несколько изменений в настройки Докера. 




Вот как это может выглядеть в случае с базовым nginx-сервером. Начать стоит с команды:




‌kubectl run simple-app --image=nginx --port 3000




После развертки базового приложения на основе nginx переходим непосредственно к запуску Mizu. Делается это всего одной командой:




mizu tap




Через пару секунд на экране появится веб-страница с интерфейсом Mizu. Здесь и отображается весь трафик на выбранном сервере. Но для настройки такого поведения необходимо внести изменения в параметры портов. К примеру, если ваше приложение называется ‘my-app’, команда будет выглядеть так:




kubectl expose pod/my-app




После этого деплоим еще один временный сервер, используя готовый образ (при помощи следующей команды):




kubectl run -it --rm --image=curlimages/curl curly -- sh




Теперь можно использовать утилиту curl для отправки запросов непосредственно на nginx-сервер. Например, так:




curl -vvv http://my-app:3000




Уже после первых нескольких запросов вы увидите большой объем полезной информации, отображающейся в интерфейсе Mizu. В первую очередь стоит отметить то, насколько детально описываются все процессы, происходящие внутри Kubernetes. Но что еще важнее, в Mizu есть диаграммы, наглядно показывающие зависимости между запросами с учетом используемого протокола и другой полезной информации. 




Конечно, Mizu не сможет заменить более сложные продукты и полноценные системы наблюдения за сетью. Но это довольно удобный инструмент, который поможет вам исправить немало багов по ходу работы с Kubernetes, и его точно стоит иметь под рукой.




Источник: https://te.legra.ph/Kak-diagnostirovat-problemy-soedineniya-v-Kubernetes-pri-pomoshchi-Mizu-07-09



2022-08-07T23:59:02
DevOps

🐳 Как изменить конфигурацию запущенных контейнеров Docker

Контейнеры Docker обычно считаются неизменяемыми после начала их работы.




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




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




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




Переименование контейнера




Самым простым изменением является переименование созданного контейнера. Имена присваиваются с помощью флага –name для команды docker run.




Если имя не указано, демон Docker присваивает случайное имя.




Вы можете использовать имена для ссылок на контейнеры в командах Docker CLI; выбор подходящего запоминающегося имени позволяет избежать выполнения команды docker ps для поиска автоматически назначенного имени или ID контейнера.




Команда docker rename используется для изменения имен контейнеров после создания.




Она принимает два аргумента: ID или текущее имя целевого контейнера и новое имя, которое нужно присвоить:




# docker rename <target ID or name> <new name>
docker rename old_name new_name




Изменение политики перезапуска




Restart policies определяют, должны ли контейнеры запускаться автоматически после перезагрузки хоста или запуска демона Docker.




Четыре доступные политики позволяют принудительно запустить контейнер, заставить его оставаться остановленным или условно запустить на основе предыдущего кода выхода или состояния работы контейнера.




Docker поддерживает изменение политик перезапуска “на лету”.




Это полезно, если вы планируете перезагрузить хост или демон Docker и хотите, чтобы определенный контейнер оставался остановленным – или автоматически запускался – после определенного события.




docker update --restart unless-stopped demo_container




Приведенный выше пример изменяет политику перезапуска demo_container на unless-stopped.




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




Изменение лимитов аппаратных ресурсов




Команда docker update также может быть использована для изменения ограничений ресурсов, применяемых к контейнерам.




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




Флаги доступны для всех ограничений ресурсов, поддерживаемых docker run.




Вот краткий список опций, которые вы можете использовать:




  • –blkio-weight – Изменить относительный вес Block IO контейнера.
  • –cpus – Установить количество процессоров, доступных контейнеру.
  • –cpu-shares – Установить относительный вес доли ЦП.
  • –memory – Изменить лимит памяти контейнера (например, 1024M).
  • –memory-swap – настройка объема памяти, который контейнер может обменять на диск; используйте размер, например 1024M, чтобы установить определенный лимит, или -1 для неограниченной замены.
  • –kernel-memory – Изменить лимит памяти ядра контейнера. Контейнеры, испытывающие недостаток памяти ядра, могут негативно влиять на другие рабочие нагрузки на хост-машине.
  • –pids-limit – настройка максимального количества идентификаторов процессов, разрешенных внутри контейнера, что ограничивает количество процессов, которые могут быть запущены.




Вот пример использования docker update для изменения лимита памяти и количества CPU для двух контейнеров




docker update --cpus 4 --memory 1024M first_container second_container




Все доступные флаги, кроме –kernel-memory, можно использовать с запущенными контейнерами Linux.




Чтобы изменить лимит памяти ядра, необходимо сначала остановить контейнер с помощью docker stop.




Имейте в виду, что ни один из этих флагов в настоящее время не поддерживается для контейнеров на базе Windows.




Однако они будут работать с контейнерами Linux, запущенными на хост-машине Windows.




Когда не следует использовать эти команды?




Команды docker update и docker rename следует использовать с контейнерами, которые вы создали вручную с помощью команды docker run.




Опасайтесь использовать их для контейнеров, созданных с помощью других инструментов, таких как docker-compose.




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




Кроме того, если вы декларативно определяете ограничения на ресурсы в файле docker-compose.yml, повторное выполнение команды docker-compose up приведет к повторному применению этих исходных ограничений к вашему контейнеру.




Поэтому вам следует придерживаться существующего решения для управления контейнерами, если вы его используете.




Для Compose это означает изменение имен контейнеров и лимитов ресурсов в файле docker-compose.yml, а затем выполнение команды docker-compose up -d для автоматического применения изменений.




Это позволит избежать непреднамеренного сиротства контейнеров или возникновения непреднамеренных побочных эффектов.




Что касается других свойств (образа/порты/тома)?




Аппаратные ограничения, политики ресурсов и имена контейнеров – это единственные параметры конфигурации, которые позволяет изменять Docker CLI.




Вы не можете изменить образ запущенного контейнера; вы также не можете легко изменить другие параметры, такие как привязка портов и тома.




Вам следует создать другой контейнер, если эти значения устарели.




Уничтожьте текущий экземпляр и с помощью команды docker run запустите новый контейнер с новым образом и исправленными настройками.




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




Используйте тома для хранения постоянных данных контейнера; этот механизм позволяет повторно подключить файлы с состоянием к новому контейнеру, повторив флаги -v, переданные исходной команде docker run:




docker run -v config-volume:/usr/lib/config --name demo example-image:v1

docker rm demo

# Существующие данные в /usr/lib/config сохранены
docker run -v config-volume:/usr/lib/config --name demo2 example-image:v2




Опасная зона: Изменение других свойств контейнера




Хотя вы должны стремиться заменять контейнеры везде, где это возможно, можно изменять свойства существующих контейнеров путем прямого редактирования конфигурационных файлов Docker.




Будьте осторожны при использовании этого метода: он совершенно не поддерживается, и неправильное изменение может привести к поломке вашего контейнера.




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




Используйте команду docker stop my-container, чтобы остановить контейнер, который вы хотите отредактировать, а затем продолжайте вносить свои изменения.




Конфигурационные файлы контейнеров имеют следующий путь




/var/lib/docker/containers/<container id>/config.v2.json




Вам нужно знать полный ID контейнера, а не усеченную версию, которую показывает docker ps.




Для этого можно использовать команду docker inspect:




docker inspect <short id or name> | jq | grep Id







Добравшись до config.v2.json контейнера, вы можете открыть его в текстовом редакторе, чтобы внести необходимые изменения.




В JSON хранится конфигурация контейнера, созданная при запуске docker run.




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




Чтобы добавить привязку к порту, найдите в файле ключ PortBindings, затем вставьте новый элемент в объект:




{
    "PortBindings": {
        "80/tcp": {
            "HostIp": "",
            "HostPort": "8080"
        }
    }
}




Здесь порт 80 в контейнере привязан к порту 8080 на хосте.




Аналогично просто добавлять переменные окружения – найдите ключ Env, затем вставьте новые элементы в массив:




{
    "Env": [
        "FOO=bar",
        "CUSTOM_VARIABLE=example"
    ]
}




После завершения редактирования перезапустите службу Docker и ваш контейнер:




sudo service docker restart

docker start my-container




Заключение




Контейнеры Docker должны быть эфемерными единицами, которые вы заменяете, когда их конфигурация устаревает.




Несмотря на это намерение, существуют сценарии, когда необходимо изменить существующий контейнер.




Docker обрабатывает наиболее распространенные случаи – изменение имени и корректировка лимита ресурсов в реальном времени – с помощью встроенных команд CLI, таких как docker update.




Когда вы хотите изменить другое свойство, всегда старайтесь в первую очередь заменить контейнер.




Это минимизирует риск поломки и соответствует модели неизменяемости Docker.




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




Наконец, помните, что контейнеры, управляемые другими инструментами экосистемы, такими как Docker Compose, должны быть изменены с помощью этих механизмов.




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







Источник: https://t.me/i_DevOps https://te.legra.ph/Kak-izmenit-konfiguraciyu-zapushchennyh-kontejnerov-Docker-07-09



2022-08-07T23:55:44
DevOps

Как настроить удобный терминал Kubernetes

Kubernetes поставляется в комплекте с выдающимся CLI.




Для основных операций это работает чудесно.




Увы, когда нужно что-то сделать быстро, сложность возрастает.




Сообщество Kubernetes создало все виды веб-инструментов для мониторинга вашего кластера – kube ops, grafana и т. д.




Однако наличие полностью настроенного терминала быстро сократит время, необходимое для поиска причины проблемы.




Это основная часть вашего швейцарского армейского ножа.




Ниже приведен очень короткий список инструментов с открытым исходным кодом, которые можно применить в своем терминале.




При совместном использовании они позволяют управлять кластером kubernetes, быстро устранять неполадки и отслеживать поведение.




 Предпосылки




Прежде чем приступить к изучению этих инструментов, я настоятельно рекомендую установить zsh.




Это выдающаяся оболочка с открытым исходным кодом для стандартного терминала OSX.




Он более многофункциональный и интуитивно понятный, а плагины, которые вы можете установить, просто фантастические.




Некоторые из перечисленных инструментов предполагают, что у вас установлен ZSH.




Лучшие инструменты для управления Kubernetes




k9s







Я начинаю с самого мощного.




K9s –  это основа CLI для кластера kubernetes.




Вы можете проваливаться по SSH прямо в поды одним нажатием клавиши, просматривать журналы, удалять ресурсы и многое другое.




Он обеспечивает выдающийся доступ к наиболее распространенным операциям, которые вы будете выполнять.




Это основной продукт для любого инженера, использующего kubernetes.







kubectx




Очень редко у нас будет только один кластер.




Переключение между ними можно так же просто осуществлять:




kubectl config use-context my-context




Но при этом есть некоторые предпосылки:




  • Вам нужно знать имя кластера, прежде чем запускать команду.
  • Есть другая, похожая команда set-context, которая может сбить вас с толку.




kubectx представляет более простую альтернативу этому варианту.




Если вы запустите kubectx самостоятельно, он перечислит все контексты в вашем файле .kube/config.




Затем вы можете указать название интересующего вас контекста:




kubectx my-context




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




Красиво и просто.




В сочетании с K9s, этот набор обеспечивает классную навигацию из вашего CLI с минимальными нажатиями клавиш.







kubens




Как только вы переключаетесь между контекстами, вы можете долго копаться в определенном пространстве имен.




Еще раз, очень часто в вашем кластере имеется несколько пространств имен.




Короче, в двух словах это то же самое, что kubectx, только для пространств имен.




kubens kube-system




Теперь все ваши команды по умолчанию выполняются в пространстве имен системы kube-system.




Вы также можете запустить Kubens без флагов, чтобы увидеть список ваших пространств имен.




kube-ps1




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




Но как узнать, на кого вы сейчас нацелены?




Каждый раз постоянно это проверять?




На данный момент, чтобы узнать, вам нужно запустить:




kubens
kubectx
kubectl <my-command>




Чтобы не делать этого, ps1 является плагином zsh, который автоматически покажет вам ваш текущий контекст и пространство имен:







Теперь вы можете увидеть, на какое пространство имен и контекст вы указываете, не выполняя ни одной команды.




Он также очень настраиваемый – вы можете отключить пространство имен или контекст, если вас интересует только что-то одно из них, или вы можете использовать kubeoff, чтобы полностью отключить все это.




popeye




Popeye запускает автоматическое сканирование ресурсов в вашем хранилище и выявляет очевидные проблемы.




Это новый инструмент, который я нашел очень полезным.




Если вы затеяли генеральную уборку в кластере, начните с popeye, и вы получите четкие указания о том, что нужно исправить.







Stern




Вы когда-нибудь использовали логи kubectl?




Заметили, что вы можете следить только за журналами с одного пода одновременно?




Не беспокойтесь больше об этом!




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




Источник: https://itisgood.ru/2020/01/22/kak-nastroit-udobnyj-terminal-kubernetes/



2022-08-07T23:52:21
DevOps