عامل Docker Swarm
عامل Docker Swarm در Status200 یک خوشه Docker Swarm را زیر نظر دارد: گرهها، سرویسها، وظیفهها، پشتهها، شبکههای overlay، سکرتها، پیکربندیها و حجمهای آن، بهعلاوه متریکها و لاگهای هر کانتینر. آن را با Docker Compose روی یک گره مدیر swarm اجرا میکنید و خوشه با همه اینها در Status200 نمایان میشود. مانیتورهای Docker Swarm بر پایه آنچه میرسد هشدار میدهند.
چگونه کار میکند
عامل سه کانتینر است که همه در یک docker-compose.yml تعریف شدهاند:
- کالکتور: یک OpenTelemetry Collector که
docker_statsرا برای متریکهای هر کانتینر میخواند، فایلهای لاگ کانتینرها را دنبال میکند و فایل عکس فوری موجودی را هم دنبال میکند. همهچیز را با نام خوشه شما (docker.swarm.cluster.name) مُهر میزند و آن را روی OTLP به Status200 میفرستد. - پیمایشگر موجودی: یک sidecar کوچک با
curlوjqکه هر ۵ دقیقه API مدیر swarm را میپیماید (/nodes،/services،/tasks،/networks،/secrets،/configs،/volumes) و پشتهها را از برچسب سرویسcom.docker.stack.namespaceبه دست میآورد. به ازای هر شیء یک خط JSON مینویسد تا کالکتور آن را بفرستد. - عامل هوش مصنوعی:
status200-docker-swarm-ai-agent، که فرمانهایdockerدرخواستی Status200 AI را هنگام بررسی یک حادثه یا هشدار روی این خوشه اجرا میکند. فقطخواندنی است، مگر اینکه اجازه اصلاح بدهید (عامل هوش مصنوعی را ببینید).
سه کانتینر روی یک گره مدیر
خوشه با نخستین دادههایش، با نام خوشهای که پیکربندی میکنید، خود را ثبت میکند.
پیش از شروع
- یک گره مدیر swarm برای اجرای عامل: پیمایشگر موجودی و عامل هوش مصنوعی نقطههای پایانی API را فرا میخوانند که فقط گرههای مدیر پاسخ میدهند.
- Docker Engine 20.10 یا بعد از آن با افزونه Docker Compose v2.
- یک کلید دریافت داده. آن را زیر تنظیمات پروژه > تلهمتری و APM > کلیدهای دریافت داده بسازید و مقدارش را کپی کنید.
- HTTPS خروجی از گره به نشانی Status200 شما.
عامل را کجا اجرا کنید
آن را روی یک گره مدیر اجرا کنید. کالکتور کانتینرهای گرهای را گزارش میکند که روی آن اجرا میشود، پس برای متریکهای کانتینر همه گرهها، کالکتور را روی هر گره اجرا کنید، همه با یک DOCKER_SWARM_CLUSTER_NAME؛ پیمایشگر موجودی و عامل هوش مصنوعی فقط لازم است روی یک گره مدیر اجرا شوند. install.sh روی گرهای که مدیر نیست عامل هوش مصنوعی را کنار میگذارد (و عاملی را که پیشتر آنجا نصب کرده بود حذف میکند). عامل هوش مصنوعیای که با این حال روی یک گره کارگر راهاندازی شود، هرگز برای خوشه ثبت نمیشود: منتظر میماند تا گرهاش مدیر شود، پس نمیتواند عامل هوش مصنوعی گره مدیر را کنار بزند. عامل را بهجای Compose بهصورت یک پشته swarm مستقر میکنید؟ پیمایشگر موجودی و عامل هوش مصنوعی را با قید node.role == manager روی گرههای مدیر نگه دارید.
نصب عامل
عامل را نصب و اجرا کنید
install.sh
اسکریپت نصب را دانلود کنید و روی یک گره مدیر اجرا کنید:
curl -sSL <YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent/install.sh -o install.sh sh install.shاسکریپت نشانی Status200 شما، کلید دریافت داده و نامی برای خوشه را میپرسد. در
/opt/status200-docker-swarm-agentنصب میکند، یک فایل.envمینویسد که فقط مالکش میتواند بخواند، و هر سه کانتینر را راه میاندازد. برای کنار گذاشتن عامل هوش مصنوعی،--no-ai-agentرا بیفزایید.Docker Compose
docker-compose.yml،otel-collector-config.yamlوinventory-snapshot.shرا از [پوشه DockerSwarmAgent](<YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent) در یک پوشه تازه روی یک گره مدیر دانلود کنید:curl -fsSL <YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent/docker-compose.yml -o docker-compose.yml curl -fsSL <YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent/otel-collector-config.yaml -o otel-collector-config.yaml curl -fsSL <YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent/inventory-snapshot.sh -o inventory-snapshot.sh chmod +x inventory-snapshot.shکنار آنها یک فایل
.envبسازید. کلید دریافت داده را در خود دارد، پس باchmod 600 .envخصوصیاش نگه دارید:STATUS200_URL=https://status200.ru STATUS200_SERVICE_TOKEN=your-telemetry-ingestion-key DOCKER_SWARM_CLUSTER_NAME=my-swarmعامل را راه بیندازید:
docker compose up -dبررسی کنید که عامل اجرا میشود
docker compose ps docker compose logs --tail 50 status200-docker-swarm-agent status200-docker-swarm-inventorydocker compose psسه کانتینر را فهرست میکند: کالکتور (status200-docker-swarm-agent)، پیمایشگر موجودی (status200-docker-swarm-inventory) و عامل هوش مصنوعی (status200-docker-swarm-ai-agent).خوشه را در Status200 پیدا کنید
محصولات > زیرساخت > Docker Swarm > همه خوشهها را باز کنید. خوشه در چند دقیقه نمایان میشود، و صفحههای گرهها، سرویسها، وظایف، Stacks، شبکهها، اسرار، Configs و حجمها آن پس از نخستین عکس فوری موجودی، در کمتر از ۵ دقیقه پر میشوند. صفحهٔ توپولوژی خوشه stackها، سرویسها، وظایف و گرههایش را روی یک نقشه میکشد: توپولوژی را ببینید.
متغیرهای محیطی
اسکریپت نصب سه مورد نخست را در /opt/status200-docker-swarm-agent/.env مینویسد؛ نصب با Docker Compose آنها را از .env کنار docker-compose.yml میخواند. هر کدام را همانجا بیفزایید یا تغییر دهید، سپس docker compose up -d را در همان پوشه اجرا کنید.
| متغیر | الزامی | توضیح |
|---|---|---|
STATUS200_URL | بله | نشانی Status200 شما، مانند https://status200.ru یا نمونه خودمیزبان شما. اگر نمونه فقط HTTP دارد، از http:// و پورتش استفاده کنید. |
STATUS200_SERVICE_TOKEN | بله | کلید دریافت داده از تنظیمات پروژه > تلهمتری و APM > کلیدهای دریافت داده. |
DOCKER_SWARM_CLUSTER_NAME | خیر | نام خوشه در Status200، و کلیدی که دادههای هر گره با آن به هم میپیوندند: بهصورت ویژگی منبع docker.swarm.cluster.name روی همهچیز مُهر زده میشود. ثابتش نگه دارید: تغییرش در آینده خوشه دومی ثبت میکند. پیشفرض آن docker-swarm است. |
DOCKER_INVENTORY_INTERVAL_SECONDS | خیر | اینکه پیمایشگر موجودی هر چند وقت یک عکس فوری میگیرد، بر حسب ثانیه. پیشفرض آن 300 است. |
DOCKER_API_VERSION | خیر | نسخه API موتور Docker که کالکتور و پیمایشگر موجودی با آن کار میکنند. پیشفرض آن 1.44 است؛ خالی، آن را با دیمن مذاکره میکند (رفع اشکال را ببینید). عامل هوش مصنوعی آن را مذاکره میکند، مگر اینکه یکی را تعیین کنید. |
تنظیمات ویژه عامل هوش مصنوعی زیر عامل هوش مصنوعی آمده است.
آنچه عامل گردآوری میکند
| سیگنال | منبع | کجا نمایش داده میشود |
|---|---|---|
| گرهها، سرویسها، وظیفهها، پشتهها، شبکهها، سکرتها، پیکربندیها و حجمها | پیمایشگر موجودی، از API مدیر swarm | فهرستها و صفحههای جزئیات خوشه |
| شمارشهای خوشه (گرههای آماده، وظیفههای در حال اجرا، سرویسها، پشتهها، …) | همان عکس فوری | کارتهای نمای کلی و نشانهای منوی کناری |
| CPU، حافظه، تعداد فرایندها و زمان کارکرد کانتینر | گیرنده docker_stats | صفحه متریکها |
| لاگهای stdout و stderr کانتینر | گیرنده filelog | صفحه لاگها |
تفاوت آن با عامل Docker
عامل Docker یک میزبان را مدل میکند و host.name و container.runtime=docker را مُهر میزند. عامل Docker Swarm عمداً فقط docker.swarm.cluster.name را مُهر میزند: آنگاه Status200 دادهها را زیر خوشه swarm بایگانی میکند، بهجای اینکه هر گره را میزبانی جداگانه ثبت کند.
برچسبگذاری خوشه با برچسبهای پروژه
ویژگی منبعی که با status200.label. آغاز شود، به برچسب پروژه روی خوشه تبدیل میشود: status200.label.<dimension>=<value> همان برچسب <dimension>:<value> است. ویژگیها را در otel-collector-config.yaml به پردازشگر resource، کنار docker.swarm.cluster.name، بیفزایید:
processors:
resource:
attributes:
# ...existing attributes...
- key: status200.label.team
value: platform
action: upsert
- key: status200.label.env
value: production
action: upsertکالکتور پیکربندیاش را فقط هنگام راهاندازی میخواند: docker compose restart status200-docker-swarm-agent را اجرا کنید. سپس خوشه برچسبهای team:platform و env:production را نشان میدهد. برچسبها بدون توجه به بزرگی و کوچکی حروف مقایسه میشوند، پس برچسب موجود Production بهجای تکرار دوباره به کار میرود، و عامل هرگز برچسبی را که کسی در Status200 افزوده است برنمیدارد.
اجرا بهصورت یک سرویس systemd
برای اینکه عامل همراه گره شروع شود و اگر از کار افتاد دوباره راهاندازی شود، واحد systemd آن را نصب کنید. این واحد فرض میکند عامل در /opt/status200-docker-swarm-agent است، جایی که اسکریپت نصب آن را میگذارد:
sudo curl -fsSL <YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent/systemd/status200-docker-swarm-agent.service -o /etc/systemd/system/status200-docker-swarm-agent.service
sudo systemctl daemon-reload
sudo systemctl enable --now status200-docker-swarm-agentبهروزرسانی عامل
عامل نسخه کالکتوری را که اجرا میکند گزارش میدهد. وقتی این نسخه از نسخهای که این انتشار Status200 ثابت کرده قدیمیتر باشد، در صفحه نمای کلی خوشه، کنار نسخه عامل، یک نشانه هشدار نمایان میشود. آن را انتخاب کنید تا این فرمانها را ببینید.
اسکریپت نصب را دوباره روی گره مدیر اجرا کنید و به پرسشهایش با همان نشانی، کلید و نام خوشه پاسخ دهید. تازهترین فایلها را دانلود میکند، ایمیجها را میکشد و عامل را دوباره راهاندازی میکند:
curl -sSL <YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent/install.sh -o install.sh
sh install.shاسکریپت .env را از روی پاسخهای شما دوباره مینویسد. فقط فهرستهای هدف عامل هوش مصنوعی و کارهای مجاز هوش مصنوعی (STATUS200_AI_INVESTIGATION، STATUS200_AI_FIXES) را نگه میدارد: هر متغیری را که خودتان تنظیم کرده بودید، مانند DOCKER_API_VERSION، دوباره بیفزایید. اصلاحهای هوش مصنوعی را روشن کرده بودید؟ برای روشن ماندنشان، آن را بهصورت STATUS200_AI_ALLOW_WRITES=true sh install.sh اجرا کنید. عامل هوش مصنوعی را کنار گذاشته بودید؟ دوباره --no-ai-agent را بدهید.
با Docker Compose، سه فایل را دوباره در پوشه عامل دانلود کنید (سپس هر تغییری را که در docker-compose.yml داده بودید دوباره اعمال کنید)، و ایمیجها را بکشید و دوباره راهاندازی کنید:
docker compose pull
docker compose up -d --force-recreateنسخه کالکتور در فایلها ثابت شده است، پس فقط کشیدن ایمیجها عامل را جلو نمیبرد.
حذف عامل
cd /opt/status200-docker-swarm-agent
docker compose downعامل هوش مصنوعی
فایل docker-compose.yml مربوط به swarm (و install.sh) عامل هوش مصنوعی Docker Swarm را هم اجرا میکند: کانتینر سوم، status200-docker-swarm-ai-agent (ایمیج status200/resource-ai-agent:release)، که فرمانهای فقطخواندنی docker درخواستی Status200 AI را هنگام بررسی یک حادثه یا هشدار روی این خوشه اجرا میکند — docker node ls، docker service ps web --no-trunc، docker service logs --tail 200 web — و فقط اگر اجازه دهید، اصلاحهایی مانند راهاندازی دوباره تدریجی یک سرویس نامبرده را اعمال میکند. همان STATUS200_URL، STATUS200_SERVICE_TOKEN و DOCKER_SWARM_CLUSTER_NAME کالکتور را میخواند، پس دقیقاً به همین خوشه خدمت میکند، و در Status200 در صفحه هوش مصنوعی > عامل هوش مصنوعی خوشه نمایان میشود.
- بررسیهای هوش مصنوعی بهطور پیشفرض روشناند. همین که عامل وصل شود، Status200 AI حادثهها و هشدارهای این خوشه را با آن بررسی میکند و نمای کلی خوشه وضعیت عامل را نشان میدهد. برای توقف،
STATUS200_AI_INVESTIGATION=falseرا جایی که عامل اجرا میشود تنظیم کنید (تغییر زیر کارهای مجاز هوش مصنوعی در صفحه عامل هوش مصنوعی روشش را نشان میدهد)، یا عامل را کنار بگذارید. - مانند پیمایشگر موجودی، باید روی یک گره مدیر اجرا شود: فرمانهای گره، سرویس و وظیفه فقط روی گرههای مدیر کار میکنند. روی یک گره کارگر هیچ چیزی اجرا نمیکند و تا گره مدیر نشود برای خوشه ثبت نمیشود (
/statusآن دلیلش را میگوید). برای هر خوشه یکی اجرا کنید. - این عامل فقطخواندنی است، مگر اینکه
STATUS200_AI_ALLOW_WRITES=trueرا در.envتنظیم کنید وdocker compose up -dرا اجرا کنید (یاinstall.shرا با آن اجرا کنید؛ نصبکنندهSTATUS200_AI_ALLOW_WRITES،STATUS200_AI_INVESTIGATION،STATUS200_AI_FIXES،STATUS200_AI_WRITE_TARGETSوSTATUS200_AI_PROTECTED_TARGETSرا از محیط خود در.envمینویسد، و اجرای دوباره برای چهار مورد آخر همان چیزی را نگه میدارد که.envاز پیش دارد، مگر اینکه آن متغیر را بدهید، حتی خالی)؛STATUS200_AI_WRITE_TARGETS(الگوهای glob نام سرویسها و گرهها، برای نمونهweb_*,api_*) محدود میکند که یک اصلاح به چه چیزی دست بزند.STATUS200_AI_FIXESدر همان.envتعیین میکند اصلاحها چگونه اجرا شوند —ask-for-approval(یک نفر هر کدام را تأیید میکند)،automaticیاbypass-approval— و صفحه عامل هوش مصنوعی آن را فقطخواندنی نشان میدهد (کارهای مجاز هوش مصنوعی، تعیینشده توسط عامل). تخلیه یک گره همیشه به تأیید یک نفر نیاز دارد، در هر حالتی. - با سوکت Docker سوارشده و بهعنوان root اجرا میشود، چون مالک سوکت root است — و روی گره مدیر، هر کس بتواند از سوکت استفاده کند کل swarm را در دست دارد، چه
:roباشد چه نباشد. مرز، سیاست فرمانهای عامل است: هرگز سرویس یا پشتهای نمیسازد یا حذف نمیکند، هرگز به سکرتها یا پیکربندیها دست نمیزند، و هرگز خودش، کالکتور، پیمایشگر موجودی یا هر چیزی درSTATUS200_AI_PROTECTED_TARGETS(الگوهای glob نام سرویسها و گرهها) را تغییر نمیدهد. install.sh --no-ai-agentآن را کنار میگذارد؛ یا سرویسstatus200-docker-swarm-ai-agentرا ازdocker-compose.ymlحذف کنید.
آنچه میتواند اجرا کند، اینکه اصلاحها چگونه کار میکنند و چگونه اشکال آن را رفع کنید: عاملهای AI زیرساخت.
رفع اشکال
نخست اسکریپت تشخیصی را اجرا کنید
عامل با یک اسکریپت، [troubleshoot.sh](<YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent/troubleshoot.sh)، عرضه میشود که کل زنجیره را بررسی میکند: کانتینرها، اینکه پیمایشگر موجودی روی یک گره مدیر است (docker node ls)، فایل عکس فوری، نام خوشهای که روی همهچیز مُهر زده میشود، شکل توکن، متریکهای خود کالکتور، و اینکه آیا Status200 کلید دریافت داده را میپذیرد. این بررسی آخر از همه مهمتر است. Status200 کلید بد را با 401 رد میکند (422 برای کلید غیرفعال یا کلید مرورگر)، و کالکتور آن را به ازای هر دسته فقط بهصورت یک خط Exporting failed در لاگ مینویسد، که آسان از چشم میافتد. اسکریپت GET <url>/otlp/v1/validate را میپرسد تا یک 200 (معتبر) یا 401 (نامعتبر) مستقیم بگیرد. آن را روی گره مدیر اجرا کنید:
curl -sSL <YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerSwarmAgent/troubleshoot.sh -o troubleshoot.sh
bash troubleshoot.sh # add -d <dir> if you installed outside /opt/status200-docker-swarm-agentخوشه هرگز نمایان نمیشود
نخست اسکریپت تشخیصی را اجرا کنید. وگرنه لاگهای کالکتور را بخوانید (docker compose logs status200-docker-swarm-agent)، بررسی کنید که STATUS200_SERVICE_TOKEN و STATUS200_URL در .env درست باشند، و اینکه گره به نشانی Status200 شما میرسد.
هیچ موجودیای نمایان نمیشود
بررسی کنید که پیمایشگر موجودی روی یک گره مدیر اجرا میشود: docker node ls باید آنجا موفق شود. سپس در لاگهایش دنبال خطهای failed to emit ... بگردید: docker compose logs status200-docker-swarm-inventory.
خوشه به قطعشده تغییر میکند
وقتی Status200 به مدت ۱۵ دقیقه هیچ چیزی از یک خوشه دریافت نکند، خوشه قطعشده میشود؛ Status200 هر ۵ دقیقه بررسی میکند، و زمانی که خودش داده دریافت نمیکرد به حساب نمیآید. مطمئن شوید کانتینر کالکتور روشن میماند: docker compose ps آن را نشان میدهد.
کالکتور با "client version is too new" بسته میشود
لاگهای کالکتور نشان میدهند:
Error: cannot start pipelines: failed to start "docker_stats" receiver:
Error response from daemon: client version 1.44 is too new.
Maximum supported API version is 1.41بالاترین نسخه API دیمن پایینتر از پیشفرض 1.44 است (Docker Engine 20.10 در 1.41 میایستد)، پس گیرنده docker_stats نمیتواند راه بیفتد و کانتینر پشت سر هم دوباره راهاندازی میشود. بالاترین نسخه دیمن را پیدا کنید:
docker version --format '{{ .Server.APIVersion }}'DOCKER_API_VERSION را در .env روی همان مقدار تنظیم کنید و docker compose up -d را روی هر گرهای که عامل روی آن اجرا میشود اجرا کنید. دیمنهای تازهتر همچنان نسخههای قدیمیتر API را ارائه میکنند، پس این تنظیم پس از ارتقای Docker هم کار میکند. یا DOCKER_API_VERSION= (خالی) را تنظیم کنید تا کالکتور بهجای ثابت کردن یک نسخه، آن را با دیمن مذاکره کند.
خوشه با نام نادرست نمایان میشود
نام خوشه از DOCKER_SWARM_CLUSTER_NAME میآید. آن را در .env تغییر دهید و docker compose up -d را اجرا کنید: نام تازه بهجای تغییر نام خوشه قبلی، خوشه تازهای ثبت میکند.
CPU وظیفهها خطی صاف است
یک otel-collector-config.yaml قدیمیتر عدد CPU را که خودِ گیرنده docker_stats حساب میکند میفرستد. از کالکتور 0.150.0 به بعد، گیرنده آن را از یک خوانش آمار به دست میآورد: کل CPU که یک کانتینر از زمان شروعش مصرف کرده، تقسیم بر کل CPU که گره از زمان راهاندازی مصرف کرده است. این خط بهسختی تکان میخورد و همراه بار تغییر نمیکند، در حالی که container.cpu.usage.total تغییر میکند. نسخه کالکتور تغییر نکرده است، پس هیچ نشانه هشداری دیده نمیشود: فایلهای عامل را همانطور که بهروزرسانی عامل نشان میدهد دوباره دانلود کنید. از خوانش دوم به بعد، کالکتور CPU مصرفشده هر کانتینر در هر بازه ۳۰ ثانیهای را میفرستد. خوانشهایی که پیشتر ذخیره شدهاند همانطور که بودند میمانند.