Sticky Session พร��อม Docker Swarm (CE) บน Debian 9

บทนำ

Docker Swarm เปลี่ยนเซิร์ฟเวอร์ส่วนบุคคลของคุณให้กลายเป็นคลัสเตอร์ของคอมพิวเตอร์ อำนวยความสะดวกในการปรับขนาดความพร้อมใช้งานสูงและการทำโหลดบาลานซ์ Swarm load-balancer ใช้กลยุทธ์ load-balancing round-robin และสิ่งนี้อาจรบกวนการทำงานที่ถูกต้องของแอปพลิเคชั่น stateful (แบบดั้งเดิม) ซึ่งต้องการเซสชันเหนียวบางรูปแบบเพื่อให้สามารถติดตั้งได้พร้อมกับอินสแตนซ์จำนวนมาก Docker Enterprise Edition รองรับเซสชั่นเหนียว Layer-7 แต่ในคู่มือนี้เราจะมุ่งเน้นไปที่ Docker รุ่นฟรี (CE) ในการใช้งานเซสชันที่ติดหนึบเราจะใช้ Traefik

ข้อกำหนดเบื้องต้น

  • อย่างน้อยสองอินสแตนซ์ Debian 9 ใหม่ที่ปรับใช้และอัพเดตในซับเน็ตเดียวกันกับเครือข่ายส่วนตัวที่เปิดใช้งาน
  • Docker CE ติดตั้งในอินสแตนซ์เหล่านี้
  • อินสแตนซ์ควรเป็นส่วนหนึ่งของ Swarm เดียวกันและควรสามารถสื่อสารระหว่างกันผ่านเครือข่ายส่วนตัว
  • ความรู้เดิมของ Docker และ Docker Swarm
  • ผู้ใช้ที่ไม่ใช่รูทที่มีsudoสิทธิ์ใช้งาน(เป็นทางเลือก แต่ขอแนะนำอย่างยิ่งให้อย่าใช้ผู้ใช้รูท)

ในการกวดวิชานี้เราจะใช้สองกรณี Vultr ที่มีที่อยู่ IP เอกชนและ192.168.0.100 192.168.0.101ทั้งคู่เป็นโหนดตัวจัดการ Docker Swarm (ซึ่งไม่เหมาะสำหรับการผลิต แต่เพียงพอสำหรับบทช่วยสอนนี้)

ฉันเป็นใคร

บทช่วยสอนนี้ใช้jwilder/whoamiอิมเมจนักเทียบท่าเป็นแอปพลิเคชันสาธิต คอนเทนเนอร์แบบง่ายนี้จะตอบสนองต่อการเรียกส่วนที่เหลือด้วยชื่อของคอนเทนเนอร์ที่ตอบสนองทำให้ง่ายต่อการทดสอบว่าเซสชันที่ติดหนึบทำงานอยู่หรือไม่ เห็นได้ชัดว่าภาพนี้ใช้เพื่อการสาธิตเท่านั้นและจะต้องแทนที่ด้วยภาพของแอปพลิเคชันของคุณเอง

บริการ whoami มีการกำหนดค่าดังนี้:

sudo docker network create whoaminet -d overlay
sudo docker service create --name whoami-service --mode global --network whoaminet --publish "80:8000"  jwilder/whoami
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

หากในที่สุดเราก็มาcurlถึงจุดสิ้นสุดของ whoami REST ที่http://192.168.0.100/เราสามารถเห็นการปรับสมดุลโหลดรอบในโรบินของ Docker Swarm ในที่ทำงาน:

curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3

ไม่มีประโยชน์ในการทดสอบสิ่งนี้กับเบราว์เซอร์สมัยใหม่เช่น Chrome หรือ Firefox เพราะได้รับการออกแบบมาเพื่อให้การเชื่อมต่อมีชีวิตชีวาและตัวโหลดบาลานซ์ของ Docker Swarm จะเปลี่ยนไปที่คอนเทนเนอร์อื่นในการเชื่อมต่อใหม่แต่ละครั้งเท่านั้น หากคุณต้องการทดสอบสิ่งนี้ด้วยเบราว์เซอร์คุณจะต้องรออย่างน้อย 30 วินาทีก่อนที่การเชื่อมต่อจะปิดก่อนที่จะรีเฟรชอีกครั้ง

