จะสร้างสภาพแวดล้อมการพัฒนาท้องถิ่นสำหรับ Kubernetes ได้อย่างไร?


115

Kubernetesดูเหมือนจะเกี่ยวกับการปรับใช้คอนเทนเนอร์กับคลาวด์ของคลัสเตอร์ สิ่งที่ดูเหมือนจะไม่แตะต้องคือการพัฒนาและการจัดเตรียมสภาพแวดล้อม (หรือเช่นนั้น)

ในระหว่างการพัฒนาคุณต้องการให้ใกล้เคียงกับสภาพแวดล้อมการผลิตมากที่สุดพร้อมกับการเปลี่ยนแปลงที่สำคัญบางประการ:

  • ติดตั้งในเครื่อง (หรืออย่างน้อยก็ที่ที่คุณและคุณเท่านั้นที่สามารถเข้าถึงได้ )
  • ใช้ซอร์สโค้ดล่าสุดในการรีเฟรชหน้า (สมมติว่าเป็นเว็บไซต์ควรรีเฟรชหน้าอัตโนมัติในการบันทึกไฟล์ในเครื่องซึ่งสามารถทำได้หากคุณติดตั้งซอร์สโค้ดและใช้บางสิ่งเช่นYeoman )

ในทำนองเดียวกันหนึ่งอาจต้องการสภาพแวดล้อมที่ไม่เปิดเผยต่อสาธารณะที่จะทำการบูรณาการอย่างต่อเนื่อง

Kubernetes รองรับสภาพแวดล้อมการพัฒนาแบบนั้นหรือไม่หรือเป็นสิ่งที่เราต้องสร้างขึ้นโดยหวังว่าระหว่างการผลิตจะยังคงใช้งานได้?


ลองดู Openshift Origin เป็นเวอร์ชันถัดไปของ Openshift และสร้างขึ้นบน Kubernetes รันแบบสแตนด์อโลนในคอนเทนเนอร์ Docker
Mark O'Connor

@ MarkO'Connor ฉันต้องการปรับใช้บน Google Cloud มากกว่า แต่นั่นเป็นโซลูชันการปรับใช้มากกว่า หากคุณมีวิธีแก้ปัญหาด้วย OpenShift Origin ที่ช่วยให้การพัฒนาท้องถิ่น (ส่วนใหญ่โหลดไฟล์ในเครื่องล่าสุด) โปรดแบ่งปันเป็นคำตอบฉันสนใจ
Wernight

คุณพบวิธีแก้ปัญหานี้แล้วหรือยัง? ฉันมี kubernetes ทำงานอยู่ด้านบนของ mesos ในคลัสเตอร์การพัฒนาในพื้นที่ของฉัน ฉันกำลังวางแผนที่จะสร้างไมโครเซอร์วิสที่จะนำไปใช้ในคอนเทนเนอร์บน kubernetes ฉันชอบที่จะสามารถบันทึกการเปลี่ยนแปลงของฉันและให้มันสร้างไบนารีโดยอัตโนมัติและเปิดใช้งานพ็อดอีกครั้ง ยังไม่ได้มีการเปลี่ยนแปลงเพื่อทดสอบ แต่ฉันคิดว่าการสร้างไบนารีบน vms แล้วเปิดใช้งานพ็อดใหม่อาจช้าไปหน่อย
F21

2
@ F21 เป็นเวลามากกว่าหนึ่งปีแล้วที่โพสต์สิ่งนี้ มีขั้นตอนการพัฒนาท้องถิ่นที่ดีกับ kubernetes หรือไม่?
Jatin

คุณสามารถดูการmicrok8sติดตั้ง k8s น้ำหนักเบาสำหรับเครื่องในพื้นที่ของคุณ ฉันได้โพสต์คำตอบเหมือนกันวิธีการติดตั้ง การติดตั้งใช้เวลาประมาณหนึ่งนาที
Prafull Ladha

