เมื่อไม่นานมานี้เราใช้เว็บแอปพลิเคชันเสาหินซึ่งเป็นฐานข้อมูลขนาดใหญ่ที่เติบโตขึ้นในฟังก์ชันและคุณสมบัติใหม่ ๆ จนกลายเป็นยักษ์ใหญ่ที่เคลื่อนไหวช้าและยากต่อการจัดการ ขณะนี้นักพัฒนาสถาปนิกและผู้เชี่ยวชาญด้าน DevOps จำนวนเพิ่มมากขึ้นมีความเห็นว่าควรใช้ไมโครเซอร์วิสมากกว่าเสาหินขนาดยักษ์ โดยปกติแล้วการใช้สถาปัตยกรรมที่ใช้ไมโครเซอร์วิสหมายถึงการแยกเสาหินของคุณออกเป็นอย่างน้อยสองแอปพลิเคชัน ได้แก่ แอปส่วนหน้าและแอปส่วนหลัง (API) หลังจากตัดสินใจใช้ไมโครเซอร์วิสคำถามเกิดขึ้น: การเรียกใช้ไมโครเซอร์วิสในสภาพแวดล้อมใดดีกว่ากัน ฉันควรเลือกอะไรเพื่อให้บริการของฉันมีความเสถียรรวมถึงง่ายต่อการจัดการและปรับใช้ คำตอบสั้น ๆ คือใช้ Docker!
ในบทความนี้ฉันจะแนะนำคุณเกี่ยวกับคอนเทนเนอร์อธิบาย Kubernetes และสอนวิธีจัดคอนเทนเนอร์และทำให้แอปใช้งานได้กับคลัสเตอร์ Kubernetes โดยใช้ CircleCI
นักเทียบท่า? Docker คืออะไร?
Docker เป็นเครื่องมือที่ออกแบบมาเพื่อทำให้ DevOps (และชีวิตของคุณ) ง่ายขึ้น ด้วย Docker นักพัฒนาสามารถสร้างปรับใช้และเรียกใช้แอปพลิเคชันในรูปแบบ ตู้คอนเทนเนอร์ . คอนเทนเนอร์ช่วยให้นักพัฒนาสามารถจัดแพ็กเกจแอปพลิเคชันที่มีทุกส่วนที่ต้องการเช่นไลบรารีและการอ้างอิงอื่น ๆ และจัดส่งทั้งหมดเป็นแพ็กเกจเดียว
ด้วยการใช้คอนเทนเนอร์นักพัฒนาสามารถปรับใช้อิมเมจไปยังระบบปฏิบัติการใดก็ได้ เพียงติดตั้ง Docker ดำเนินการคำสั่งแอปพลิเคชันของคุณก็พร้อมใช้งาน อ้อและไม่ต้องกังวลกับความไม่สอดคล้องกับไลบรารีเวอร์ชันใหม่ในระบบปฏิบัติการโฮสต์ นอกจากนี้คุณสามารถเปิดใช้งานคอนเทนเนอร์เพิ่มเติมบนโฮสต์เดียวกันได้ซึ่งจะเป็นแอปเดียวกันหรือไม่ มันไม่สำคัญ
ดูเหมือนว่า Docker จะเป็นเครื่องมือที่ยอดเยี่ยม แต่ฉันควรเปิดคอนเทนเนอร์อย่างไรและที่ไหน?
มีตัวเลือกมากมายสำหรับวิธีเรียกใช้คอนเทนเนอร์: AWS Elastic Container Service (AWS Fargate หรืออินสแตนซ์ที่สงวนไว้พร้อมการปรับขนาดอัตโนมัติในแนวนอนและแนวตั้ง) อินสแตนซ์ระบบคลาวด์ที่มีอิมเมจ Docker ที่กำหนดไว้ล่วงหน้าใน Azure หรือ Google Cloud (พร้อมเทมเพลตกลุ่มอินสแตนซ์และการปรับขนาดอัตโนมัติ) บนเซิร์ฟเวอร์ของคุณเองด้วย Docker; หรือแน่นอน Kubernetes! Kubernetes สร้างขึ้นโดยเฉพาะสำหรับการจำลองเสมือนและคอนเทนเนอร์โดยวิศวกรของ Google ในปี 2014
java rest เฟรมเวิร์กการทดสอบ api
Kubernetes? นั่นคืออะไร?
Kubernetes เป็นระบบโอเพนซอร์สที่ช่วยให้คุณสามารถเรียกใช้คอนเทนเนอร์จัดการคอนเทนเนอร์ใช้งานอัตโนมัติปรับขนาดการปรับใช้สร้างและกำหนดค่าทางเข้าปรับใช้แอปพลิเคชันไร้สถานะหรือสถานะและอื่น ๆ อีกมากมาย โดยพื้นฐานแล้วคุณสามารถเปิดใช้งานอินสแตนซ์ตั้งแต่หนึ่งรายการขึ้นไปและติดตั้ง Kubernetes เพื่อดำเนินการเป็นคลัสเตอร์ Kubernetes จากนั้นรับปลายทาง API ของคลัสเตอร์ Kubernetes กำหนดค่า kubectl
(เครื่องมือสำหรับจัดการคลัสเตอร์ Kubernetes) และ Kubernetes พร้อมให้บริการแล้ว
เหตุใดฉันจึงควรใช้?
ด้วย Kubernetes คุณสามารถใช้ทรัพยากรการคำนวณได้สูงสุด ด้วย Kubernetes คุณจะเป็นกัปตันเรือของคุณ (โครงสร้างพื้นฐาน) โดยที่ Kubernetes เติมใบเรือของคุณ ด้วย Kubernetes บริการของคุณจะเป็น HA และที่สำคัญที่สุดเมื่อใช้ Kubernetes คุณจะประหยัดเงินได้มาก
น่าดู! โดยเฉพาะอย่างยิ่งถ้าจะประหยัดเงิน! มาพูดถึงเรื่องนี้กันดีกว่า!
Kubernetes กำลังได้รับความนิยมทุกวัน มาเจาะลึกและตรวจสอบสิ่งที่อยู่ภายใต้ประทุน
Kubernetes เป็นชื่อของระบบทั้งหมด แต่เช่นเดียวกับรถของคุณมีชิ้นส่วนขนาดเล็กจำนวนมากที่ทำงานร่วมกันอย่างลงตัวเพื่อให้ Kubernetes ทำงานได้ มาเรียนรู้กันว่าพวกเขาคืออะไร
โหนดหลัก - แผงควบคุมสำหรับคลัสเตอร์ Kubernetes ทั้งหมด ส่วนประกอบของต้นแบบสามารถรันบนโหนดใดก็ได้ในคลัสเตอร์ ส่วนประกอบที่สำคัญ ได้แก่ :
พ็อดและบริการคืออะไร?
พ็อด เป็นหน่วยที่เล็กที่สุดของคลัสเตอร์ Kubernetes เปรียบเสมือนอิฐก้อนเดียวในผนังของอาคารขนาดใหญ่ พ็อดคือชุดของคอนเทนเนอร์ที่ต้องทำงานร่วมกันและสามารถแชร์ทรัพยากรได้ (เนมสเปซ Linux, cgroups, ที่อยู่ IP) ฝักไม่ได้มีไว้เพื่อให้มีอายุยืนยาว
บริการ เป็นนามธรรมที่อยู่ด้านบนของพ็อดจำนวนมากโดยทั่วไปต้องมีพร็อกซีอยู่ด้านบนสำหรับบริการอื่น ๆ เพื่อสื่อสารกับมันผ่านที่อยู่ IP เสมือน
ฉันจะใช้แอปพลิเคชัน Ruby on Rails และ GKE เป็นแพลตฟอร์มสำหรับเรียกใช้ Kubernetes จริงๆแล้วคุณสามารถใช้ Kubernetes ใน AWS หรือ Azure หรือแม้แต่สร้างคลัสเตอร์ในฮาร์ดแวร์ของคุณเองหรือเรียกใช้ Kubernetes ภายในเครื่องโดยใช้ minikube
- ตัวเลือกทั้งหมดที่คุณจะพบใน นี้ หน้า.
ไฟล์ต้นฉบับสำหรับแอพนี้สามารถพบได้ใน ที่เก็บ GitHub นี้ .
ข้อใดต่อไปนี้ถูกต้องสำหรับความยืดหยุ่นของราคาอุปสงค์
ในการสร้างแอพ Rails ใหม่ให้ดำเนินการ:
rails new blog
ในการกำหนดค่าการเชื่อมต่อ MySQL สำหรับการใช้งานจริงใน config/database.yml file
:
production: adapter: mysql2 encoding: utf8 pool: 5 port: 3306 database: host: 127.0.0.1 username: password:
ในการสร้างโมเดลบทความตัวควบคุมมุมมองและการโยกย้ายให้ดำเนินการ:
rails g scaffold Article title:string description:text
ในการเพิ่มอัญมณีใน Gemfile:
gem 'mysql2', '= 0.4.4' gem 'health_check'
ในการสร้างอิมเมจ Docker ให้คว้าไฟล์ Dockerfile และดำเนินการ:
docker build -t REPO_NAME/IMAGE_NAME:TAG . && docker push REPO_NAME/IMAGE_NAME:TAG
ถึงเวลาสร้างคลัสเตอร์ Kubernetes เปิดเพจ GKE และสร้างคลัสเตอร์ Kubernetes เมื่อสร้างคลัสเตอร์แล้วให้คลิก“ ปุ่มเชื่อมต่อ” และคัดลอกคำสั่ง - ต้องแน่ใจว่าคุณมีเครื่องมือ gCloud CLI ( ทำอย่างไร ) และ kubectl ติดตั้งและกำหนดค่า ดำเนินการคำสั่งที่คัดลอกบนพีซีของคุณและตรวจสอบการเชื่อมต่อกับคลัสเตอร์ Kubernetes ดำเนินการ kubectl cluster-info
.
แอปพร้อมที่จะปรับใช้กับคลัสเตอร์ k8s มาสร้างฐานข้อมูล MySQL เปิดเพจ SQL ในคอนโซล gCloud และสร้างอินสแตนซ์ MySQL DB สำหรับแอ็พพลิเคชัน เมื่ออินสแตนซ์พร้อมให้สร้างผู้ใช้และฐานข้อมูลและคัดลอกไฟล์ ชื่อการเชื่อมต่ออินสแตนซ์ .
นอกจากนี้เราต้องสร้างรหัสบัญชีบริการในไฟล์ API และบริการ หน้าสำหรับเข้าถึง MySQL DB จากคอนเทนเนอร์ด้านข้าง คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการนั้น ที่นี่ . เปลี่ยนชื่อไฟล์ที่ดาวน์โหลดเป็น service-account.json
เราจะกลับมาที่ไฟล์นั้นในภายหลัง
เราพร้อมที่จะใช้งานแอปพลิเคชันของเรากับ Kubernetes แต่ก่อนอื่นเราควรสร้าง ความลับ สำหรับแอปพลิเคชันของเรา - วัตถุลับใน Kubernetes ที่สร้างขึ้นเพื่อจัดเก็บข้อมูลที่ละเอียดอ่อน อัปโหลด service-account.json
ที่ดาวน์โหลดมาก่อนหน้านี้ ไฟล์:
kubectl create secret generic mysql-instance-credentials --from-file=credentials.json=service-account.json
สร้างความลับสำหรับแอปพลิเคชัน:
kubectl create secret generic simple-app-secrets --from-literal=username=$MYSQL_PASSWORD --from-literal=password=$MYSQL_PASSWORD --from-literal=database-name=$MYSQL_DB_NAME --from-literal=secretkey=$SECRET_RAILS_KEY
อย่าลืมแทนที่ค่าหรือตั้งค่าตัวแปรสภาพแวดล้อมด้วยค่าของคุณ
ก่อนที่จะสร้างการทำให้ใช้งานได้มาดูที่ ไฟล์การปรับใช้ . ฉันเชื่อมไฟล์สามไฟล์เข้าด้วยกัน ส่วนแรกคือบริการที่จะแสดงพอร์ต 80 และส่งต่อการเชื่อมต่อทั้งหมดที่มาที่พอร์ต 80 ถึง 3000 บริการมีตัวเลือกซึ่งบริการรู้ว่าพ็อดใดที่ควรส่งต่อการเชื่อมต่อ
ส่วนถัดไปของไฟล์คือการปรับใช้ซึ่งอธิบายถึงกลยุทธ์การปรับใช้ - คอนเทนเนอร์ซึ่งจะถูกเรียกใช้ภายในพ็อดตัวแปรสภาพแวดล้อมทรัพยากรโพรบการเมาท์สำหรับแต่ละคอนเทนเนอร์และข้อมูลอื่น ๆ
ส่วนสุดท้ายคือ Horizontal Pod Autoscaler HPA มีการกำหนดค่าที่ค่อนข้างเรียบง่าย โปรดทราบว่าหากคุณไม่ได้ตั้งค่าทรัพยากรสำหรับคอนเทนเนอร์ในส่วนการปรับใช้ HPA จะไม่ทำงาน.
คุณกำหนดค่า Vertical Autoscaler สำหรับคลัสเตอร์ Kubernetes ได้ในหน้าแก้ไข GKE นอกจากนี้ยังมีการกำหนดค่าที่ค่อนข้างเรียบง่าย
ได้เวลาจัดส่งไปยังคลัสเตอร์ GKE! ก่อนอื่นเราควรเรียกใช้การย้ายข้อมูลผ่าน งาน . ดำเนินการ:
kubectl apply -f rake-tasks-job.yaml
- งานนี้จะเป็นประโยชน์สำหรับกระบวนการ CI / CD
kubectl apply -f deployment.yaml
- เพื่อสร้างบริการการปรับใช้และ HPA
การโจมตีแอปพลิเคชันเว็บเซิร์ฟเวอร์ประเภทใดที่แนะนำการป้อนข้อมูลใหม่เพื่อใช้ประโยชน์จากช่องโหว่
จากนั้นตรวจสอบพ็อดของคุณโดยดำเนินการคำสั่ง: kubectl get pods -w
NAME READY STATUS RESTARTS AGE sample-799bf9fd9c-86cqf 2/2 Running 0 1m sample-799bf9fd9c-887vv 2/2 Running 0 1m sample-799bf9fd9c-pkscp 2/2 Running 0 1m
ตอนนี้เรามาสร้างทางเข้าสำหรับแอปพลิเคชัน:
gcloud compute addresses create sample-ip --global
kubectl apply -f ingress.yaml
kubectl get ingress -w
มาสร้างไปป์ไลน์ CI / CD โดยใช้ CircleCI จริงๆแล้วการสร้างไปป์ไลน์ CI / CD โดยใช้ CircleCI เป็นเรื่องง่าย แต่โปรดทราบว่ากระบวนการปรับใช้อัตโนมัติที่รวดเร็วและสกปรกโดยไม่มีการทดสอบเช่นนี้จะใช้ได้กับโครงการขนาดเล็ก แต่โปรดอย่าทำสิ่งนี้เพื่ออะไรที่ร้ายแรงเพราะ หากรหัสใหม่มีปัญหาในการผลิตคุณจะเสียเงิน นั่นคือเหตุผลที่คุณควรคิดเกี่ยวกับการออกแบบกระบวนการปรับใช้ที่มีประสิทธิภาพเปิดใช้งาน Canary ก่อนเปิดตัวเต็มรูปแบบตรวจสอบข้อผิดพลาดในบันทึกหลังจาก Canary เริ่มต้นและอื่น ๆ
ขณะนี้เรามีโครงการเล็ก ๆ ที่เรียบง่ายดังนั้นเรามาสร้างกระบวนการปรับใช้ CI / CD แบบอัตโนมัติเต็มรูปแบบโดยไม่ต้องทดสอบ ขั้นแรกคุณควรรวม CircleCI เข้ากับที่เก็บของคุณคุณจะพบคำแนะนำทั้งหมด ที่นี่ . จากนั้นเราควรสร้างไฟล์กำหนดค่าพร้อมคำแนะนำสำหรับระบบ CircleCI Config ดูเรียบง่าย ประเด็นหลักคือมีสองสาขาใน repo GitHub: master
และ production
.
ก่อนรันบิลด์ใด ๆ คุณควรกำหนดค่าโปรเจ็กต์ใน CircleCI สร้างบัญชีบริการใหม่ใน API และเพจ Services ใน GCloud ด้วยบทบาทเหล่านี้: เข้าถึง GCR และ GKE โดยสมบูรณ์เปิดไฟล์ JSON ที่ดาวน์โหลดมาและคัดลอกเนื้อหาจากนั้นสร้างตัวแปรสภาพแวดล้อมใหม่ในการตั้งค่าโปรเจ็กต์ใน CircleCI ด้วยชื่อ GCLOUD_SERVICE_KEY
และวางเนื้อหาของไฟล์บัญชีบริการเป็นค่า นอกจากนี้คุณต้องสร้าง env vars ถัดไป: GOOGLE_PROJECT_ID
(คุณสามารถพบได้ในหน้าแรกของคอนโซล GCloud), GOOGLE_COMPUTE_ZONE
(โซนสำหรับคลัสเตอร์ GKE ของคุณ) และ GOOGLE_CLUSTER_NAME
(ชื่อคลัสเตอร์ GKE)
ขั้นตอนสุดท้าย (ปรับใช้) ที่ CircleCI จะมีลักษณะดังนี้:
kubectl patch deployment sample -p '{'spec':{'template':{'spec':{'containers':[{'name':'sample','image':'gcr.io/test-d6bf8/simple:''$CIRCLE_SHA1'''}]}}}}' if ! kubectl rollout status deploy/sample; then echo 'DEPLOY FAILED, ROLLING BACK TO PREVIOUS' kubectl rollout undo deploy/sample # Deploy failed -> notify slack else echo 'Deploy succeeded, current version: ${CIRCLE_SHA1}' # Deploy succeeded -> notify slack fi deployment.extensions/sample patched Waiting for deployment 'sample' rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment 'sample' rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment 'sample' rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment 'sample' rollout to finish: 1 old replicas are pending termination... Waiting for deployment 'sample' rollout to finish: 1 old replicas are pending termination... Waiting for deployment 'sample' rollout to finish: 1 old replicas are pending termination... Waiting for deployment 'sample' rollout to finish: 2 of 3 updated replicas are available... Waiting for deployment 'sample' rollout to finish: 2 of 3 updated replicas are available... deployment 'sample' successfully rolled out Deploy succeeded, current version: 512eabb11c463c5431a1af4ed0b9ebd23597edd9
ดูเหมือนว่ากระบวนการสร้างคลัสเตอร์ Kubernetes ใหม่จะไม่ยากนัก! และกระบวนการ CI / CD นั้นยอดเยี่ยมมาก!
ใช่ Kubernetes สุดยอดมาก! ด้วย Kubernetes ระบบของคุณจะมีเสถียรภาพมากขึ้นจัดการได้ง่ายขึ้นและจะทำให้คุณเป็นกัปตันของระบบ ไม่ต้องพูดถึง Kubernetes สร้างความตื่นเต้นให้กับระบบเล็กน้อยและจะให้ +100 คะแนนสำหรับการตลาดของคุณ!
เมื่อคุณมีพื้นฐานแล้วคุณสามารถดำเนินการต่อไปและเปลี่ยนเป็นการกำหนดค่าขั้นสูงเพิ่มเติมได้ ฉันกำลังวางแผนที่จะครอบคลุมมากขึ้นในบทความในอนาคต แต่ในระหว่างนี้นี่เป็นความท้าทาย: สร้างคลัสเตอร์ Kubernetes ที่มีประสิทธิภาพสำหรับแอปพลิเคชันของคุณด้วยฐานข้อมูลที่มีสถานะอยู่ภายในคลัสเตอร์ (รวมถึง Sidecar Pod สำหรับการสำรองข้อมูล) ติดตั้ง Jenkins ภายใน คลัสเตอร์ Kubernetes เดียวกันสำหรับไปป์ไลน์ CI / CD และปล่อยให้ Jenkins ใช้พ็อดเป็นทาสสำหรับงานสร้าง ใช้ผู้รับรองเพื่อเพิ่ม / รับใบรับรอง SSL สำหรับทางเข้าของคุณ สร้างระบบตรวจสอบและแจ้งเตือนสำหรับแอปพลิเคชันของคุณโดยใช้ Stackdriver
Kubernetes ดีมากเพราะปรับขนาดได้ง่ายไม่มีการล็อกผู้ขายและเนื่องจากคุณจ่ายเงินสำหรับอินสแตนซ์คุณจึงประหยัดเงิน อย่างไรก็ตามไม่ใช่ทุกคนที่เป็น ผู้เชี่ยวชาญ Kubernetes หรือมีเวลาในการตั้งค่าคลัสเตอร์ใหม่ - สำหรับมุมมองทางเลือกเพื่อน ApeeScapeer Amin Shah Gilani สร้างกรณีนี้เพื่อใช้ Heroku, GitLab CI และระบบอัตโนมัติจำนวนมากที่เขาคิดไว้แล้วเพื่อเขียนโค้ดเพิ่มเติมและทำ งานการดำเนินงานน้อยลงใน วิธีสร้างไปป์ไลน์การปรับใช้เริ่มต้นที่มีประสิทธิภาพ .
ที่เกี่ยวข้อง:Docker เป็นเครื่องมือสำหรับนักพัฒนา / sysadmins / devops คนในการสร้างจัดส่งและรันแอปพลิเคชันแบบกระจายไม่ว่าจะเป็นบนแล็ปท็อป VM ของศูนย์ข้อมูลหรือระบบคลาวด์
Kubernetes เป็นระบบโอเพ่นซอร์สที่ช่วยให้คุณจัดการปริมาณงานและบริการที่มีคอนเทนเนอร์ปรับใช้โดยอัตโนมัติปรับขนาดการปรับใช้สร้างและกำหนดค่าทางเข้าปรับใช้แอปพลิเคชันที่ไม่ระบุสถานะหรือสถานะและอื่น ๆ อีกมากมาย
ใช่และ Docker เขียนด้วย Go เช่นกัน
พ็อดคือกลุ่มของคอนเทนเนอร์ที่ใช้งานร่วมกันบนโฮสต์เดียวกัน หากพ็อดมีคอนเทนเนอร์เดียวโดยทั่วไปคุณสามารถแทนที่คำว่า 'พ็อด' ด้วย 'คอนเทนเนอร์' และเข้าใจแนวคิดได้อย่างถูกต้อง
Application containerization เป็นวิธีการจำลองเสมือนระดับ OS ที่ใช้ในการปรับใช้และเรียกใช้แอปพลิเคชันแบบกระจายโดยไม่ต้องเปิดเครื่องเสมือน (VM) ทั้งหมดสำหรับแต่ละแอป
เมื่อไรจะจ้าง cfo
ใช่. เปิดตัวครั้งแรกเมื่อสี่ปีที่แล้ว ตั้งแต่นั้นเป็นต้นมา Kubernetes กลายเป็นแพลตฟอร์มที่ทรงพลังและมีเสถียรภาพ