Kubernetes ประกาศให้การซัพพอร์ต Docker ในฐานะการเป็นคอนเทนเนอร์รันไทม์เข้าสู่สถานะ deprecated อย่างเป็นทางการใน Kubernetes 1.20 และเตรียมถอดฟีเจอร์นี้ออกในอนาคต
โครงการ Kubernetes ระบุว่า ตัว kubelet ที่เป็นตัวติดต่อกับคอนเทนเนอร์รันไทม์ จะติดต่อผ่าน CRI (Container Runtime Interface) แต่ในกรณีของ Docker นั้น ทางโครงการเลือกใช้ dockershim โมดูลที่อิมพลีเมนต์ CRI ให้ Docker เพื่อเป็นตัวติดต่อระหว่าง Docker และ Kubernetes มาอย่างยาวนาน แต่ช่วงหลังโครงการพบประเด็นหลายอย่างกับ dockershim ทำให้ตัดสินใจว่าจะให้ระบบซัพพอร์ต Docker เข้าสู่สถานะ deprecated และเตรียมถอดออกจาก Kubernetes ในอนาคต
นอกจากนี้ architecture ของ dockershim ค่อนข้างแตกต่างกับ CRI ตัวอื่น คือ dockershim จะติดกับตัว kubelet ในขณะที่ CRI อื่น ๆ จะใช้วิธีรันโปรเซสแยกแล้วติดต่อกันผ่าน GRPC
สำหรับผู้ที่ใช้งาน Docker เป็นคอนเทนเนอร์รันไทม์สำหรับ Kubernetes อยู่ ทางโครงการแนะนำให้ย้ายคอนเทนเนอร์รันไทม์ไปใช้ตัวที่รองรับ CRI เต็มรูปแบบ อย่างเช่น containerd หรือ CRI-O เป็นต้น
ที่มา - Kubernetes Change Log, Kubernetes GitHub Issue
ภาพจากข่าวเก่า
Comments
เพื่อขยายความนะครับ
docker ในที่นี้ให้มองว่าเป็นชุดของคำสั่ง ข้างในจะเข้าไปเรียกใช้ containerd ที่เป็น runtime เพื่อจัดการ container แทน
ข่าวนี้หมายถึงว่า k8s จะถอด docker ออกจาก runtime ที่ k8s ออก แต่ไปใช้ผ่านทาง containerd แทน
ถามว่าจะใช้ docker อยู่มั้ย ในแง่ของ runtime จริงๆ คงไม่ต่างกันเพราะตัวที่ทำงานจริงๆ ยังเป็น containerd เหมือนเดิม แค่ว่าเปลี่ยนจากใช้ผ่าน docker-shim มาเป็น containerd โดยตรง
onedd.net
ขอบคุณมากครับ กำลังงงกันอยู่พอดี
ขอบคุณมากครับ ผมยังใหม่กับทั้ง 2 อย่าง (Kubernetes กับ Docker) เห็นข่าว ก็ยังงงๆอยู่ๆ
..: เรื่อยไป
แล้วในมุมของ dev ถ้าไม่ใช้ docker ในการ build image จะใช้ตัวไหนแทนครับ
Ooh
เพิ่มเติมจากคอมเมนต์คุณ wiennat นะครับ
ต้องบอกว่าการประกาศ deprecate อันนี้สร้างความแตกตื่นไม่น้อยทีเดียว (ตัวผมเองด้วย) แต่จริงๆ แล้วมันไม่ได้กระทบกับ developer และ end users ของ K8s เยอะขนาดนั้นครับ
คำว่า Docker ที่ K8s จะถอดออกนั้นหมายถึงตัว runtime ที่ทำงานอยู่ภายใน K8s cluster อีกที ทำหน้าที่ "รัน" container ที่เรา deploy เข้าไป ซึ่งปกติคือ "Docker container" นั่นเอง
แปลว่า "Docker container" ที่เราๆ ใช้กันนั้นยังทำงานได้เหมือนเดิม ยัง build ด้วยคำสั่ง docker build เหมือนเดิม เขียน Dockerfile เหมือนเดิมครับ
และอย่างที่ข่าวเขียนไว้ว่าต้นเหตุของการเปลี่ยนแปลงครั้งนี้คือ Dockershim ที่ทำหน้าที่เป็นตัวกลางระหว่าง K8s cluster กับ Docker stack เพราะ K8s ต้องเข้าไปคุยกับ containerd runtime (ที่อยู่ใน Docker stack อีกที) ผ่าน Dockershim ซึ่ง shim เนี่ยมีปัญหาเยอะ รวมถึงเพิ่ม hop การติดต่อด้วย
ทีมงาน K8s เลยตัดสินใจเลิกใช้ Docker runtime แล้วให้ K8s cluster/kubelet คุยกับ containerd ตรงๆ ผ่าน CRI (Container Runtime Interface) ผลคือ container/pod จะ start เร็วขึ้นและกิน CPU/memory น้อยลง
ทั้งนี้ ถ้า Docker runtime มันรองรับ CRI ตั้งแต่แรก เราก็จะไม่มีประเด็นนี้เลย
นอกจากนี้หากเราใช้ DIND (Docker in Docker) อันนี้ต้องเปลี่ยนไปใช้อย่างอื่น เพราะจะใช้ไม่ได้แล้วครับ
สุดท้าย ใน K8s เวอร์ชัน 1.20 ทุกอย่างจะยังทำงานเหมือนเดิม เพียงแต่จะมีข้อความเตือนว่า Docker runtime จะถูกถอดออกในอนาคต ซึ่งแพลนตอนนี้คือในเวอร์ชัน 1.23 ช่วงกลางถึงปลายปี 2021 แปลว่ามีเวลาให้เตรียมตัวทดสอบ workload ของเราๆ กันอีกเกือบปี (หรือนานกว่านั้นถ้าเลื่อนการ deprecate ออกไป แต่จะไม่เร็วกว่าเวอร์ชัน 1.23 แน่ๆ)
ข้อมูลเพิ่มเติมดูได้ที่
และมี docs ของ Azure เขียนอธิบายเรื่อง containerd/dockershim ไว้ค่อนข้างดี รวมถึงบอกเรื่องความแตกต่างและข้อจำกัดต่างๆ ไว้ด้วยครับ >> Container runtime configuration
หากผมเข้าใจตรงไหนผิดไป ท่านอื่นแก้ได้เลยนะครับ
Pitawat's Blog :: บล็อกผมเองครับ
กราบ
..: เรื่อยไป
เพิ่มไฮไลต์เรื่องรันไทม์ไว้ละครับ เพื่อเน้นย้ำเรื่องความเข้าใจให้ชัดเจนยิ่งขึ้น