การตั้งค่า Traefik

Traefik รองรับหรือไม่โดยเฉพาะกับ Docker Swarm สามารถตรวจจับและลงทะเบียนหรือยกเลิกการลงทะเบียนภาชนะบรรจุได้ทันทีและสื่อสารกับแอพพลิเคชั่นของคุณผ่านเครือข่ายโอเวอร์เลย์ภายใน Traefik ต้องการข้อมูลบางอย่างเกี่ยวกับแอปพลิเคชันของคุณก่อนที่จะสามารถเริ่มจัดการคำขอ ข้อมูลนี้ให้แก่ Traefik โดยการเพิ่มป้ายกำกับในบริการ Swarm ของคุณ:

sudo docker service update --label-add "traefik.docker.network=whoaminet" --label-add "traefik.port=8000" --label-add "traefik.frontend.rule=PathPrefix:/" --label-add "traefik.backend.loadbalancer.stickiness=true" whoami-service

รายการต่อไปนี้อธิบายความหมายของแต่ละป้ายกำกับ:

  • traefik.docker.network : เครือข่ายโอเวอร์เลย์ Docker ที่ Traefik จะสื่อสารกับบริการของคุณ
  • traefik.port : พอร์ตที่บริการของคุณกำลังรับฟัง (นี่คือพอร์ตที่เปิดเผยภายในไม่ใช่พอร์ตที่เผยแพร่)
  • traefik.frontend.rule: PathPrefix:/ ผูกรูทบริบท ' /' กับบริการนี้
  • traefik.backend.loadbalancer.stickiness : เปิดใช้งานเซสชันที่ติดหนึบสำหรับบริการนี้

ตอนนี้whoami-serviceการกำหนดค่าด้วยป้ายกำกับที่ต้องการเราสามารถเพิ่มบริการ Traefik ไปยังฝูง:

sudo docker service create --name traefik -p8080:80 -p9090:8080 --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock --mode=global --constraint 'node.role == manager' --network whoaminet traefik --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG

คำสั่งนี้ทำหลายอย่างพร้อมกันดังที่แสดงในรายการต่อไปนี้:

  • --name traefik : ชื่อบริการใหม่ของ Docker คือ Traefik
  • -p8080:80: เราเผยแพร่พอร์ตของ Traefik 80ไปยังพอร์ต8080เพราะพอร์ต80ถูกใช้งานโดยบริการ whoami ของเรา
  • -p9090:8080 : เราเผยแพร่เว็บอินเตอร์เฟสของ Traefik ไปยังพอร์ต 9090
  • --mount ... : เราติดตั้ง Docker Socket ลงในคอนเทนเนอร์เพื่อให้ Traefik สามารถเข้าถึงรันไทม์ของ Docker ของโฮสต์ได้
  • --global : เราต้องการคอนเทนเนอร์ Traefik บนแต่ละโหนดของผู้จัดการเพื่อความพร้อมใช้งานสูง
  • --constraint 'node.role == manager': เราต้องการให้ Traefik ทำงานบนโหนดผู้จัดการเท่านั้นเนื่องจากโหนดผู้ปฏิบัติงานไม่สามารถให้ข้อมูลที่จำเป็นกับ Traefik ได้ ตัวอย่างเช่นdocker service lsบนโหนดงานไม่ทำงานดังนั้น Traefik จะไม่สามารถค้นพบว่าบริการใดกำลังทำงานอยู่
  • --network whoaminet: เชื่อมต่อ Traefik กับเครือข่ายเดียวกันกับเราwhoami-serviceไม่เช่นนั้นจะไม่สามารถเชื่อมต่อได้ ก่อนหน้านี้เราบอก Traefik ให้เชื่อมต่อกับบริการของเราผ่านเครือข่ายนี้พร้อมกับtraefik.docker.networkฉลาก
  • traefik : บอกนักเทียบท่าให้ใช้อิมเมจ Trafik docker ล่าสุดสำหรับบริการนี้
  • --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG: อาร์กิวเมนต์บรรทัดคำสั่งถูกส่งโดยตรงไปยัง Traefik เพื่ออนุญาตให้รันในโหมด Docker swarm DEBUGเป็นทางเลือกที่นี่ แต่น่าสนใจระหว่างการตั้งค่าและสำหรับบทช่วยสอนนี้

