วิธีอัปเกรด Traefik v2 ไป v3 และแก้ไข Error ที่พบบ่อย
สรุปขั้นตอนการย้าย Traefik v2 ไป v3 พร้อมวิธีแก้ปัญหา Error incompatible deprecated static option เมื่อเปิดใช้งาน swarmMode หรือ pilot รวมถึงการปรับปรุง syntax ของ rule
ความเปลี่ยนแปลงระหว่าง Traefik v2 และ v3
การย้ายจาก Traefik v2 ไปยัง v3 ส่วนใหญ่เป็นการเปลี่ยนชื่อ โดยสิ่งที่เห็นได้ชัดคือ middleware ชื่อ ipWhiteList ได้เปลี่ยนเป็น ipAllowList นอกจากนี้ v3 ยังปรับปรุงไวยากรณ์ของ router rule ให้เข้มงวดขึ้น (PathPrefix ไม่รองรับฟีเจอร์ regex อีกต่อไป และมีการเปลี่ยนชื่อหรือถอดตัวจับคู่บางรายการออก) รวมถึงยกเลิกการรองรับ provider และตัวเลือกบางอย่างโดยสิ้นเชิง แต่ส่วนประกอบอื่นยังคงทำงานได้ตามปกติ ไม่ว่าจะเป็น entrypoints, การตั้งค่า ACME certificate, เวิร์กโฟลว์ของ Docker labels และ acme.json ของคุณ ทั้งหมดนี้สามารถใช้งานต่อได้ทันที นอกจากนี้ v3 ยังมาพร้อมกับโหมดความเข้ากันได้ (compatibility mode) ที่ช่วยให้ไวยากรณ์ของ rule ใน v2 ยังคงทำงานได้ คุณจึงสามารถอัปเกรด binary ก่อน แล้วค่อยทยอยปรับแก้ rule ทีละบริการแทนการแก้ไขทั้งหมดในคราวเดียวซึ่งมีความเสี่ยงสูง
คู่มือนี้อ้างอิงการตั้งค่าผ่าน Docker Compose โดยใช้ labels จาก คู่มือ Traefik reverse proxy หน้าดังกล่าวเป็นเนื้อหาสำหรับ v3 โดยเฉพาะ ส่วนหน้านี้จัดทำขึ้นสำหรับเซิร์ฟเวอร์ที่ยังคงรันด้วย tag traefik:v2 อยู่
การเปลี่ยนชื่อและการนำออก
ipWhiteListเปลี่ยนเป็นipAllowListแล้ว ทั้งสำหรับ HTTP และ TCP middleware ตัวเลือกภายในยังคงเหมือนเดิม ดังนั้นsourcerangeจึงยังคงมีความหมายเดิมทุกประการ v3 รุ่นปัจจุบัน รวมถึง v3.5 ยังคงยอมรับชื่อเก่าในฐานะ deprecated alias และบังคับใช้รายการตามปกติ ดังนั้นการเปลี่ยนชื่อนี้จะไม่ทำให้ระบบล่ม อย่างไรก็ตามควรเปลี่ยนชื่อไว้ เพราะ alias นี้มีกำหนดจะถูกนำออก และมันจะหายไปจากรายการ deprecation โดยไม่มีการแจ้งเตือนproviders.docker.swarmMode=trueถูกนำออกไปแล้ว Swarm มี provider ของตัวเองซึ่งกำหนดค่าผ่านproviders.swarm.endpoint- ส่วน
pilotถูกนำออกไปทั้งหมด experimental.http3ถูกนำออกไปแล้ว HTTP/3 จะถูกเปิดใช้งานที่ entrypoint โดยตรงtls.caOptionalถูกนำออกจาก provider และจาก forwardAuth middleware หาก middleware ดังกล่าวทำหน้าที่หน้าด่านให้กับ Authentik SSO ที่โฮสต์เอง การลบบรรทัดcaOptionalออกคือขั้นตอนการย้ายทั้งหมดที่ต้องทำ เนื่องจาก forwardAuth address, trusted headers และ outpost ที่อยู่เบื้องหลังยังคงทำงานเหมือนเดิมใน v3- InfluxDB v1 metrics provider, Rancher provider และ Marathon provider ถูกนำออกไปแล้ว
- Tracing ย้ายไปใช้ OpenTelemetry แล้ว ส่วน tracing backend เฉพาะทางอย่าง Jaeger และ Zipkin ถูกนำออกไป และ v3 จะส่งออกข้อมูลผ่าน OTLP (OpenTelemetry protocol) แทน
- ตัวเลือก
ssl*ที่เลิกใช้แล้วภายใน headers middleware (sslRedirect,sslHostและรายการอื่นๆ) ถูกนำออกไปแล้ว โดยมีการใช้การเปลี่ยนเส้นทางที่ entrypoint และ redirectScheme middleware มาทดแทน
การนำออกเหล่านี้มีความสำคัญมากกว่าที่เห็น เพราะ Traefik จะไม่ยอมเริ่มทำงานหาก static configuration มีตัวเลือกที่มันไม่รู้จัก บรรทัด pilot หรือ swarmMode ที่หลงเหลืออยู่จะทำให้ container หยุดทำงานตอนบูตพร้อมข้อความ incompatible deprecated static option found ที่ระบุชื่อตัวเลือกที่ค้างอยู่ ส่วนตัวเลือกที่ Traefik ไม่เคยรู้จักมาก่อน (เช่น พิมพ์ผิด หรือ tls.caOptional) จะทำให้ระบบหยุดทำงานพร้อมข้อความ field not found แทน ให้ทำความสะอาด static configuration ก่อนที่คุณจะเปลี่ยน image tag
ชื่อ middleware ที่ Traefik ไม่รู้จักจริงๆ (เช่น พิมพ์ผิด หรือชื่อที่ถูกนำออกไปโดยไม่มี alias) จะทำให้เกิดปัญหาในลักษณะอื่น: router ที่อ้างถึง middleware นั้นจะโหลดขึ้นมาพร้อมกับข้อผิดพลาดแทนที่จะเป็น route, dashboard จะทำเครื่องหมายไว้ และ API จะรายงาน middleware "offce@docker" does not exist คำขอที่ส่งไปยัง hostname นั้นจะได้รับ 404 เนื่องจาก router ไม่ได้ถูกโหลดขึ้นมา โปรดทราบว่า ipwhitelist ไม่อยู่ในหมวดหมู่นี้ใน v3 ปัจจุบัน: มันยังคงอยู่เป็น deprecated alias ดังนั้น label ที่ไม่ได้เปลี่ยนชื่อจะยังคงทำงานได้ตามปกติ
การเปลี่ยนแปลงรูปแบบไวยากรณ์ของกฎ
กฎ (Rules) คือส่วนที่การเขียนคำขอใหม่ (rewriting) เกิดขึ้นจริง โดยมีการเปลี่ยนแปลงใน v3 ดังนี้:
- จำเป็นต้องใช้เครื่องหมาย backtick ครอบค่าที่อยู่ภายใน matcher ใน v2 เคยยอมรับเครื่องหมายคำพูดคู่ (double quotes) แต่ v3 ไม่รองรับ ดังนั้น Host("app.example.com") จะต้องเปลี่ยนเป็น Host(
app.example.com) PathPrefixไม่รองรับนิพจน์ทั่วไป (regular expressions) หรือตัวแทน (placeholders) แบบ{id}อีกต่อไป กฎใน v2 เช่น PathPrefix(/api/{version:v[0-9]+}) จะต้องเปลี่ยนเป็น matcher แบบPathRegexpที่เขียนด้วยไวยากรณ์นิพจน์ทั่วไปของภาษา Go- Matcher จะรับค่าได้เพียงค่าเดียวเท่านั้น ใน v2 เคยอนุญาตให้ใช้ Host(
app.example.com,www.example.com) ได้ แต่ใน v3 ต้องเขียนเป็น Host(app.example.com) || Host(www.example.com) ยกเว้นHeader,HeaderRegexp,QueryและQueryRegexpที่ยังคงรับค่าชื่อคู่กับค่าข้อมูลได้เหมือนเดิม HeadersและHeadersRegexpถูกเปลี่ยนชื่อเป็นHeaderและHeaderRegexpHostHeaderถูกถอดออก ให้ใช้Hostแทน ซึ่งจะจับคู่ข้อมูลแบบเดียวกันใน v3- มี matcher ใหม่เพิ่มเข้ามา 2 ตัว คือ
QueryRegexpและClientIPสำหรับใช้จับคู่ที่อยู่ของไคลเอนต์ภายในกฎ
ข่าวดีคือ กฎแบบ Host(app.example.com) ทั่วไปที่เขียนด้วย backtick นั้นเป็นไวยากรณ์ที่ถูกต้องสำหรับ v3 อยู่แล้ว การตั้งค่า Compose ขนาดเล็กส่วนใหญ่ใช้รูปแบบนี้ ซึ่งหมายความว่า label ส่วนใหญ่สามารถย้ายระบบได้โดยไม่ต้องแก้ไขกฎเลยแม้แต่น้อย
ตรวจสอบป้ายกำกับของคุณก่อนเริ่มดำเนินการ
คุณสามารถประเมินขนาดของการย้ายระบบได้ด้วยการค้นหาเพียงครั้งเดียว เนื่องจากทุกการเปลี่ยนแปลงป้ายกำกับที่ทำให้เกิดความไม่เข้ากันจะทิ้งรูปแบบที่ grep สามารถตรวจพบได้:
grep -rnE 'ipwhitelist|HostHeader|Headers\(|PathPrefix\(`[^`]*\{|Host\(`[^`]*`,' docker-compose*.ymlทุกผลลัพธ์ที่พบคือหนึ่งบรรทัดที่ต้องแก้ไข ipwhitelist จะกลายเป็น ipallowlist ส่วน HostHeader จะกลายเป็น Host และ Headers จะกลายเป็น Header ตัวยึดตำแหน่ง {...} ภายใน PathPrefix จะกลายเป็นตัวจับคู่ PathRegexp เครื่องหมายจุลภาคภายใน Host() จะกลายเป็นตัวจับคู่ Host() สองตัวที่เชื่อมกันด้วย || หากไม่พบผลลัพธ์ใดๆ หมายความว่าป้ายกำกับของคุณใช้ไวยากรณ์ v3 ที่ถูกต้องอยู่แล้ว และการย้ายระบบจะเหลือเพียงการตั้งค่าแบบคงที่รวมถึงแท็กของอิมเมจเท่านั้น หากหน้าจอเต็มไปด้วยผลลัพธ์ที่พบ นี่เป็นช่วงเวลาที่เหมาะสมในการพิจารณาว่านี่ยังคงเป็น proxy ที่เหมาะสมสำหรับเซิร์ฟเวอร์นี้หรือไม่ และ การเปรียบเทียบ Traefik กับ Nginx และ Caddy จะช่วยให้คุณนำต้นทุนในการเขียนใหม่นี้ไปเปรียบเทียบกับสิ่งที่อีกสองตัวเลือกต้องการจากคุณในแต่ละแอปพลิเคชัน
สิ่งที่ยังคงเหมือนเดิม
Entrypoints และการเปลี่ยนเส้นทาง HTTP-to-HTTPS, ACME resolvers ที่รองรับทั้งสอง challenge types, exposedByDefault, router และ service labels, loadbalancer.server.port รวมถึง dashboard ทั้งหมดทำงานใน v3 ได้เช่นเดียวกับใน v2 ใบรับรองของคุณสามารถนำมาใช้ต่อได้ เนื่องจาก v3 ยังคงอ่านไฟล์ acme.json ที่ v2 สร้างไว้ อย่างไรก็ตาม ให้สำรองไฟล์ดังกล่าวก่อนเริ่มดำเนินการเสมอ เนื่องจากการย้อนกลับ (rollback) ที่ทำให้ไฟล์สูญหายจะส่งผลให้คุณติดข้อจำกัดอัตราการออกใบรับรองซ้ำ (duplicate-certificate rate limit) ของ Let's Encrypt ทันที:
cp ./letsencrypt/acme.json ./letsencrypt/acme.json.v2-backupเส้นทางการย้ายระบบ
ขั้นตอนที่ 1: ระบุเวอร์ชันที่ใช้งานอยู่ในปัจจุบัน เปลี่ยนแท็ก traefik:latest หรือ traefik:v2 ให้เป็นเวอร์ชันที่คุณใช้งานอยู่จริง ตัวอย่างเช่น traefik:v2.11 จากนั้นให้ commit ไดเรกทอรี compose ทั้งหมดลงใน git ทุกขั้นตอนหลังจากนี้จะสามารถย้อนกลับได้ด้วยการ checkout หากการสร้างบริการใหม่ด้วย docker compose up -d <service> ยังไม่คล่องตัว คู่มือพื้นฐาน Docker Compose ได้ครอบคลุมการทำงานที่การย้ายระบบนี้ต้องใช้
ขั้นตอนที่ 2: ทำความสะอาดการตั้งค่าแบบ static และเปิดโหมดความเข้ากันได้ ลบตัวเลือกทุกตัวที่ v3 ยกเลิกไป (pilot, swarmMode, tls.caOptional, experimental.http3) จากนั้นกำหนดให้ v3 ปฏิบัติต่อกฎต่างๆ ตามไวยากรณ์ของ v2 เป็นค่าเริ่มต้น ในไฟล์ traefik.yml:
core:
defaultRuleSyntax: v2หรือระบุเป็นแฟล็กในรายการ command: ของ compose: --core.defaultRuleSyntax=v2 โหมดความเข้ากันได้จะครอบคลุมเฉพาะไวยากรณ์ของกฎเท่านั้น ไม่สามารถกู้คืนตัวเลือกที่ถูกลบไปแล้ว และไม่เปลี่ยนชื่อ middleware ให้คุณโดยอัตโนมัติ
ขั้นตอนที่ 3: เตรียมการเปลี่ยนชื่อ middleware ค้นหาชื่อเก่าในไฟล์ compose ของคุณ: grep -rn ipwhitelist docker-compose*.yml แก้ไขป้ายกำกับ ipwhitelist ทุกจุดให้เป็น ipallowlist แต่ยังไม่ต้องนำการเปลี่ยนแปลงไปใช้จริง เนื่องจากชื่อใหม่ยังไม่มีอยู่ใน v2 การแก้ไขเหล่านี้จะถูกนำไปใช้พร้อมกับการสลับเวอร์ชันในขั้นตอนถัดไป (หากมีจุดใดหลุดรอดไป v3 ในปัจจุบันยังคงรองรับชื่อเก่าในฐานะนามแฝงที่เลิกใช้งานแล้ว ดังนั้นรายการกฎจะยังคงบังคับใช้ได้ ให้แก้ไขในรอบถัดไปแทนที่จะต้องรีบแก้ไขในเวลาตี 2)
ขั้นตอนที่ 4: สลับแท็กของอิมเมจ ตั้งค่าอิมเมจ Traefik ให้เป็นเวอร์ชัน v3 ปัจจุบัน ซึ่งคือ traefik:v3.5 ณ เวลาที่เขียนบทความนี้ จากนั้น:
docker compose up -d
docker compose logs -f traefikเนื่องจากโหมดความเข้ากันได้เปิดอยู่ กฎ v2 ของคุณจะยังคงจับคู่ได้ และเนื่องจาก up -d ได้สร้างบริการที่มีป้ายกำกับ middleware ที่คุณเปลี่ยนชื่อใหม่ขึ้นมาใหม่แล้ว router เหล่านั้นจึงทำงานได้อย่างถูกต้อง log ที่สมบูรณ์จะไม่มีบรรทัด field not found และไม่มีบรรทัด does not exist
จงประเมินช่วงเวลาที่ขั้นตอนนี้อาจส่งผลกระทบให้ดี Router ที่อ้างถึงชื่อ middleware ซึ่ง v3 ไม่รู้จัก (เช่น การพิมพ์ผิด หรือตัวเลือกที่ถูกลบไป) จะหยุดทำงานตั้งแต่ช่วงที่ Traefik ใหม่เริ่มทำงานจนกว่า container ของแอปนั้นจะถูกสร้างใหม่ ซึ่งบนเซิร์ฟเวอร์เครื่องเดียวจะใช้เวลาเพียงไม่กี่วินาทีที่ docker compose up -d ใช้ในการประมวลผลรายการ หากเส้นทางใดไม่สามารถหยุดทำงานได้เลย ให้ลบ middleware ที่เปลี่ยนชื่อออกจากป้ายกำกับ middlewares ของ router นั้นก่อนการสลับเวอร์ชัน แล้วค่อยเพิ่มกลับเข้าไปใหม่หลังจากนั้น และตัดสินใจล่วงหน้าว่าเส้นทางนั้นสามารถทำงานโดยไม่มี IP allow list ในช่วงเวลาหนึ่งนาทีระหว่างนั้นได้หรือไม่
ขั้นตอนที่ 5: ย้ายกฎทีละบริการ ดำเนินการทีละแอป: เขียนกฎใหม่ให้เป็นไวยากรณ์ของ v3 สร้างบริการนั้นใหม่ด้วย docker compose up -d app และทดสอบก่อนที่จะดำเนินการต่อไป หากบริการใดมีกฎที่คุณยังไม่สามารถเขียนใหม่ได้ ให้ใส่ป้ายกำกับ traefik.http.routers.app.ruleSyntax=v2 ให้กับ router นั้นเพื่อเป็นทางออกฉุกเฉินและดำเนินการต่อไป
ขั้นตอนที่ 6: ปิดโหมดความเข้ากันได้ เมื่อกฎทุกตัวเป็นไวยากรณ์ v3 แล้ว ให้ลบ defaultRuleSyntax และป้ายกำกับ ruleSyntax ออกทั้งหมด รีสตาร์ท Traefik และยืนยันว่า router ทุกตัวยังคงแสดงสถานะสีเขียวใน dashboard อย่าใช้งานโหมดความเข้ากันได้ค้างไว้นานเกินไป เนื่องจาก Traefik ได้ประกาศเลิกใช้งานตัวเลือกทั้งสองนี้ใน v3.4 และจะลบออกในเวอร์ชันหลักถัดไป ดังนั้นโหมดนี้จึงเป็นเพียงสะพานเชื่อม ไม่ใช่จุดหมายปลายทาง
ก่อนและหลัง: ป้ายกำกับ (labels) ของหนึ่งบริการ
นี่คือตัวอย่างแอปพลิเคชันที่รวมการเปลี่ยนแปลงสำคัญทุกรายการไว้ในที่เดียว ได้แก่ Host แบบหลายค่า, ตัวแทน (placeholder) PathPrefix และมิดเดิลแวร์ ipWhiteList โดยบล็อก v2 มีดังนี้:
app:
image: app:1.4
restart: unless-stopped
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.example.com`,`www.example.com`) && PathPrefix(`/api/{version:v[0-9]+}`)
- traefik.http.routers.app.entrypoints=websecure
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.routers.app.middlewares=office
- traefik.http.middlewares.office.ipwhitelist.sourcerange=10.0.0.0/24
- traefik.http.services.app.loadbalancer.server.port=8080และบริการเดียวกันที่ย้ายไปใช้ v3:
app:
image: app:1.4
restart: unless-stopped
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=(Host(`app.example.com`) || Host(`www.example.com`)) && PathRegexp(`^/api/v[0-9]+`)
- traefik.http.routers.app.entrypoints=websecure
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.routers.app.middlewares=office
- traefik.http.middlewares.office.ipallowlist.sourcerange=10.0.0.0/24
- traefik.http.services.app.loadbalancer.server.port=8080มีการเปลี่ยนแปลงป้ายกำกับสองรายการ กฎดังกล่าวแยก Host แบบหลายค่าออกเป็นตัวจับคู่ (matcher) สองตัวที่เชื่อมด้วย || และเปลี่ยนตัวแทนเป็น PathRegexp ส่วนป้ายกำกับมิดเดิลแวร์ได้เปลี่ยนจาก ipwhitelist เป็น ipallowlist สำหรับ entrypoint, ตัวแก้ไขใบรับรอง (certificate resolver), การเชื่อมต่อ router-to-middleware และพอร์ตของบริการนั้นไม่มีการเปลี่ยนแปลงใดๆ
ทดสอบแต่ละบริการด้วยแดชบอร์ด
หลังจากสลับการตั้งค่าแต่ละครั้ง ให้เปิดหน้า HTTP routers ของแดชบอร์ด Router ทุกตัวควรแสดงสถานะเป็นสีเขียว หาก Router มีป้ายแจ้งเตือนข้อผิดพลาด ระบบจะระบุปัญหาที่เกิดขึ้นโดยตรง ซึ่งมักเกิดจาก middleware ที่ไม่มีอยู่จริงภายใต้ชื่อใหม่ หรือกฎที่ v3 ไม่สามารถประมวลผลได้ จากนั้นให้ตรวจสอบจากภายนอกทีละ hostname:
curl -sI https://app.example.com/api/v1/statusรหัสสถานะ 200 หรือการเปลี่ยนเส้นทางตามปกติของแอปพลิเคชัน หมายความว่าการกำหนดเส้นทางและ TLS ทำงานได้ตามปกติ หากได้รับ 404 จาก Traefik แสดงว่า Router ไม่สามารถเริ่มทำงานได้ ให้กลับไปที่แดชบอร์ดเพื่ออ่านข้อผิดพลาดนั้น เปิด docker compose logs -f traefik ทิ้งไว้ในเทอร์มินัลอีกหน้าต่างหนึ่งขณะที่คุณทำงาน เนื่องจากความล้มเหลวในการประมวลผลทุกครั้งจะปรากฏขึ้นที่นั่นทันทีที่ container เริ่มทำงานใหม่
ความซื่อสัตย์ในการย้อนกลับ (Rollback)
เก็บไฟล์ compose เวอร์ชัน v2, การตั้งค่าแบบ static และ acme.json backup ไว้จนกว่าทุกบริการจะสามารถรับส่งข้อมูลบน v3 ได้และผ่านการทดสอบการใช้งานจริงแล้ว การย้อนกลับหมายถึงการ checkout ไปยัง commit ก่อนการย้ายระบบและรันคำสั่ง docker compose up -d ซึ่งจะต้องทำกับไฟล์ทั้งหมด ไม่ใช่แค่เปลี่ยน image tag เท่านั้น เนื่องจาก label ที่ใช้ได้เฉพาะใน v3 จะทำงานผิดพลาดเมื่ออยู่บน v2 เช่นเดียวกับที่ label ของ v2 ทำงานผิดพลาดบน v3 โดย ipallowlist ไม่มีอยู่จริงใน v2 และตัวจับคู่ PathRegexp ก็ไม่สามารถประมวลผลใน v2 ได้เช่นกัน หาก acme.json สูญหายหรือเสียหายระหว่างดำเนินการ ให้กู้คืนจากไฟล์สำรองก่อนเริ่มรัน v2 เพื่อไม่ให้การย้อนกลับสิ้นเปลืองโควตาอัตราการออกใบรับรองของ Let's Encrypt จากการต้องออกใบรับรองใหม่พร้อมกันถึง 5 ฉบับ
FAQ
ฉันต้องเขียนกฎของ router ใหม่ทั้งหมดสำหรับ Traefik v3 หรือไม่?
ไม่จำเป็น กฎ Host(app.example.com) แบบปกติที่เขียนด้วย backticks สามารถใช้งานได้ทั้งสองเวอร์ชัน ซึ่งครอบคลุมการตั้งค่า Compose ส่วนใหญ่ การเขียนใหม่จำเป็นเฉพาะในกรณีที่กฎนั้นใช้ฟีเจอร์ที่มีเฉพาะใน v2 เท่านั้น เช่น regex หรือ placeholders ภายใน Path และ PathPrefix, การระบุหลาย hostname ภายใน Host() เดียว, การใช้เครื่องหมายคำพูดแทน backticks หรือการใช้ matchers อย่าง Headers, HeadersRegexp และ HostHeader ที่ถูกถอดออกไปแล้ว
เกิดอะไรขึ้นกับ ipWhiteList ใน Traefik v3?
มันถูกเปลี่ยนชื่อเป็น ipAllowList โดยที่การตั้งค่าภายในยังคงเหมือนเดิม ดังนั้น label ของ v2 อย่าง traefik.http.middlewares.office.ipwhitelist.sourcerange=10.0.0.0/24 จึงกลายเป็นบรรทัดเดียวกันโดยมี ipallowlist อยู่ข้างใน Traefik v3 เวอร์ชันปัจจุบัน รวมถึง v3.5 ยังคงยอมรับชื่อเก่าในฐานะ alias ที่ถูกเลิกใช้งาน (deprecated) ดังนั้น label ที่ไม่ได้เปลี่ยนชื่อจะยังคงบังคับใช้ allowlist ต่อไปโดยไม่มีปัญหา แต่ควรถือว่านี่เป็นเพียงการยืดเวลาเท่านั้น ไม่ใช่เหตุผลที่จะละเลยการเปลี่ยนชื่อ เพราะ alias นี้มีกำหนดการที่จะถูกถอดออก และหากเป็นชื่อ middleware ที่ Traefik ไม่รู้จักจริงๆ ระบบจะแจ้งเตือนข้อผิดพลาดอย่างชัดเจนด้วย router error และส่งผลให้เกิด 404 โดย dashboard จะแสดงข้อผิดพลาดดังกล่าว และคำขอที่ส่งไปยัง hostname นั้นจะได้รับสถานะ 404 กลับไป
Traefik v3 ยังสามารถอ่าน syntax กฎของ v2 ได้หรือไม่?
ได้ ให้ตั้งค่า core.defaultRuleSyntax: v2 ใน static configuration เพื่อคง syntax ของ v2 ไว้เป็นค่าเริ่มต้นในระหว่างที่คุณกำลังย้ายระบบ และใช้ label ruleSyntax=v2 สำหรับ router รายตัวที่ยังเหลืออยู่หลังจากที่คุณเปลี่ยนค่าเริ่มต้นกลับไปแล้ว ให้ถือว่าทั้งสองอย่างนี้เป็นเพียงมาตรการชั่วคราว เนื่องจาก Traefik ได้ประกาศเลิกใช้งาน (deprecated) ใน v3.4 และจะถอดออกในเวอร์ชันหลักถัดไป
certificate ของ Let's Encrypt จะยังคงอยู่หลังการอัปเกรดหรือไม่?
ใช่ Traefik v3 ยังคงอ่านไฟล์ acme.json ที่ v2 เขียนไว้ ดังนั้น certificate จะไม่ถูกออกใหม่เพียงเพราะเปลี่ยน binary อย่างไรก็ตาม ควรคัดลอกไฟล์ดังกล่าวไปยังที่ปลอดภัยก่อนเริ่มดำเนินการ เพราะหากต้อง rollback หรือ volume ที่เก็บ acme.json ถูกลบ จะทำให้ต้องออก certificate ใหม่ทั้งหมดพร้อมกัน ซึ่ง Let's Encrypt อนุญาตให้ขอ certificate ซ้ำได้เพียง 5 ใบต่อสัปดาห์สำหรับชุด hostname เดียวกัน
ทำไม Traefik v3 ถึงไม่ยอมเริ่มทำงานหลังการอัปเกรด?
ส่วนใหญ่มักเกิดจาก static configuration ยังคงมีตัวเลือกที่ v3 ถอดออกไปแล้ว และ Traefik จะปฏิเสธการเริ่มทำงานหากพบตัวเลือกที่ไม่รู้จัก สำหรับตัวเลือกที่ตกค้างกันบ่อยๆ (pilot, providers.docker.swarmMode, experimental.http3) log จะแสดงข้อความ incompatible deprecated static option found และระบุชื่อตัวการนั้นๆ ส่วนกรณีที่เป็นสิ่งที่ v3 ไม่เคยรู้จักมาก่อน เช่น tls.caOptional ระบบจะแจ้งว่า field not found พร้อมระบุ node ที่เกี่ยวข้อง ให้ลบหรือแทนที่ตัวเลือกเหล่านั้น แล้วจึงเริ่ม container ใหม่อีกครั้ง