ปลั๊กอินเครือข่าย Calico มอบนโยบายเครือข่ายที่หลากหลายพร้อมไวยากรณ์แบบรวมเพื่อปกป้องโฮสต์ฮาร์ดแวร์ เครื่องเสมือน และพ็อด นโยบายเหล่านี้สามารถนำไปใช้ภายในเนมสเปซหรือเป็นนโยบายเครือข่ายส่วนกลางที่ใช้กับ
บทความนี้ถือว่าคุณมีความเข้าใจพื้นฐานเกี่ยวกับวิธีการทำงานของนโยบายเครือข่าย Kubernetes และ Calico ถ้าไม่เราขอแนะนำให้ลอง
ผ้าดิบ
ในระดับพื้นฐาน เมื่อ Calico เชื่อมต่อพ็อดเข้ากับเครือข่าย (ดูแผนภาพด้านล่าง) มันจะเชื่อมต่อกับโฮสต์โดยใช้อินเทอร์เฟซอีเทอร์เน็ตเสมือน (veth) การรับส่งข้อมูลที่ส่งโดยพ็อดมาถึงโฮสต์จากอินเทอร์เฟซเสมือนนี้ และได้รับการประมวลผลในลักษณะเดียวกับที่มาจากอินเทอร์เฟซเครือข่ายทางกายภาพ ตามค่าเริ่มต้น Calico จะตั้งชื่ออินเทอร์เฟซเหล่านี้ว่า caliXXX เนื่องจากการรับส่งข้อมูลมาผ่านอินเทอร์เฟซเสมือน มันจึงผ่าน iptables ราวกับว่าพ็อดอยู่ห่างออกไปเพียงก้าวเดียว ดังนั้นเมื่อมีการจราจรเข้า/ออกจากพ็อด มันจะถูกส่งต่อจากมุมมองของโฮสต์
บนโหนด Kubernetes ที่ใช้งาน Calico คุณสามารถแมปอินเทอร์เฟซเสมือน (veth) กับปริมาณงานได้ดังนี้ ในตัวอย่างด้านล่าง คุณจะเห็นว่า veth#10 (calic1cbf1ca0f8) เชื่อมต่อกับ cnx-manager-* ในเนมสเปซการตรวจสอบ calico
[centos@ip-172-31-31-46 K8S]$ sudo ip a
...
10: calic1cbf1ca0f8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5
inet6 fe80::ecee:eeff:feee:eeee/64 scope link
valid_lft forever preferred_lft forever
...
[centos@ip-172-31-31-46 K8S]$ calicoctl get wep --all-namespaces
...
calico-monitoring cnx-manager-8f778bd66-lz45m ip-172-31-31-46.ec2.internal 192.168.103.134/32
calic1cbf1ca0f8
...
เนื่องจาก Calico สร้างอินเทอร์เฟซ veth สำหรับแต่ละเวิร์กโหลด จะบังคับใช้นโยบายอย่างไร เมื่อต้องการทำเช่นนี้ Calico จะสร้าง hooks ในห่วงโซ่ต่างๆ ของเส้นทางการประมวลผลแพ็กเก็ตโดยใช้ iptables
แผนภาพด้านล่างแสดงเครือข่ายที่เกี่ยวข้องกับการประมวลผลแพ็กเก็ตใน iptables (หรือระบบย่อย netfilter) เมื่อแพ็กเก็ตมาถึงผ่านอินเทอร์เฟซเครือข่าย แพ็กเก็ตจะผ่านห่วงโซ่ PREROUTING ก่อน จากนั้นจะมีการตัดสินใจเกี่ยวกับการกำหนดเส้นทาง และจากสิ่งนี้ แพ็กเก็ตจะส่งผ่าน INPUT (กำหนดเส้นทางไปยังกระบวนการโฮสต์) หรือ FORWARD (กำหนดเส้นทางไปยังพ็อดหรือโหนดอื่นบนเครือข่าย) จากกระบวนการโลคัล แพ็กเก็ตจะผ่าน OUTPUT จากนั้นต่อด้วย POSTROUTING chain ก่อนที่จะถูกส่งลงสายเคเบิล
โปรดทราบว่าพ็อดยังเป็นเอนทิตีภายนอก (เชื่อมต่อกับ veth) ในแง่ของการประมวลผล iptables สรุป:
- การรับส่งข้อมูลที่ส่งต่อ (nat, กำหนดเส้นทางหรือไปยัง/จากพ็อด) ผ่านเครือข่าย PREROUTING - FORWARD - POSTROUTING
- การรับส่งข้อมูลไปยังกระบวนการโฮสต์ภายในเครื่องจะผ่านห่วงโซ่ PREROUTING - INPUT
- การรับส่งข้อมูลจากกระบวนการโฮสต์ในพื้นที่ต้องผ่านห่วงโซ่เอาต์พุต - POSTROUTING
Calico มีตัวเลือกนโยบายที่ช่วยให้คุณสามารถใช้นโยบายกับเครือข่ายทั้งหมดได้ ด้วยเหตุนี้ เรามาดูตัวเลือกการกำหนดค่านโยบายต่างๆ ที่มีใน Calico กัน ตัวเลขในรายการตัวเลือกด้านล่างตรงกับตัวเลขในแผนภาพด้านบน
- นโยบายปลายทางภาระงาน (พ็อด)
- นโยบายปลายทางของโฮสต์
- ตัวเลือก ApplyOnForward
- นโยบายของเพรดีแนต
- นโยบายที่ไม่ได้ติดตาม
เริ่มต้นด้วยการดูวิธีการใช้นโยบายกับตำแหน่งข้อมูลปริมาณงาน (พ็อด Kubernetes หรือ OpenStack VM) จากนั้นดูตัวเลือกนโยบายสำหรับตำแหน่งข้อมูลของโฮสต์
จุดสิ้นสุดภาระงาน
นโยบายจุดสิ้นสุดภาระงาน (1)
นี่คือตัวเลือกในการปกป้องพ็อด kubernetes Calico รองรับการทำงานกับ Kubernetes NetworkPolicy แต่ยังให้นโยบายเพิ่มเติม - Calico NetworkPolicy และ GlobalNetworkPolicy Calico สร้างห่วงโซ่สำหรับแต่ละพ็อด (ปริมาณงาน) และ hooks ในห่วงโซ่ INPUT และ OUTPUT สำหรับภาระงานไปยังตารางตัวกรองของห่วงโซ่ FORWARD
จุดสิ้นสุดของโฮสต์
นโยบายปลายทางของโฮสต์ (2)
นอกจาก CNI (อินเทอร์เฟซเครือข่ายคอนเทนเนอร์) แล้ว นโยบาย Calico ยังให้ความสามารถในการปกป้องโฮสต์ด้วย ใน Calico คุณสามารถสร้างตำแหน่งข้อมูลโฮสต์ได้โดยการระบุอินเทอร์เฟซโฮสต์ร่วมกัน และหมายเลขพอร์ต หากจำเป็น การบังคับใช้นโยบายสำหรับเอนทิตีนี้ทำได้โดยใช้ตารางตัวกรองในห่วงโซ่ INPUT และ OUTPUT ดังที่คุณเห็นจากแผนภาพ (2) สิ่งเหล่านี้นำไปใช้กับกระบวนการภายในเครื่องบนโหนด/โฮสต์ นั่นคือ หากคุณสร้างนโยบายที่ใช้กับตำแหน่งข้อมูลโฮสต์ ก็จะไม่ส่งผลกระทบต่อการรับส่งข้อมูลที่ไป/จากพ็อดของคุณ แต่มีอินเทอร์เฟซ/ไวยากรณ์เดียวสำหรับการบล็อกการรับส่งข้อมูลสำหรับโฮสต์และพ็อดของคุณโดยใช้นโยบาย Calico สิ่งนี้ช่วยลดความยุ่งยากในกระบวนการจัดการนโยบายสำหรับเครือข่ายที่แตกต่างกันอย่างมาก การกำหนดค่านโยบายจุดสิ้นสุดของโฮสต์เพื่อปรับปรุงความปลอดภัยของคลัสเตอร์เป็นอีกกรณีการใช้งานที่สำคัญ
นโยบายการนำไปใช้ล่วงหน้า (3)
ตัวเลือก ApplyOnForward มีอยู่ในนโยบายเครือข่ายทั่วโลกของ Calico เพื่ออนุญาตให้ใช้นโยบายกับการรับส่งข้อมูลทั้งหมดที่ผ่านจุดสิ้นสุดของโฮสต์ รวมถึงการรับส่งข้อมูลที่จะถูกส่งต่อโดยโฮสต์ ซึ่งรวมถึงการรับส่งข้อมูลที่ส่งต่อไปยังพ็อดท้องถิ่นหรือที่อื่น ๆ บนเครือข่าย Calico กำหนดให้เปิดใช้การตั้งค่านี้สำหรับนโยบายที่ใช้ PreDNAT และไม่ถูกติดตาม ดูหัวข้อต่อไปนี้ นอกจากนี้ ApplyOnForward ยังสามารถใช้เพื่อตรวจสอบการรับส่งข้อมูลของโฮสต์ในกรณีที่ใช้เราเตอร์เสมือนหรือซอฟต์แวร์ NAT
โปรดทราบว่าหากคุณต้องการใช้นโยบายเครือข่ายเดียวกันกับทั้งกระบวนการโฮสต์และพ็อด คุณไม่จำเป็นต้องใช้ตัวเลือก ApplyOnForward สิ่งที่คุณต้องทำคือสร้างป้ายกำกับสำหรับจุดสิ้นสุดโฮสต์และจุดสิ้นสุดภาระงาน (พ็อด) ที่จำเป็น Calico ฉลาดพอที่จะบังคับใช้นโยบายตามป้ายกำกับ โดยไม่คำนึงถึงประเภทปลายทาง (โฮสต์ปลายทางหรือปริมาณงาน)
นโยบายเพรดีแนต (4)
ใน Kubernetes พอร์ตเอนทิตีบริการสามารถเปิดเผยภายนอกได้โดยใช้ตัวเลือก NodePorts หรือทางเลือก (เมื่อใช้ Calico) โดยการโฆษณาโดยใช้ตัวเลือก IP ของคลัสเตอร์หรือ IP ภายนอก Kube-proxy จะปรับสมดุลการรับส่งข้อมูลขาเข้าที่เชื่อมโยงกับบริการไปยังพ็อดของบริการที่เกี่ยวข้องโดยใช้ DNAT จากนี้ คุณจะบังคับใช้นโยบายสำหรับการรับส่งข้อมูลที่มาจาก NodePorts อย่างไร เพื่อให้แน่ใจว่านโยบายเหล่านี้จะถูกนำไปใช้ก่อนที่ DNAT จะประมวลผลการรับส่งข้อมูล (ซึ่งเป็นการแมประหว่างโฮสต์:พอร์ตและบริการที่เกี่ยวข้อง) Calico จัดเตรียมพารามิเตอร์สำหรับ globalNetworkPolicy ที่เรียกว่า "preDNAT: true"
เมื่อเปิดใช้งาน pre-DNAT นโยบายเหล่านี้จะถูกนำมาใช้ใน (4) ในแผนภาพ - ในตาราง Mangle ของห่วงโซ่ PREROUTING - ทันทีก่อน DNAT ที่นี่ไม่ได้ปฏิบัติตามลำดับของนโยบายตามปกติ เนื่องจากการใช้นโยบายเหล่านี้เกิดขึ้นเร็วกว่ามากในเส้นทางการประมวลผลการรับส่งข้อมูล อย่างไรก็ตาม นโยบายของ preDNAT เคารพลำดับการสมัครระหว่างกัน
เมื่อสร้างนโยบายด้วย pre-DNAT สิ่งสำคัญคือต้องระมัดระวังเกี่ยวกับการรับส่งข้อมูลที่คุณต้องการประมวลผล และปล่อยให้ส่วนใหญ่ถูกปฏิเสธ การรับส่งข้อมูลที่ทำเครื่องหมายเป็น 'อนุญาต' ในนโยบาย pre-DNAT จะไม่ได้รับการตรวจสอบโดยนโยบายจุดโฮสต์ปลายทางอีกต่อไป ในขณะที่การรับส่งข้อมูลที่ไม่เป็นไปตามนโยบายก่อน DNAT จะยังคงดำเนินต่อไปผ่านเครือข่ายที่เหลือ
Calico ได้กำหนดให้ต้องเปิดใช้งานตัวเลือก ApplyOnForward เมื่อใช้ preDNAT เนื่องจากตามคำจำกัดความแล้ว ปลายทางของการรับส่งข้อมูลยังไม่ได้ถูกเลือก การรับส่งข้อมูลสามารถนำไปสู่กระบวนการโฮสต์หรือส่งต่อไปยังพ็อดหรือโหนดอื่นก็ได้
นโยบายที่ไม่ได้ติดตาม (5)
เครือข่ายและแอปพลิเคชันอาจมีพฤติกรรมที่แตกต่างกันมาก ในบางกรณีร้ายแรง แอปพลิเคชันอาจสร้างการเชื่อมต่อที่มีอายุการใช้งานสั้นจำนวนมาก ซึ่งอาจทำให้ conntrack (ส่วนประกอบหลักของสแตกเครือข่าย Linux) หน่วยความจำไม่เพียงพอ โดยปกติแล้ว หากต้องการรันแอปพลิเคชันประเภทนี้บน Linux คุณจะต้องกำหนดค่าหรือปิดใช้งาน conntrack ด้วยตนเอง หรือเขียนกฎ iptables เพื่อเลี่ยงผ่าน conntrack นโยบายที่ไม่ได้ติดตามใน Calico เป็นตัวเลือกที่ง่ายกว่าและมีประสิทธิภาพมากกว่า หากคุณต้องการประมวลผลการเชื่อมต่อโดยเร็วที่สุด เช่น ถ้าคุณใช้ Massive
อ่านนี่
เมื่อคุณตั้งค่าตัวเลือก "doNotTrack: true" ใน Calico globalNetworkPolicy ตัวเลือกดังกล่าวจะกลายเป็นนโยบาย **ไม่ได้ติดตาม** และจะถูกนำไปใช้ตั้งแต่เนิ่นๆ ในไปป์ไลน์การประมวลผลแพ็กเก็ต Linux เมื่อพิจารณาจากแผนภาพด้านบน นโยบายที่ไม่ได้ติดตามจะถูกนำไปใช้ในห่วงโซ่ PREROUTING และ OUTPUT ในตารางดิบก่อนที่จะเริ่มการติดตามการเชื่อมต่อ (conntrack) เมื่อแพ็คเก็ตได้รับอนุญาตตามนโยบายที่ไม่ได้ติดตาม จะมีการทำเครื่องหมายให้ปิดใช้งานการติดตามการเชื่อมต่อสำหรับแพ็คเก็ตนั้น มันหมายความว่า:
- นโยบายที่ไม่ได้ติดตามจะถูกนำไปใช้เป็นรายแพ็กเก็ต ไม่มีแนวคิดเรื่องการเชื่อมต่อ (หรือการไหล) การขาดการเชื่อมต่อมีผลกระทบที่สำคัญหลายประการ:
- หากคุณต้องการอนุญาตทั้งการรับส่งข้อมูลคำขอและการตอบกลับ คุณต้องมีกฎสำหรับทั้งขาเข้าและขาออก (เนื่องจากโดยทั่วไปแล้ว Calico จะใช้ conntrack เพื่อทำเครื่องหมายการรับส่งข้อมูลการตอบกลับว่าได้รับอนุญาต)
- นโยบายที่ไม่ได้ติดตามใช้ไม่ได้กับภาระงาน (พ็อดของ Kubernetes) เนื่องจากในกรณีนี้ ไม่มีทางติดตามการเชื่อมต่อขาออกจากพ็อดได้
- NAT ทำงานไม่ถูกต้องกับแพ็กเก็ตที่ไม่ได้ติดตาม (เนื่องจากเคอร์เนลเก็บการแมป NAT ไว้ใน conntrack)
- เมื่อผ่านกฎ "อนุญาตทั้งหมด" ในนโยบายที่ไม่ได้ติดตาม แพ็กเก็ตทั้งหมดจะถูกทำเครื่องหมายว่าไม่ได้ติดตาม นี่ไม่ใช่สิ่งที่คุณต้องการเกือบทุกครั้ง ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องเลือกอย่างมากเกี่ยวกับแพ็กเก็ตที่อนุญาตโดยนโยบายที่ไม่ได้ติดตาม (และอนุญาตให้การรับส่งข้อมูลส่วนใหญ่ผ่านนโยบายการติดตามปกติ)
- นโยบายที่ไม่ได้ติดตามจะถูกนำไปใช้ที่จุดเริ่มต้นของไปป์ไลน์การประมวลผลแพ็กเก็ต นี่เป็นสิ่งสำคัญมากที่ต้องเข้าใจเมื่อสร้างนโยบาย Calico คุณสามารถมีนโยบายพ็อดที่มี order:1 และนโยบายที่ไม่ได้ติดตามด้วย order:1000 มันจะไม่สำคัญ นโยบายที่ไม่ได้ติดตามจะถูกนำไปใช้ก่อนนโยบายสำหรับพ็อด นโยบายที่ไม่ได้ติดตามจะเคารพคำสั่งดำเนินการระหว่างกันเท่านั้น
เนื่องจากวัตถุประสงค์ประการหนึ่งของนโยบาย doNotTrack คือการบังคับใช้นโยบายตั้งแต่เนิ่นๆ ในไปป์ไลน์การประมวลผลแพ็กเก็ต Linux Calico จึงกำหนดให้จำเป็นต้องระบุตัวเลือก ApplyOnForward เมื่อใช้ doNotTrack อ้างถึงแผนภาพการประมวลผลแพ็กเก็ต โปรดทราบว่านโยบายที่ไม่ได้ติดตาม (5) จะถูกนำไปใช้ก่อนการตัดสินใจกำหนดเส้นทางใดๆ การรับส่งข้อมูลสามารถนำไปสู่กระบวนการโฮสต์หรือส่งต่อไปยังพ็อดหรือโหนดอื่นก็ได้
ผลของการ
เราพิจารณาตัวเลือกนโยบายต่างๆ (ตำแหน่งข้อมูลโฮสต์, ApplyOnForward, preDNAT และ Untracked) ใน Calico และวิธีการนำไปใช้ตามเส้นทางการประมวลผลแพ็กเก็ต การทำความเข้าใจวิธีการทำงานจะช่วยในการพัฒนานโยบายที่มีประสิทธิผลและปลอดภัย ด้วย Calico คุณสามารถใช้นโยบายเครือข่ายทั่วโลกที่ใช้กับป้ายกำกับ (กลุ่มของโหนดและพ็อด) และใช้นโยบายกับพารามิเตอร์ต่างๆ ช่วยให้ผู้เชี่ยวชาญด้านความปลอดภัยและการออกแบบเครือข่ายสามารถปกป้อง “ทุกสิ่ง” (ประเภทอุปกรณ์ปลายทาง) ได้อย่างสะดวกในคราวเดียวโดยใช้ภาษานโยบายเดียวกับนโยบาย Calico
รับทราบ: ฉันอยากจะขอบคุณ
ที่มา: will.com