คำตอบ:


67

ปรับปรุง (2016-07-15)

ด้วยการเปิดตัว Kubernetes 1.3 ตอนนี้Minikubeเป็นวิธีที่แนะนำในการเรียกใช้ Kubernetes บนเครื่องในพื้นที่ของคุณเพื่อการพัฒนา


คุณสามารถเรียกใช้Kubernetes ในประเทศผ่านทางหาง เมื่อคุณมีโหนดที่ทำงานอยู่คุณสามารถเปิดพ็อดที่มีเว็บเซิร์ฟเวอร์แบบธรรมดาและติดตั้งไดรฟ์ข้อมูลจากเครื่องโฮสต์ของคุณ เมื่อคุณเข้าสู่เว็บเซิร์ฟเวอร์มันจะอ่านจากไดรฟ์ข้อมูลและหากคุณเปลี่ยนไฟล์ในดิสก์ภายในเครื่องของคุณก็สามารถใช้งานเวอร์ชันล่าสุดได้


3
เอกสารบอกว่านี่ไม่ใช่วิธีการที่แนะนำอีกต่อไปและ "Minikube เป็นวิธีที่แนะนำในการเรียกใช้ Kubernetes บนเครื่องในพื้นที่ของคุณ"
Jatin

ฉันไม่คิดว่า minikube จะเหมาะกับการพัฒนา k8s เองใช่ไหม
harryz

ขึ้นอยู่กับสิ่งที่คุณกำลังพัฒนา มีหลายส่วนของ k8 ที่สมเหตุสมผลที่จะใช้ minikube ในการพัฒนา หากคุณกำลังทำงานกับนโยบายความปลอดภัยเครือข่ายพ็อดหรือปลั๊กอิน CNI แม้ว่าจะไม่สมเหตุสมผลสักเท่าไหร่
Robert Bailey

1
ลิงก์ "Kubernetes ในเครื่องผ่าน Docker" ใช้งานไม่ได้ ใครมีข้อมูลอัพเดต
Pwnosaurus

1
Minikube แทนที่การตั้งค่านักเทียบท่าในเครื่องในขณะที่ย้อนกลับไปและเอกสารสำหรับเวอร์ชันนักเทียบท่าในเครื่องได้ถูกลบออกในภายหลัง Minikube เหมาะกับความต้องการของคุณหรือไม่? คุณยังสามารถใช้ kubeadm ภายใน VM เพื่อสร้างอินสแตนซ์คลัสเตอร์โหนดเดียวแบบโลคัล
Robert Bailey

9

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

ดังนั้นคุณสามารถพัฒนาชีวิตพูด เอกสารที่http://telepresence.io


5

ประเภทของ "การโหลดซ้ำ" เป็นสิ่งที่เรามีแผนจะเพิ่ม แต่ไม่ง่ายอย่างที่เป็นอยู่ในปัจจุบัน อย่างไรก็ตามหากคุณรู้สึกผจญภัยคุณสามารถใช้ rsync กับ docker exec, kubectl exec หรือ osc exec (ทั้งหมดทำในลักษณะเดียวกันโดยประมาณ) เพื่อซิงค์ไดเร็กทอรีในเครื่องลงในคอนเทนเนอร์ทุกครั้งที่มีการเปลี่ยนแปลง คุณสามารถใช้ rsync กับ kubectl หรือ osc exec ได้ดังนี้:

# rsync using osc as netcat
$ rsync -av -e 'osc exec -ip test -- /bin/bash' mylocalfolder/ /tmp/remote/folder

การรีโหลดแบบร้อนด้วยตัวมันเองและควรได้รับการจัดการโดยเว็บเฟรมเวิร์กที่คุณใช้ที่นี่ Yeoman มักจะตั้งค่านั้น สิ่งที่ขาดหายไปคือวิธีการเปิดใช้งาน ต้องติดตั้งโวลุ่มท้องถิ่น หากคำตอบของ @ โรเบิร์ตใช้งานได้ก็ควรเป็นทางออกที่ถูกต้อง
Wernight

