شب ۱۳: TLS، اطلاعات محرمانه و دسترسپذیری بالا در Swarm¶
بخش ۱۳ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثالها مطابق منبع با Traefik Proxy v3.7 نوشته شدهاند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزمودهشده یا digest مشخصی را ثابت کنید. تمرینها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.
فهرست کامل دورهٔ ترافیک در ۳۰ شب
هدفهای یادگیری¶
- تحویل دادههای TLS بدون جاسازی در فایل stack.
- طراحی همزمان جانمایی نمونهها و انتشار پورت.
- توضیح ضرورت صدور خارجی گواهی برای دسترسپذیری بالای قابلاتکا.
تمرین عملی: استفاده از secretها و configهای Swarm¶
از گواهیهای آزمایشگاهی شب ۰۶ secret بسازید؛ کلید خصوصی را commit نکنید:
docker secret create whoami_tls_crt certs/whoami.crt
docker secret create whoami_tls_key certs/whoami.key
# tls-dynamic.yml, stored as a Swarm config
tls:
certificates:
- certFile: /run/secrets/whoami_tls_crt
keyFile: /run/secrets/whoami_tls_key
options:
default: {minVersion: VersionTLS12, sniStrict: true}
services:
traefik:
command:
- --providers.file.filename=/etc/traefik/dynamic/tls.yml
- --entrypoints.websecure.address=:443
ports:
- target: 443
published: 443
mode: ingress
secrets: [whoami_tls_crt, whoami_tls_key]
configs:
- source: traefik_tls_v1
target: /etc/traefik/dynamic/tls.yml
deploy:
replicas: 2
placement:
max_replicas_per_node: 1
whoami:
deploy:
labels:
traefik.http.routers.whoami.entrypoints: websecure
traefik.http.routers.whoami.tls: "true"
secrets:
whoami_tls_crt: {external: true}
whoami_tls_key: {external: true}
configs:
traefik_tls_v1: {external: true}
docker stack deploy -c swarm.yml edge
docker service ps edge_traefik
openssl s_client -connect 127.0.0.1:443 \
-servername whoami.example.test -CAfile certs/lab-ca.crt </dev/null
docker node update --availability drain LAB_NODE
docker service ps edge_traefik
docker node update --availability active LAB_NODE
configها و secretهای Swarm تغییرناپذیرند؛ برای چرخش، جایگزینی نسخهدار بسازید، سرویس را بهروز کنید، اعتبارسنجی کنید و بعداً شیء قدیمی بلااستفاده را حذف کنید. برای گواهی عمومی با چند نمونه، از صدور خارجی مشابه cert-manager، سامانهٔ secret یا job کنترلشدهٔ توزیع گواهی استفاده کنید. فایل محلی ACME در Traefik Proxy را نمیتوان با ایمنی همزمان به اشتراک گذاشت.
فهرست بررسی معماری¶
- حداقل دو گرهٔ واجد شرایط با نمونههای جدا از هم وجود دارد.
- متعادلکنندهٔ بار بالادستی فقط گرههای ورودی آماده را از نظر سلامت بررسی میکند.
- حالت پورت و رفتار IP کلاینت مستند است.
- صدور، تمدید، توزیع و بازگشت گواهی هرکدام مسئول مشخص دارند.
- نام secret و config نسخهدار است؛ نسخههای قدیمی تا پایان اعتبارسنجی باقی میمانند.
- هیچ کلید خصوصی در YAML مربوط به stack، برچسبها، لاگها یا Git وجود ندارد.
نکتههای عیبیابی¶
- مسیر secret در دسترس نیست: secret به سرویس اعطا نشده یا نام مقصد فرق دارد.
- هر دو نمونه روی یک گرهاند: قاعدهٔ جانمایی، توپولوژی یا تعداد گرههای واجد شرایط کافی نیست.
- انتشار host همراه چند نمونه: روی هر گرهٔ ورودی واجد شرایط یک task بگذارید و متعادلکنندهٔ بار خارجی را مطابق آن هدایت کنید.
- گواهی جدید بارگذاری نشده است: ارجاع config یا secret نسخهدار را بهروز کنید و اگر خود mount تغییر کرده، بهروزرسانی سرویس را اجبار کنید.
خودآزمایی¶
- چرا config نسخهدار مفید است؟ configهای Swarm تغییرناپذیرند و نام نسخهدار بازگشت را قابلپیشبینی میکند.
max_replicas_per_node: 1از چه چیزی جلوگیری میکند؟ قرارگرفتن دو نمونه در دامنهٔ خرابی یک گره.- چرا
acme.jsonرا با NFS مشترک نکنیم؟ مسئله دسترسی همزمان به وضعیت است، نه فقط ذخیرهسازی پایدار. - اثبات کنید: یک گره را drain کنید و از نمونهٔ دیگر درخواست TLS موفق بگیرید.