با درود! این مقاله کوتاهی است که به این سؤالات پاسخ می دهد: "فرستاده چیست؟"، "چرا به آن نیاز است؟" و "از کجا شروع کنیم؟"
این چیست؟
Envoy یک متعادل کننده L4-L7 است که به زبان C++ نوشته شده است و بر عملکرد و در دسترس بودن بالا تمرکز دارد. از یک طرف، این به نوعی مشابه nginx و هاپروکسی است که از نظر عملکرد با آنها قابل مقایسه است. از طرف دیگر، بیشتر به سمت معماری میکروسرویس گرایش دارد و عملکردی بدتر از متعادل کننده های java و go مانند zuul یا traefik ندارد.
جدول مقایسه هاپروکسی / nginx / فرستاده، ادعا نمی کند که حقیقت مطلق است، اما یک تصویر کلی ارائه می دهد.
انجیناکس
هاپروکسی
فرستاده
صفت
ستاره در github
11.2k/آینه
1.1k/آینه
12.4k
27.6k
نوشته شده در
C
C
++C
go
API
هیچ
فقط سوکت/فشار
هواپیمای دیتا/کشش
کشیدن
چک سلامت فعال
هیچ
بله
بله
بله
ردیابی باز
افزونه خارجی
هیچ
بله
بله
J.W.T.
افزونه خارجی
هیچ
بله
هیچ
گسترش
Lua/C
Lua/C
Lua/C++
هیچ
برای چه؟
این یک پروژه جوان است، چیزهای زیادی از دست رفته است، برخی در اوایل آلفا. ولی فرستاده، همچنین به دلیل جوانی خود، به سرعت در حال توسعه است و در حال حاضر دارای بسیاری از ویژگی های جالب است: پیکربندی پویا، بسیاری از فیلترهای آماده، یک رابط کاربری ساده برای نوشتن فیلترهای خود.
حوزه های کاربردی از این نتیجه می گیرند، اما ابتدا 2 ضد الگو وجود دارد:
- پس زدن استاتیک.
واقعیت این است که در حال حاضر در فرستاده بدون پشتیبانی کش بچه های گوگل این را امتحان می کنند
در حال حاضر، از nginx برای استاتیک استفاده کنید.
- پیکربندی استاتیک
می توانید از آن استفاده کنید، اما فرستاده این چیزی نیست که برای آن ایجاد شده است. ویژگیهای یک پیکربندی استاتیک در معرض نمایش قرار نخواهند گرفت. لحظات زیادی وجود دارد:
هنگام ویرایش پیکربندی در yaml، اشتباه میکنید، توسعهدهندگان را به خاطر پرحرفی سرزنش میکنید و فکر میکنید که پیکربندیهای nginx/haproxy، اگرچه ساختار کمتری دارند، اما مختصرتر هستند. نکته همین است. پیکربندی Nginx و Haproxy برای ویرایش با دست ایجاد شده است و فرستاده برای تولید از کد. کل پیکربندی در شرح داده شده است
سناریوهای استقرار Canary، b/g و موارد دیگر معمولاً فقط در یک پیکربندی پویا اجرا می شوند. من نمی گویم که این کار را نمی توان به صورت ایستا انجام داد، همه ما این کار را انجام می دهیم. اما برای این کار باید عصا را در هر یک از متعادل کننده ها در داخل بپوشید فرستاده شامل.
وظایفی که فرستاده برای آنها ضروری است:
- تعادل ترافیک در سیستم های پیچیده و پویا این شامل مش سرویس نیز می شود، اما لزوما تنها یکی نیست.
- نیاز به عملکرد ردیابی توزیع شده، مجوز پیچیده یا سایر عملکردهایی که در آن موجود است فرستاده خارج از جعبه یا به راحتی پیاده سازی شده است، اما در nginx/haproxy باید توسط lua و پلاگین های مشکوک احاطه شوید.
هر دو، در صورت لزوم، عملکرد بالایی را ارائه می دهند.
چطور کار می کند؟
Envoy در باینری ها فقط به عنوان یک تصویر داکر توزیع می شود. تصویر قبلاً حاوی نمونه ای از پیکربندی استاتیک است. اما ما فقط برای درک ساختار به آن علاقه مندیم.
envoy.yaml پیکربندی استاتیک
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite: www.google.com
cluster: service_google
http_filters:
- name: envoy.router
clusters:
- name: service_google
connect_timeout: 0.25s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_google
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.google.com
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
sni: www.google.com
پیکربندی پویا
برای چه مشکلی دنبال راه حل هستیم؟ شما نمیتوانید پیکربندی متعادلکننده بار را در حالت بارگذاری مجدد بارگیری کنید؛ مشکلات «کوچکی» به وجود میآیند:
- اعتبار سنجی پیکربندی
پیکربندی می تواند بزرگ باشد، می تواند بسیار بزرگ باشد، اگر یکباره آن را بیش از حد بارگذاری کنیم، احتمال خطا در جایی افزایش می یابد.
- ارتباطات طولانی مدت
هنگام راه اندازی اولیه یک شنونده جدید، باید مراقب اتصالات در حال اجرا بر روی شنونده قدیمی باشید؛ اگر تغییرات مکرر رخ می دهد و اتصالات طولانی مدت وجود دارد، باید به دنبال مصالحه باشید. سلام، ورود کوبرنت به nginx.
- بررسی های سلامت فعال
اگر چکهای سلامت فعال داریم، باید قبل از ارسال ترافیک، همه آنها را در پیکربندی جدید بررسی کنیم. اگر بالادستی های زیادی وجود داشته باشد، این زمان می برد. سلام هاپروکسی.
چگونه این در حل می شود فرستادهبا بارگذاری کانفیگ به صورت پویا، با توجه به مدل pool، می توانید آن را به قسمت های جداگانه تقسیم کنید و بخشی را که تغییر نکرده است، دوباره مقدار دهی اولیه نکنید. به عنوان مثال، شنونده، که برای شروع مجدد هزینه بر است و به ندرت تغییر می کند.
پیکربندی فرستاده (از فایل بالا) دارای موجودیت های زیر است:
- شنونده - شنونده در یک ip/port خاص معلق است
- میزبان مجازی - میزبان مجازی با نام دامنه
- مسیر - قانون تعادل
- خوشه - گروهی از بالادست ها با پارامترهای متعادل کننده
- نقطه پایانی - آدرس نمونه بالادست
هر یک از این موجودات به اضافه تعدادی دیگر را می توان به صورت پویا پر کرد؛ برای این، پیکربندی آدرس سرویس را مشخص می کند که پیکربندی از آنجا دریافت می شود. سرویس می تواند REST یا gRPC باشد، gRPC ترجیح داده می شود.
سرویس ها به ترتیب به نام های LDS، VHDS، RDS، CDS و EDS نامگذاری می شوند. شما می توانید پیکربندی استاتیک و پویا را با این محدودیت ترکیب کنید که یک منبع پویا را نمی توان در یک منبع استاتیک مشخص کرد.
برای اکثر وظایف، اجرای سه سرویس آخر کافی است، آنها ADS (سرویس کشف جمعی) نامیده می شوند.
پیکربندی به شکل زیر است:
پیکربندی پویا envoy.yaml
dynamic_resources:
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: xds_clr
cds_config:
ads: {}
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
rds:
route_config_name: local_route
config_source:
ads: {}
http_filters:
- name: envoy.router
clusters:
- name: xds_clr
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: xds_clr
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: xds
port_value: 6565
در هنگام راه اندازی فرستاده با این پیکربندی، به صفحه کنترل متصل می شود و سعی می کند پیکربندی RDS، CDS و EDS را درخواست کند. نحوه انجام فرآیند تعامل شرح داده شده است
به اختصار، فرستاده درخواستی را ارسال می کند که نوع منبع درخواستی، نسخه و پارامترهای گره را نشان می دهد. در پاسخ، یک منبع و یک نسخه دریافت می کند؛ اگر نسخه روی صفحه کنترل تغییر نکرده باشد، پاسخ نمی دهد.
4 گزینه تعامل وجود دارد:
- یک جریان gRPC برای همه انواع منابع، وضعیت کامل منبع ارسال می شود.
- نهرهای مجزا، کاملا سالم.
- یک جریان، حالت افزایشی.
- جریان های مجزا، حالت افزایشی.
xDS افزایشی به شما امکان می دهد ترافیک بین صفحه کنترل و فرستاده، این برای پیکربندی های بزرگ مرتبط است. اما این تعامل را پیچیده می کند؛ درخواست شامل فهرستی از منابع برای لغو اشتراک و اشتراک است.
مثال ما از ADS استفاده می کند - یک جریان برای RDS، CDS، EDS و حالت غیر افزایشی. برای فعال کردن حالت افزایشی، باید مشخص کنید api_type: DELTA_GRPC
از آنجایی که درخواست حاوی پارامترهای گره است، می توانیم منابع مختلفی را برای نمونه های مختلف به صفحه کنترل ارسال کنیم فرستاده، این برای ساخت مش سرویس مناسب است.
دست گرمی بازی کردن
بر فرستاده هنگام راه اندازی یا هنگام دریافت پیکربندی جدید از صفحه کنترل، فرآیند گرم کردن منابع راه اندازی می شود. به گرم کردن شنونده و گرم کردن خوشه ای تقسیم می شود. اولی زمانی راه اندازی می شود که تغییراتی در RDS/LDS وجود دارد، دومی زمانی که CDS/EDS وجود دارد. این بدان معنی است که اگر فقط بالادستی ها تغییر کنند، شنونده بازسازی نمی شود.
در طول فرآیند گرم کردن، منابع وابسته از صفحه کنترل در طول تایم اوت انتظار می رود. اگر مهلت زمانی رخ دهد، مقداردهی اولیه موفقیت آمیز نخواهد بود و شنونده جدید شروع به گوش دادن در پورت نمی کند.
دستور اولیه: EDS، CDS، بررسی سلامت فعال، RDS، LDS. با فعال بودن بررسیهای سلامت فعال، ترافیک فقط پس از یک بررسی سلامت موفق به بالادست میشود.
اگر شنونده دوباره ایجاد شود، شنونده قدیمی به حالت DRAIN می رود و پس از بسته شدن همه اتصالات یا منقضی شدن مهلت زمانی حذف می شود. --drain-time-s
، پیش فرض 10 دقیقه است.
ادامه دارد
منبع: www.habr.com