4

จุดเริ่มต้นที่ดีอีกอย่างคือการตั้งค่า Vagrantโดยเฉพาะ หากระบบปฏิบัติการโฮสต์ของคุณเป็น Windows ข้อดีที่ชัดเจนคือ

  • การตั้งค่าที่รวดเร็วและไม่เจ็บปวด
  • ง่ายต่อการทำลาย / สร้างเครื่องใหม่
  • การ จำกัด ทรัพยากรโดยปริยาย
  • ความสามารถในการทดสอบมาตราส่วนแนวนอนโดยการสร้างหลายโหนด

ข้อเสีย - คุณต้องใช้ RAM มากและ VirtualBox คือ VirtualBox ... ดีขึ้นหรือแย่ลง

ข้อดี / ข้อเสียแบบผสมคือการแมปไฟล์ผ่าน NFS ในการตั้งค่าของเราเราได้สร้างคำจำกัดความ RC สองชุด - ชุดหนึ่งที่เพียงดาวน์โหลดอิมเมจนักเทียบท่าของแอปพลิเคชันเซิร์ฟเวอร์ของเรา อีก 7 บรรทัดพิเศษที่ตั้งค่าการแมปไฟล์จาก HostOS -> Vagrant -> VirtualBox -> CoreOS -> Kubernetes pod; เขียนทับซอร์สโค้ดจากอิมเมจ Docker

ข้อเสียของสิ่งนี้คือแคชไฟล์ NFS - ด้วยมันมีปัญหาถ้าไม่มีมันก็ช้าอย่างมีปัญหา แม้แต่การตั้งค่าmount_options: 'nolock,vers=3,udp,noac'ก็ไม่สามารถกำจัดปัญหาการแคชได้อย่างสมบูรณ์ แต่ก็ใช้งานได้เกือบตลอดเวลา งาน Gulp บางอย่างที่รันในคอนเทนเนอร์อาจใช้เวลา 5 นาทีเมื่อใช้เวลา 8 วินาทีบนโฮสต์ OS mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15'ประนีประนอมที่ดีน่าจะเป็น

สำหรับการรีโหลดโค้ดอัตโนมัตินั้นเป็นภาษาเฉพาะ แต่เราพอใจกับ devserver ของ Django สำหรับ Python และ Nodemon สำหรับ Node.js สำหรับโครงการส่วนหน้าแน่นอนว่าคุณสามารถทำอะไรได้หลายอย่างเช่น gulp + browserSync + watch แต่สำหรับนักพัฒนาหลายคนการให้บริการจาก Apache นั้นไม่ใช่เรื่องยากและเพียงแค่ทำการรีเฟรชแบบดั้งเดิม

เราเก็บไฟล์ yaml ไว้ 4 ชุดสำหรับ Kubernetes Dev, "devstable", stage, prod ความแตกต่างระหว่างสิ่งเหล่านี้คือ

  • ตัวแปร env ตั้งค่าสภาพแวดล้อมอย่างชัดเจน (dev / stage / prod)
  • จำนวนแบบจำลอง
  • devstable, stage, prod ใช้ภาพนักเทียบท่า
  • dev ใช้อิมเมจนักเทียบท่าและแมปโฟลเดอร์ NFS ด้วยซอร์สโค้ดเหนือพวกเขา

มันมีประโยชน์มากในการสร้างจำนวนมากของนามแฝงทุบตีและเติมข้อความอัตโนมัติ - ฉันสามารถเพียงพิมพ์และจะทำrec users kubectl delete -f ... ; kubectl create -f ...ถ้าฉันต้องการให้การตั้งค่าทั้งหมดเริ่มต้นฉันพิมพ์recfoและมันจะสร้างบริการขึ้นมาใหม่โดยดึงอิมเมจนักเทียบท่าล่าสุดนำเข้า db dump ล่าสุดจาก Staging env และล้างไฟล์ Docker เก่าเพื่อประหยัดเนื้อที่