สิ่งที่เหลืออยู่ที่ต้องทำคือเปิดพอร์ตที่จำเป็นในไฟร์วอลล์ Debian:

sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT

มันทำงานอย่างไร

ทันทีที่ Traefik เริ่มต้นขึ้นคุณจะเห็นในบันทึกที่ Traefik ค้นพบwhoamiภาชนะทั้งสอง นอกจากนี้ยังแสดงชื่อคุกกี้ซึ่งจะใช้เพื่อจัดการกับเซสชันเหนียว

time="2018-11-25T13:17:30Z" level=debug msg="Configuration received from provider docker: {\"backends\":{\"backend-whoami-service\":{\"servers\":{\"server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05\":{\"url\":\"http://10.0.0.5:8000\",\"weight\":1},\"server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6\":{\"url\":\"http://10.0.0.4:8000\",\"weight\":1}},\"loadBalancer\":{\"method\":\"wrr\",\"stickiness\":{}}}},\"frontends\":{\"frontend-PathPrefix-0\":{\"entryPoints\":[\"http\"],\"backend\":\"backend-whoami-service\",\"routes\":{\"route-frontend-PathPrefix-0\":{\"rule\":\"PathPrefix:/\"}},\"passHostHeader\":true,\"priority\":0,\"basicAuth\":null}}}"
time="2018-11-25T13:17:30Z" level=debug msg="Wiring frontend frontend-PathPrefix-0 to entryPoint http"
time="2018-11-25T13:17:30Z" level=debug msg="Creating backend backend-whoami-service"
time="2018-11-25T13:17:30Z" level=debug msg="Adding TLSClientHeaders middleware for frontend frontend-PathPrefix-0"
time="2018-11-25T13:17:30Z" level=debug msg="Creating load-balancer wrr"
time="2018-11-25T13:17:30Z" level=debug msg="Sticky session with cookie _a49bc"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05 at http://10.0.0.5:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6 at http://10.0.0.4:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating route route-frontend-PathPrefix-0 PathPrefix:/"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :80"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :8080"

หากเราขดตัวhttp://192.168.0.100:8080เราจะเห็นว่า_a49bcมีการตั้งค่าคุกกี้ใหม่:

