Kubernetes คืออะไร? คู่มือการปรับใช้คอนเทนเนอร์และการปรับใช้
เผยแพร่แล้ว: 2022-03-11ไม่นานมานี้ เราใช้เว็บแอปพลิเคชันแบบเสาหิน: ฐานโค้ดขนาดใหญ่ที่เติบโตขึ้นในฟังก์ชันและคุณสมบัติใหม่ จนกระทั่งกลายเป็นยักษ์ใหญ่ที่เคลื่อนไหวช้า ยากต่อการจัดการ ตอนนี้ นักพัฒนา สถาปนิก และผู้เชี่ยวชาญ 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
คูเบอร์เนเตส? นั่นคืออะไร?
Kubernetes เป็นระบบโอเพ่นซอร์สที่ให้คุณเรียกใช้คอนเทนเนอร์ จัดการ ปรับใช้อัตโนมัติ ปรับขนาดการใช้งาน สร้างและกำหนดค่าขาเข้า ปรับใช้แอปพลิเคชันไร้สถานะหรือเก็บสถานะ และอื่นๆ อีกมากมาย โดยพื้นฐานแล้ว คุณสามารถเปิดใช้อินสแตนซ์อย่างน้อยหนึ่งรายการและติดตั้ง Kubernetes เพื่อใช้งานเป็นคลัสเตอร์ Kubernetes จากนั้นรับปลายทาง API ของคลัสเตอร์ Kubernetes กำหนดค่า kubectl
(เครื่องมือสำหรับจัดการคลัสเตอร์ Kubernetes) และ Kubernetes พร้อมให้บริการ
แล้วทำไมฉันถึงต้องใช้มัน?
ด้วย Kubernetes คุณสามารถใช้ทรัพยากรการคำนวณได้สูงสุด ด้วย Kubernetes คุณจะเป็นกัปตันเรือของคุณ (โครงสร้างพื้นฐาน) โดยมี Kubernetes เติมเต็มใบเรือของคุณ ด้วย Kubernetes บริการของคุณจะเป็น HA และที่สำคัญที่สุด ด้วย Kubernetes คุณจะประหยัดเงินได้มาก
ดูมีความหวัง! ยิ่งถ้าจะประหยัดเงิน! มาว่ากันต่อดีกว่า!
Kubernetes กำลังได้รับความนิยมทุกวัน ให้ลึกลงไปและสำรวจสิ่งที่อยู่ภายใต้ประทุน
ภายใต้ประทุน: Kubernetes คืออะไร?
Kubernetes เป็นชื่อสำหรับทั้งระบบ แต่เช่นเดียวกับรถของคุณ มีชิ้นส่วนเล็กๆ มากมายที่ทำงานร่วมกันอย่างกลมกลืนเพื่อให้ Kubernetes ทำงานได้ มาเรียนรู้กันว่าพวกเขาคืออะไร
Master Node – แผงควบคุมสำหรับคลัสเตอร์ Kubernetes ทั้งหมด ส่วนประกอบของต้นแบบสามารถรันบนโหนดใดก็ได้ในคลัสเตอร์ องค์ประกอบที่สำคัญคือ:
- เซิร์ฟเวอร์ API: จุดเริ่มต้นสำหรับคำสั่ง REST ทั้งหมด ซึ่งเป็นองค์ประกอบเดียวของ Master Node ซึ่งผู้ใช้สามารถเข้าถึงได้
- Datastore: พื้นที่จัดเก็บคีย์-ค่าที่รัดกุม สม่ำเสมอ และพร้อมใช้งานสูงซึ่งใช้โดยคลัสเตอร์ Kubernetes
- ตัว กำหนดเวลา: เฝ้าดูพ็อดที่สร้างขึ้นใหม่และกำหนดให้กับโหนด การปรับใช้พ็อดและบริการบนโหนดเกิดขึ้นเนื่องจากตัวจัดกำหนดการ
- ตัวจัดการตัวควบคุม: เรียกใช้ตัวควบคุมทั้งหมดที่จัดการงานประจำในคลัสเตอร์
- โหนดผู้ปฏิบัติงาน: เอเจนต์โหนดหลัก เรียกอีกอย่างว่าโหนดสมุน พ็อดทำงานที่นี่ โหนดผู้ปฏิบัติงานมีบริการที่จำเป็นทั้งหมดในการจัดการเครือข่ายระหว่างคอนเทนเนอร์ สื่อสารกับโหนดหลัก และกำหนดทรัพยากรให้กับคอนเทนเนอร์ที่กำหนดเวลาไว้
- นักเทียบท่า: ทำงานบนแต่ละโหนดของผู้ปฏิบัติงานและดาวน์โหลดอิมเมจและคอนเทนเนอร์เริ่มต้น
- Kubelet: ตรวจสอบสถานะของพ็อดและทำให้แน่ใจว่าคอนเทนเนอร์ทำงานอยู่ นอกจากนี้ยังสื่อสารกับที่เก็บข้อมูล รับข้อมูลเกี่ยวกับบริการ และเขียนรายละเอียดเกี่ยวกับบริการที่สร้างขึ้นใหม่
- Kube-proxy: พร็ อกซีเครือข่ายและตัวโหลดบาลานซ์สำหรับบริการบนโหนดผู้ปฏิบัติงานเดียว มีหน้าที่กำหนดเส้นทางจราจร
- Kubectl: เครื่องมือ CLI สำหรับผู้ใช้ในการสื่อสารกับเซิร์ฟเวอร์ Kubernetes API
ฝักและบริการคืออะไร?
พ็อด เป็นหน่วยที่เล็กที่สุดของคลัสเตอร์ 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: <%= ENV['DATABASE_NAME'] %> host: 127.0.0.1 username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %>
ในการสร้างแบบจำลองบทความ ผู้ควบคุม มุมมอง และการย้ายข้อมูล ให้ดำเนินการ:
rails g scaffold Article title:string description:text
ในการเพิ่มอัญมณีลงใน Gemfile:
gem 'mysql2', '< 0.6.0', '>= 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 & Services เพื่อเข้าถึง 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
มาสร้างทางเข้าสำหรับแอปพลิเคชันกัน:
- สร้าง IP แบบคงที่:
gcloud compute addresses create sample-ip --global
- สร้างทางเข้า (ไฟล์):
kubectl apply -f ingress.yaml
- ตรวจสอบว่าสร้างทางเข้าแล้วและคว้า IP:
kubectl get ingress -w
- สร้างโดเมน/โดเมนย่อยสำหรับแอปพลิเคชันของคุณ
CI/CD
มาสร้างไปป์ไลน์ CI/CD โดยใช้ CircleCI อันที่จริง มันง่ายที่จะสร้างไปป์ไลน์ CI/CD โดยใช้ CircleCI แต่โปรดจำไว้ว่า กระบวนการปรับใช้อัตโนมัติที่รวดเร็วและสกปรกโดยไม่มีการทดสอบเช่นนี้จะใช้ได้กับโครงการขนาดเล็ก แต่โปรดอย่าทำสิ่งนี้เพื่อร้ายแรงเพราะ หากโค้ดใหม่มีปัญหาในการผลิต คุณจะต้องเสียเงิน นั่นคือเหตุผลที่คุณควรคิดถึงการออกแบบกระบวนการปรับใช้ที่มีประสิทธิภาพ เรียกใช้งาน Canary ก่อนการเปิดตัวเต็มรูปแบบ ตรวจสอบข้อผิดพลาดในบันทึกหลังจาก Canary เริ่มต้นแล้ว และอื่นๆ
ขณะนี้ เรามีโปรเจ็กต์เล็กๆ ที่เรียบง่าย เรามาสร้างกระบวนการปรับใช้ CI/CD แบบอัตโนมัติทั้งหมดที่ไม่มีการทดสอบกัน ขั้นแรก คุณควรผสานรวม CircleCI กับที่เก็บของคุณ คุณสามารถดูคำแนะนำทั้งหมดได้ที่นี่ จากนั้นเราควรสร้างไฟล์กำหนดค่าพร้อมคำแนะนำสำหรับระบบ CircleCI Config ดูเรียบง่าย ประเด็นหลักคือมีสองสาขาใน GitHub repo: master
และ production
- สาขาหลัก มีไว้สำหรับการพัฒนา สำหรับรหัสใหม่ เมื่อมีคนพุชรหัสใหม่ไปที่สาขาหลัก CircleCI จะเริ่มเวิร์กโฟลว์สำหรับสาขาหลัก—สร้างและทดสอบรหัส
- สาขาการผลิต มีไว้สำหรับปรับใช้เวอร์ชันใหม่กับสภาพแวดล้อมการผลิต เวิร์กโฟลว์สำหรับสาขาการผลิตมีดังนี้: พุชโค้ดใหม่ (หรือดีกว่านั้นคือ เปิด PR จากมาสเตอร์แบรนช์ไปยังเวอร์ชันที่ใช้งานจริง) เพื่อทริกเกอร์กระบวนการสร้างและปรับใช้ใหม่ ในระหว่างการสร้าง CircleCI จะสร้างอิมเมจ Docker ใหม่ พุชไปที่ GCR และสร้างการเปิดตัวใหม่สำหรับการปรับใช้ หากการเปิดตัวล้มเหลว CircleCI จะทริกเกอร์กระบวนการย้อนกลับ
ก่อนรันบิลด์ใดๆ คุณควรกำหนดค่าโปรเจ็กต์ใน CircleCI สร้างบัญชีบริการใหม่ใน API และหน้าบริการใน 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 ที่มีประสิทธิภาพสำหรับแอปพลิเคชันของคุณด้วย DB แบบเก็บสถานะที่อยู่ภายในคลัสเตอร์ (รวมถึง sidecar Pod สำหรับการสำรองข้อมูล) ติดตั้ง Jenkins ภายใน คลัสเตอร์ Kubernetes เดียวกันสำหรับไปป์ไลน์ CI/CD และให้ Jenkins ใช้พ็อดเป็นทาสสำหรับบิลด์ ใช้ certmanager เพื่อเพิ่ม/รับใบรับรอง SSL สำหรับขาเข้าของคุณ สร้างระบบตรวจสอบและแจ้งเตือนสำหรับแอปพลิเคชันของคุณโดยใช้ Stackdriver
Kubernetes นั้นยอดเยี่ยมเพราะปรับขนาดได้ง่าย ไม่มีการล็อคอินจากผู้ขาย และเนื่องจากคุณจ่ายเงินสำหรับอินสแตนซ์ คุณประหยัดเงินได้ อย่างไรก็ตาม ไม่ใช่ทุกคนที่เป็นผู้เชี่ยวชาญ Kubernetes หรือมีเวลาตั้งค่าคลัสเตอร์ใหม่—สำหรับมุมมองทางเลือก เพื่อน Toptaler Amin Shah Gilani สร้างกรณีนี้เพื่อใช้ Heroku, GitLab CI และระบบอัตโนมัติจำนวนมากที่เขาค้นพบแล้ว เพื่อที่จะเขียนโค้ดได้มากขึ้นและทำงานดำเนินการน้อยลงใน How to Build an Effective Initial Deployment Pipeline
- ทำคณิตศาสตร์: แอปพลิเคชันไมโครเซอร์วิสที่ปรับขนาดอัตโนมัติด้วยออร์เคสตรา
- K8s/Kubernetes: AWS กับ GCP กับ Azure
- การเปรียบเทียบตาข่ายบริการ Kubernetes