4

ฉันเพิ่งเริ่มต้นกับSkaffold

การใช้การเปลี่ยนแปลงในโค้ดโดยอัตโนมัติกับคลัสเตอร์ภายในมีประโยชน์มาก

ในการปรับใช้คลัสเตอร์ภายในวิธีที่ดีที่สุดคือ Minikube หรือเพียงแค่ Docker สำหรับ Mac และ Windows ซึ่งทั้งคู่จะมีอินเทอร์เฟซ Kubernetes



2

การมีวงตอบรับการพัฒนาในท้องถิ่นที่ดีเป็นหัวข้อของการพัฒนาอย่างรวดเร็วในระบบนิเวศ Kubernetes

เมื่อหมดคำถามนี้มีเครื่องมือบางอย่างที่ฉันเชื่อว่าช่วยสนับสนุนเป้าหมายนี้ได้ดี

Docker สำหรับ Mac Kubernetes

Docker สำหรับ Mac Kubernetes ( Docker Desktopเป็นชื่อข้ามแพลตฟอร์มทั่วไป) เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการพัฒนาในท้องถิ่น สำหรับการจำลองเสมือนจะใช้HyperKitซึ่งสร้างขึ้นจากเฟรมเวิร์ก Hypervisor ดั้งเดิมใน macOS แทน VirtualBox

คุณลักษณะ Kubernetes เป็นครั้งแรกที่ปล่อยออกมาเป็นรุ่นเบต้าในช่องขอบในมกราคม 2018และมีวิธีมานานตั้งแต่กลายเป็นได้รับการรับรอง Kubernetes ในเมษายน 2018และจบการศึกษาไปยังช่องที่มีเสถียรภาพในกรกฎาคม 2018

จากประสบการณ์ของฉันการทำงานกับ Minikube ง่ายกว่ามากโดยเฉพาะอย่างยิ่งบน macOS และโดยเฉพาะอย่างยิ่งเมื่อพูดถึงปัญหาเช่น RBAC, Helm, hypervisor, Private Registry เป็นต้น

หางเสือ

เท่าที่แจกจ่ายรหัสของคุณและดึงการอัปเดตในเครื่องHelmเป็นหนึ่งในตัวเลือกยอดนิยม คุณสามารถเผยแพร่แอปพลิเคชันของคุณผ่าน CI / CD เป็นแผนภูมิ Helm (และภาพ Docker ที่อ้างอิง) จากนั้นคุณสามารถดึงแผนภูมิเหล่านี้จากรีจิสทรีแผนภูมิ Helm ในเครื่องและอัปเกรดในคลัสเตอร์ในพื้นที่ของคุณ

ร่าง Azure

คุณยังสามารถใช้เครื่องมือเช่นAzure Draftเพื่อทำการปรับใช้ในเครื่องอย่างง่ายและสร้างแผนภูมิ Helm พื้นฐานจากเทมเพลตภาษาทั่วไปเช่น buildpacks เพื่อทำให้ปริศนาชิ้นนั้นเป็นไปโดยอัตโนมัติ

Skaffold

Skaffoldเป็นเหมือน Azure Draft แต่เป็นผู้ใหญ่กว่ามีขอบเขตกว้างกว่ามากและสร้างโดย Google มีสถาปัตยกรรมที่เสียบปลั๊กได้มาก ฉันคิดว่าในอนาคตจะมีคนใช้แอปในท้องถิ่นสำหรับ Kubernetes มากขึ้น

หากคุณเคยใช้ React ฉันจะนึกถึง Skaffold เป็น " สร้างแอป React for Kubernetes"

Kompose หรือเขียนบน Kubernetes