curl -v http://192.168.0.100:8080
* About to connect() to 192.168.0.100 port 8080 (#0)
*   Trying 192.168.0.100...
* Connected to 192.168.0.100 (192.168.0.100) port 8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.0.100:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 17
< Content-Type: text/plain; charset=utf-8
< Date: Sun, 25 Nov 2018 13:18:40 GMT
< Set-Cookie: _a49bc=http://10.0.0.5:8000; Path=/
<
I'm a6a8c9294fc3
* Connection #0 to host 192.168.0.100 left intact

หากในการโทรครั้งต่อไปเราส่งคุกกี้นี้ไปยัง Traefik เราจะถูกส่งต่อไปยังคอนเทนเนอร์เดียวกันเสมอ:

curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3

คุกกี้ไม่มีอะไรนอกจากที่อยู่ IP ภายในของคอนเทนเนอร์ที่ Traefik ควรส่งไปขอ หากคุณเปลี่ยนเป็นค่าคุกกี้เป็นhttp://10.0.0.4:8000ดังนั้นคำขอจะถูกส่งต่อไปยังคอนเทนเนอร์อื่นอย่างมีประสิทธิภาพ หากคุกกี้ไม่เคยถูกส่งไปยัง Traefik อีกครั้งเซสชันที่ติดหนึบจะไม่ทำงานและการร้องขอจะมีความสมดุลระหว่างคอนเทนเนอร์ของแอปพลิเคชันและคอนเทนเนอร์ Traefik

นั่นคือทั้งหมดที่จำเป็นสำหรับการตั้งค่า Layer 7 Sticky Sessions ใน Docker CE บน Debian 9

ฝากความเห็น

วิธีการติดตั้ง Directus 6.4 CMS บน CentOS 7 LAMP VPS

วิธีการติดตั้ง Directus 6.4 CMS บน CentOS 7 LAMP VPS

เรียนรู้วิธีการติดตั้ง Directus 6.4 CMS บน CentOS 7; ระบบการจัดการเนื้อหา Headless ที่มีความยืดหยุ่นสูงและปลอดภัย

ตั้งค่า Nginx บน Ubuntu เพื่อสตรีมวิดีโอสด HLS

ตั้งค่า Nginx บน Ubuntu เพื่อสตรีมวิดีโอสด HLS

เรียนรู้วิธีการตั้งค่า Nginx บน Ubuntu สำหรับการสตรีมวิดีโอสด HLS ด้วยคำแนะนำที่ชัดเจนและเป็นประโยชน์

การสำรองข้อมูลยอดนิยมด้วย Percona XtraBackup บนแอพ WordPress แบบคลิกเดียว

การสำรองข้อมูลยอดนิยมด้วย Percona XtraBackup บนแอพ WordPress แบบคลิกเดียว

เรียนรู้การใช้ Percona XtraBackup สำหรับการสำรองข้อมูลด้วยวิธีที่เป็นระบบและง่ายดายบน WordPress ออนไลน์ของคุณ

ReactOS: นี่คืออนาคตของ Windows หรือไม่?

ReactOS: นี่คืออนาคตของ Windows หรือไม่?

ReactOS ซึ่งเป็นโอเพ่นซอร์สและระบบปฏิบัติการฟรีพร้อมเวอร์ชันล่าสุดแล้ว สามารถตอบสนองความต้องการของผู้ใช้ Windows ยุคใหม่และล้ม Microsoft ได้หรือไม่? มาหาข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบเก่านี้ แต่เป็นประสบการณ์ OS ที่ใหม่กว่ากัน

AI สามารถต่อสู้กับการโจมตีของแรนซัมแวร์ที่เพิ่มขึ้นได้หรือไม่

AI สามารถต่อสู้กับการโจมตีของแรนซัมแวร์ที่เพิ่มขึ้นได้หรือไม่

การโจมตีของ Ransomware กำลังเพิ่มขึ้น แต่ AI สามารถช่วยจัดการกับไวรัสคอมพิวเตอร์ตัวล่าสุดได้หรือไม่? AI คือคำตอบ? อ่านที่นี่รู้ว่า AI boone หรือ bane

เชื่อมต่อผ่าน WhatsApp Desktop App 24*7

เชื่อมต่อผ่าน WhatsApp Desktop App 24*7

ในที่สุด Whatsapp ก็เปิดตัวแอพเดสก์ท็อปสำหรับผู้ใช้ Mac และ Windows ตอนนี้คุณสามารถเข้าถึง Whatsapp จาก Windows หรือ Mac ได้อย่างง่ายดาย ใช้ได้กับ Windows 8+ และ Mac OS 10.9+

AI จะนำกระบวนการอัตโนมัติไปสู่อีกระดับได้อย่างไร

AI จะนำกระบวนการอัตโนมัติไปสู่อีกระดับได้อย่างไร

อ่านข้อมูลนี้เพื่อทราบว่าปัญญาประดิษฐ์กำลังได้รับความนิยมในหมู่บริษัทขนาดเล็กอย่างไร และเพิ่มโอกาสในการทำให้พวกเขาเติบโตและทำให้คู่แข่งได้เปรียบ

การอัปเดตเสริม macOS Catalina 10.15.4 ทำให้เกิดปัญหามากกว่าการแก้ปัญหา

การอัปเดตเสริม macOS Catalina 10.15.4 ทำให้เกิดปัญหามากกว่าการแก้ปัญหา

เมื่อเร็ว ๆ นี้ Apple เปิดตัว macOS Catalina 10.15.4 การอัปเดตเสริมเพื่อแก้ไขปัญหา แต่ดูเหมือนว่าการอัปเดตทำให้เกิดปัญหามากขึ้นที่นำไปสู่การสร้างเครื่อง Mac อ่านบทความนี้เพื่อเรียนรู้เพิ่มเติม

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

ระบบไฟล์บันทึกคืออะไรและทำงานอย่างไร

ระบบไฟล์บันทึกคืออะไรและทำงานอย่างไร

คอมพิวเตอร์ของเราจัดเก็บข้อมูลทั้งหมดในลักษณะที่เรียกว่าระบบไฟล์บันทึก เป็นวิธีการที่มีประสิทธิภาพที่ช่วยให้คอมพิวเตอร์สามารถค้นหาและแสดงไฟล์ได้ทันทีที่คุณกดค้นหาhttps://wethegeek.com/?p=94116&preview=true