Taints & Tolerants ใน Kubernetes คืออะไรและทำงานอย่างไร
ในชีวิตทั่วไป เรามักจะพัฒนาความสัมพันธ์กับคนที่เราชอบและต้องการมีส่วนร่วมบ่อยครั้งใน Kubernetes เราสามารถสร้างความสัมพันธ์ที่ใกล้ชิดระหว่างโหนดและพ็อดในทำนองเดียวกัน
หากคุณต้องการให้แน่ใจว่ามีพ็อดเพียงไม่กี่ประเภทเท่านั้นที่ได้รับการรองรับใน โหนด ผู้ปฏิบัติงานที่กำหนด และขับไล่พ็อดอื่น ๆ ที่คุณไม่ต้องการเป็นส่วนหนึ่งของผู้ปฏิบัติงาน โหนด แข็งแกร่ง> คุณสามารถใช้แนวคิดของ
“มลทินและความอดทน ”
มาทำความเข้าใจกับยุงและการเปรียบเทียบของมนุษย์กันดีกว่า:
สมมุติว่าคุณไม่อยากให้ยุงกัดคุณ ในกรณีนี้ คุณจะทำอย่างไร? คุณใช้ยาไล่ยุงหรือใช้ Odomos (เจลไล่ยุง)
ไม่ว่าคุณจะใช้ Odomos ที่ส่วนใดของร่างกายคุณ ส่วนนั้นจะ “มีมลทิน” ยุงของเราไม่ทนต่อมลทินประเภทนี้ ดังนั้นเมื่อใดก็ตามที่พวกมันเข้ามาใกล้ส่วนของร่างกายที่เปื้อน พวกมันก็จะทนไม่ไหวและจะบินหนีไป
ดังนั้น ร่างกายของเราจึง “มีมลทิน ” และยุงก็ “ไม่ทนต่อ ”
แต่หากมีแมลงประเภทอื่นเกิดขึ้นซึ่งสามารถทนต่อสารปนเปื้อน (สารขับไล่) พวกมันก็จะเกาะอยู่บนร่างกายของเราได้
ดังนั้นในกรณีนี้เนื้อหาคือ “มีมลทิน” ข้อบกพร่องอื่นๆ คือ “ทนทาน ”
ด้วยการเปรียบเทียบนี้ ตอนนี้เราเข้าใจได้ว่าโหนดบางประเภทมีมลทินเพื่อขับไล่ Pod ชนิดที่ไม่ทนต่อบางประเภท พ็อดนี้จะไม่สามารถยึดติดกับโหนดดังกล่าวได้ ในขณะที่ Pod ประเภทอื่นบางประเภทที่ทนทาน ไปยังโหนดคนงานที่แปดเปื้อน จะสามารถอาศัยอยู่ในโหนดนั้นได้
ความสกปรกและความคลาดเคลื่อนในบริบทของ Kubernetes:
ในกรณีของ Kubernetes
- โหนด: คือบุคคลที่แมลงต้องการนั่ง โหนดของเธอโดยทั่วไปมีมลทิน
- พ็อด: คือตัวแมลง/ยุงนั่นเอง โดยทั่วไปแล้วพ็อดที่นี่มีความทนทาน
ความมัวหมองและการยอมรับเป็นเพียงกลไกในการกำหนดข้อจำกัดเพื่อให้แน่ใจว่าพ็อดไม่ได้ถูกกำหนดเวลาไว้บนโหนดของผู้ปฏิบัติงานที่ไม่เหมาะสม
มาทำความเข้าใจกับรูปด้านล่าง:
คำอธิบาย:
คนงาน NODE 1 มีมลทิน & POD 3 ทำเครื่องหมายว่าทนทาน:
NODE 1 ที่นี่ถูกทำเครื่องหมายว่าปนเปื้อนด้วย (สีเขียว) ซึ่งหมายความว่าไม่มีพ็อด, POD 1, POD 2, POD 3 ใด ๆ ที่จะสามารถอาศัยอยู่บน NODE 1 ได้จนกว่าอันใดอันหนึ่งหรือทั้งหมดจะถูกทำเครื่องหมายว่าทนทานต่อโหนด มีตำหนิ 1 รายการ
ดังนั้นหากเราทำเครื่องหมาย POD 3 ว่าทนทานต่อมลทินของ NODE 1ดังแสดงในรูปด้านบน และปล่อยให้พ็อดอื่นๆ พ็อด 1, พ็อด 2 ไม่ทนต่อมลทินของโหนด 1 ต่อไปนี้คือ สถานการณ์จะเป็นอย่างไร:
คำอธิบาย:
POD 3 ได้รับอนุญาตให้อยู่ใน NODE 1 เนื่องจากมีเครื่องหมายว่าทนทานต่อมัน พ็อดที่เหลือได้รับอนุญาตให้อยู่ใน NODE 2 และ NODE 3
หมายเหตุ!
POD 3 แม้ว่าจะถูกทำเครื่องหมายว่าทนทานต่อ NODE 1 แต่ก็มีอิสระในการเป็นส่วนหนึ่งของโหนดอื่นๆ: โหนด 2 และโหนด 3 แต่พ็อด POD 1, POD 2 จะไม่ได้รับอนุญาตให้อยู่ใน NODE 1 จนกว่าจะมีการทำเครื่องหมายไว้ อดทนต่อมัน
ดังนั้นด้วยสัญชาตญาณและความเข้าใจนี้ จึงถึงเวลาที่จะเข้าใจ
มีการนำเทนต์ไปใช้อย่างไร?
คุณเพิ่มเทนต์ให้กับโหนดโดยใช้ "kubectl taint"
ตัวอย่างเช่น การเพิ่มเทนต์โดยใช้คำสั่ง kubectl taint จะมีไวยากรณ์ดังต่อไปนี้:
kubectl taint nodes <node name >key=value:taint-effect
ที่นี่
- taint: คือคำสั่งเพื่อใช้เทนต์ในโหนด
- โหนด: เป็นชุดของโหนดผู้ปฏิบัติงาน
- ชื่อโหนด: คือชื่อของโหนดผู้ปฏิบัติงานเฉพาะ ซึ่งต้องใช้เทนต์ โดยมีคู่คีย์-ค่า
- คู่คีย์-ค่า:ใช้เพื่อระบุประเภทแอปพลิเคชันในพ็อดที่จะแนบโหนดนี้
- เอฟเฟกต์มลทิน: ใช้เพื่อกำหนดวิธีปฏิบัติต่อพ็อดหากพ็อดไม่ทนต่อมลทิน
เอฟเฟกต์สีซีดมีประเภทดังต่อไปนี้
- ไม่มีกำหนดการ
- PreferNoSchedule
- ไม่ดำเนินการ
คำสั่งสุดท้ายจะมีลักษณะดังนี้:
kubectl taint nodes node1 app=blue: NoSchedule
ที่นี่ node1 เสียด้วยพ็อดที่มีคู่คีย์-ค่า app=blue โดยที่พ็อดถูกแมปด้วยประเภทเอฟเฟกต์เทนต์: NoSchedule หมายความว่าจะไม่มีการกำหนดเวลา พ็อด ไปยังโหนดที่กำหนด โหนด1 จนกว่าจะมีความคลาดเคลื่อนที่ตรงกัน
การเพิ่มความคลาดเคลื่อนให้กับพ็อด:
ในคำจำกัดความของพ็อดข้างต้น เราระบุความคลาดเคลื่อนสำหรับพ็อดในส่วน Spec ของพ็อดดังแสดงในรูปด้านบน
tolerations:
- key: "app"
operator: "Equal"
value: "blue"
effect: "NoSchedule"
คำจำกัดความของความคลาดเคลื่อนนี้ตรงกับคำสั่งด้านล่าง
kubectl taint nodes node1 app=blue: NoSchedule
โดยที่เราเพิ่มเทนต์เพื่อจับคู่พ็อดกับคู่คีย์-ค่า app=blue.
ดังนั้นด้วยการยอมรับนี้ ตอนนี้ Pod tol-pod จะได้รับอนุญาตให้กำหนดเวลากับ Node ซึ่งไม่บริสุทธิ์ให้ยอมรับประเภทค่า app= blue
มลทินและความอดทนทำงานร่วมกันอย่างไร:
ความคลาดเคลื่อนที่กำหนดในคำจำกัดความของพ็อดตรงกับเทนต์ (แมปกับโหนดของผู้ปฏิบัติงาน) โดยจะค้นหาคีย์ที่ตรงกันและเอฟเฟกต์เทนต์
ข้อควรจำ: มีสองกรณีพิเศษ:
โดยค่าเริ่มต้นการดำเนินการจะเป็นประเภท: เท่ากับ
- หากในคำจำกัดความมี คีย์ ว่างซึ่งมีโอเปอเรเตอร์ประเภท มีอยู่ จะตรงกับคีย์ ค่า และเอฟเฟกต์ทั้งหมด ซึ่งหมายความว่าคีย์-ค่านี้แมปกับเทนต์ใดๆ จะ อดทนกับทุกสิ่ง
- เอฟเฟกต์ ที่ว่างเปล่าจะจับคู่เอฟเฟกต์ทั้งหมดด้วยคีย์ คีย์
การทำความเข้าใจผลกระทบจากมลทินอื่นๆ:
เอฟเฟกต์สีมัว: ไม่กำหนดตารางเวลา
tolerations:
- key: "app"
operator: "Equal"
value: "blue"
effect: "PreferNoSchedule"
หากเราเปลี่ยนประเภทเอฟเฟกต์เทนต์เป็น : effect: "PreferNoSchedule",
ซึ่งหมายความว่าเป็นเวอร์ชัน "การตั้งค่า" หรือ "แบบอ่อน" ของ NoSchedule
-- ระบบจะพยายามหลีกเลี่ยงการวางพ็อดที่ไม่ทนต่อมลทินบนโหนด แต่ไม่จำเป็น
ผลเสีย: ไม่มีการดำเนินการ
เพื่อให้เข้าใจได้ดีขึ้น เรามาพิจารณากรณีการใช้งานใหม่โดยที่เรามี Tolerance หลายค่าที่แมปด้วยคู่คีย์-ค่าเดียวกัน แต่มีเอฟเฟกต์เทนต์ประเภทอื่น
มาเพิ่มโหนดเสีย: โหนด 1 ดังที่แสดงด้านล่าง
- $ kubectl taint nodes node1 app=blue:NoSchedule
- $ kubectl taint nodes node1 app=blue:NoExecute
- $ kubectl taint nodes node1 app=green:NoSchedule
ตอนนี้เรามาสร้างคำจำกัดความของพ็อดที่มีความคลาดเคลื่อนสองค่า ดังที่แสดงด้านล่าง:
apiVersion: v1 kind: Pod metadata: name: tol-pod labels: env: prod spec: containers: - name: nginx-cotainer image: nginx tolerations: - key: "app" operator: "Equal" value: "blue" effect: "NoSchedule" - key: "app" operator: "Equal" value: "blue" effect: "NoExecute"
คำอธิบาย:
ในสถานการณ์ที่อธิบายไว้ข้างต้น พ็อดของเราจะไม่ถูกกำหนดตารางเวลาบนโหนด node1เนื่องจากไม่มีค่าความคลาดเคลื่อนที่ตรงกับเทนต์ที่สาม
แต่หากพ็อดทำงานในโหนดอยู่แล้ว ก็จะสามารถดำเนินการต่อไปได้ ในกรณีที่โหนดเพิ่งถูกทำให้เสีย เนื่องจากมลทินที่สามเป็นเพียงหนึ่งในสามของค่าความคลาดเคลื่อนที่ยอมรับได้ ซึ่งไม่ได้ถูกกำหนดให้จัดการโดย โหนด
โดยทั่วไป หากโหนดใดๆ มีเทนต์ประเภท NoExecute
และพ็อดใดๆ ที่ยังไม่ได้พัฒนา ความทนทานต่อการจัดการเทนต์ จะถูกกำจัดออก (หากมีอยู่แล้วก่อนที่โหนดจะเสีย )แต่พ็อดใดๆ ที่ทนต่อมลทินจะไม่มีวันถูกไล่ออก
ความอดทนวินาที:
หากเราต้องการสั่งสอน pod ด้วยเอฟเฟกต์ taint: NoExecute ให้คงการเชื่อมโยงกับโหนดที่แปดเปื้อนและถูกบังคับให้ขับไล่ ในช่วงระยะเวลาหนึ่งโดยเฉพาะ เราสามารถใช้ฟิลด์เสริม tolerationSeconds
ใน tolerations ความหมายตามที่แสดงด้านล่าง
tolerations:
- key: "app"
operator: "Equal"
value: "app"
effect: "NoExecute"
tolerationSeconds: 3600
สรุป:
เราเข้าใจ
- Taints & Tolerations คืออะไร?
- เหตุใดจึงใช้ Taints & Tolerations?
- จะเพิ่มเทนต์ลงใน Worker Node ได้อย่างไร
- จะเพิ่มความอดทนให้กับพ็อดได้อย่างไร?
ฉันอยากจะปิดท้ายบทความนี้ด้วยสัญลักษณ์แสดงหัวข้อย่อยที่กล่าวถึงกรณีการใช้งานของ Taints & Tolerations ดังที่เราได้พูดคุยไปแล้ว ความไม่บริสุทธิ์และความทนทานเป็นวิธีที่ยืดหยุ่นในการขับไล่พ็อดออกจากโหนดหรือขับไล่พ็อดที่ไม่ควรทำงาน ดังนั้นจึงคุ้มค่าที่จะเห็นกรณีการใช้งานที่สำคัญกรณีหนึ่งในลักษณะเดียวกัน:
โหนดเฉพาะที่เชื่อมโยงกับกลุ่มผู้ใช้เฉพาะ/ชุดผู้ใช้
- หากในฐานะผู้ดูแลระบบ Kubernetes หรือสถาปนิก DevOps คุณต้องการใช้โหนดผู้ปฏิบัติงานใดๆ ในคลัสเตอร์ k8s สำหรับชุดหรือกลุ่มผู้ใช้เฉพาะโดยเฉพาะ เราสามารถทำได้โดย
$ kubectl taint nodes nodename dedicated=groupName:NoSchedule
พ็อดที่มีความคลาดเคลื่อนจะได้รับอนุญาตให้ใช้โหนดเฉพาะและโหนดที่ไม่บริสุทธิ์ในคลัสเตอร์ เพื่อให้ Pod ได้รับการกำหนดเวลาบนโหนดด้วยเลเบลเฉพาะ นั้น Pod จำเป็นต้องมีคำจำกัดความของความสัมพันธ์ของโหนด โดยต้องระบุป้ายกำกับนี้โดยเฉพาะ: groupName
เราจะเรียนรู้เพิ่มเติมเกี่ยวกับ Node Affinity ในบทความถัดไปในชุดนี้หรือเรื่อง Taints & Tolerations
<แข็งแกร่ง>2. การขับไล่ตามมลทิน:
เราสามารถใช้เอฟเฟกต์เทนต์ NoExecute อย่างชาญฉลาดเพื่อบังคับใช้การขับไล่พ็อดโดยอิงตามปัญหาของโหนดซึ่งจำเป็นต้องได้รับการจัดการเพื่อจัดการกับข้อจำกัดด้านทรัพยากรในโหนดหรือปัญหาอื่น ๆ ที่เกี่ยวข้องที่เกี่ยวข้องกับโหนดของผู้ปฏิบัติงาน
อะไรต่อไป?
เราจะพิจารณากรณีการใช้งานขั้นสูงของ Taints & Tolerations เช่น
- ความสัมพันธ์ของโหนด
- กรณีการใช้งาน Pod Eviction แบบไร้มลทิน
- จะควบคุมข้อกำหนดเฉพาะระดับฮาร์ดแวร์ในโหนดได้อย่างไร
- และอื่น ๆ อีกมากมาย…..
หากคุณชอบงานชิ้นนี้แสดงการสนับสนุนและความรักโดยติดตามฉันและปรบมือ