Docker Composeในขณะที่ไม่เกี่ยวข้องกับ Kubernetes เป็นอีกทางเลือกหนึ่งที่บาง บริษัท ใช้เพื่อจัดเตรียมสภาพแวดล้อมการพัฒนาท้องถิ่นที่เรียบง่ายสะดวกและพกพาได้ซึ่งคล้ายคลึงกับสภาพแวดล้อม Kubernetes ที่ทำงานในการผลิต อย่างไรก็ตามการไปตามเส้นทางนี้หมายถึงการเปลี่ยนการผลิตและการตั้งค่าการพัฒนาในท้องถิ่น

Komposeเป็นตัวแปลง Docker Compose to Kubernetes นี่อาจเป็นเส้นทางที่มีประโยชน์สำหรับผู้ที่ใช้งานแอปพลิเคชันของตนเป็นคอลเล็กชันคอนเทนเนอร์ในเครื่องอยู่แล้ว

Compose on Kubernetesเป็นข้อเสนอโอเพ่นซอร์สเมื่อเร็ว ๆ นี้ (ธันวาคม 2018) จาก Docker ซึ่งช่วยให้สามารถปรับใช้ไฟล์ Docker Compose ไปยังคลัสเตอร์ Kubernetes ได้โดยตรงผ่านตัวควบคุมที่กำหนดเอง


1

Kubesparyมีประโยชน์ในการตั้งค่าคลัสเตอร์ในพื้นที่ ส่วนใหญ่ฉันใช้คลัสเตอร์ตามคนเร่ร่อนบนเครื่องท้องถิ่น

การกำหนดค่า Kubespray คุณสามารถปรับแต่งตัวแปรเหล่านี้เพื่อให้มีเวอร์ชัน kubernetes ที่ต้องการ


1

ข้อเสียของการใช้minkubeคือมันวางไข่เครื่องเสมือนอื่นบนเครื่องของคุณ นอกจากนี้ล่าสุดminikubeเวอร์ชันขั้นต่ำจะต้องมี 2 CPU และ RAM 2GB จากระบบของคุณซึ่งทำให้ค่อนข้างหนักหากคุณไม่มีระบบที่มีทรัพยากรเพียงพอ

นี่คือเหตุผลที่ฉันเปลี่ยนมาmicrok8sใช้การพัฒนาบน kubernetes และฉันก็ชอบมัน microk8sรองรับ DNS, ที่เก็บข้อมูลในเครื่อง, แดชบอร์ด, istio, ทางเข้าและอื่น ๆ อีกมากมายทุกสิ่งที่คุณต้องการในการทดสอบไมโครเซอร์วิสของคุณ

ได้รับการออกแบบให้เป็นการติดตั้ง Kubernetes ต้นน้ำที่รวดเร็วและมีน้ำหนักเบาแยกจากสภาพแวดล้อมในพื้นที่ของคุณ การแยกนี้ทำได้โดยการบรรจุไบนารีทั้งหมดสำหรับ Kubernetes, Docker.io, iptables และ CNI ไว้ในแพ็คเกจ snap เดียว

คลัสเตอร์ kubernetes โหนดเดียวสามารถติดตั้งได้ภายในหนึ่งนาทีด้วยคำสั่งเดียว:

snap install microk8s --classic

ตรวจสอบให้แน่ใจว่าระบบของคุณไม่มีบริการ Docker หรือ kubelet ทำงานอยู่ Microk8sจะติดตั้งบริการที่จำเป็นทั้งหมดโดยอัตโนมัติ

โปรดดูลิงก์ต่อไปนี้เพื่อเปิดใช้งานส่วนเสริมอื่น ๆ ใน microk8s

https://github.com/ubuntu/microk8s

คุณสามารถตรวจสอบสถานะโดยใช้:

velotio@velotio-ThinkPad-E470:~/PycharmProjects/k8sClient$ microk8s.status
microk8s is running
addons:
ingress: disabled
dns: disabled
metrics-server: disabled
istio: disabled
gpu: disabled
storage: disabled
dashboard: disabled
registry: disabled

> ตรวจสอบให้แน่ใจว่าระบบของคุณไม่มีบริการ Docker หรือ kubelet ทำงานอยู่ แต่ฉันติดตั้ง Docker ไว้แล้วและฉันใช้งานคอนเทนเนอร์นอกเหนือจาก Kubernetes หมายความว่าฉันไม่สามารถติดตั้ง microk8s ในเครื่องได้หรือไม่?
Attila Szeremi

1

ดูได้ที่https://github.com/okteto/oktetoและ Okteto เมฆ การนำเสนอคุณค่าคือการมีประสบการณ์การพัฒนาแบบคลาสสิกมากกว่าการทำงานในพื้นที่ก่อนนักเทียบท่าซึ่งคุณสามารถมีการโหลดซ้ำการสร้างส่วนเพิ่มตัวแก้ไขข้อบกพร่อง ... แต่การเปลี่ยนแปลงในเครื่องทั้งหมดของคุณจะถูกซิงโครไนซ์กับคอนเทนเนอร์ระยะไกลทันที คอนเทนเนอร์ระยะไกลช่วยให้คุณเข้าถึงความเร็วของระบบคลาวด์อนุญาตระดับใหม่ของการทำงานร่วมกันและรวมการพัฒนาในสภาพแวดล้อมที่เหมือนการผลิต นอกจากนี้ยังช่วยลดภาระในการติดตั้งในพื้นที่


0

ตามที่ Robert ระบุไว้ก่อนหน้านี้ minikube คือหนทางที่จะไป

นี่คือคำแนะนำโดยย่อเพื่อเริ่มต้นกับ minikube ขั้นตอนทั่วไปมีดังนี้

  • ติดตั้ง minikube

  • สร้างคลัสเตอร์ minikube (ใน Virtual Machine ซึ่งสามารถเป็น VirtualBox หรือ Docker สำหรับ Mac หรือ HyperV ในกรณีของ Windows)

  • สร้างอิมเมจ Docker ของไฟล์แอปพลิเคชันของคุณ (โดยใช้ Dockerfile)

  • เรียกใช้รูปภาพโดยสร้างการปรับใช้

  • สร้างบริการที่เปิดเผยแอปพลิเคชันของคุณเพื่อให้คุณสามารถเข้าถึงได้


0

นี่คือวิธีที่ฉันตั้งค่าในเครื่องสำหรับ Kubernetes ใน Windows 10: -

  • ใช้ Docker Desktop

  • เปิดใช้งาน Kubernetes ในตัวเลือกการตั้งค่าของ Docker Desktop

  • ใน Docker Desktop โดยทรัพยากรเริ่มต้นที่จัดสรรสำหรับหน่วยความจำคือ 2GB ดังนั้นการใช้ Kubernetes ร่วมกับ Docker Desktop จะเพิ่มหน่วยความจำ

  • ติดตั้ง kubectl เป็นไคลเอนต์เพื่อพูดคุยกับคลัสเตอร์ Kubernetes

  • รันคำสั่งkubectl config get-contextsเพื่อรับคลัสเตอร์ที่พร้อมใช้งาน

  • รันคำสั่งkubectl config use-context docker-desktopเพื่อใช้ docker desktop

  • สร้างภาพนักเทียบท่าของแอปพลิเคชันของคุณ

  • เขียนไฟล์ YAML (วิธีการอธิบายเพื่อสร้างการปรับใช้ของคุณใน Kubernetes) โดยชี้ไปที่รูปภาพที่สร้างในคลัสเตอร์ขั้นตอนด้านบน

  • เปิดเผยบริการของพอร์ตโหนดประเภทสำหรับการปรับใช้แต่ละครั้งของคุณเพื่อให้พร้อมใช้งานกับโลกภายนอก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.