- ทำความเข้าใจบริการ (Services)
1.1 ทำไมต้องบริการ (Services)
1.2 ประเภทของบริการ (Services) - ระบบเครือข่าย (Networking)ใน Kubernetes
2.1 นโยบาย (Policies) เครือข่าย (Network)
2.2 Ingress - การทำแอพใน Kubernetes
Kubernetes ซึ่งเป็นแพลตฟอร์มการจัดการคอนเทนเนอร์แบบโอเพ่นซอร์ส มีชื่อเสียงในด้านความสามารถในการปรับขนาด การปรับใช้อัตโนมัติ และการทำแอพคอนเทนเนอร์ บทความนี้มุ่งเน้นไปที่การทำความเข้าใจองค์ประกอบที่ห้าของเส้นทางการเรียนรู้ บริการ และเครือข่ายของ Kubernetes โดยเน้นที่การทำแอพโดยเฉพาะ
1. ทำความเข้าใจบริการ (Services)
ก่อนที่เราจะทำแอพ มาทำความเข้าใจเกี่ยวกับบริการกันก่อน บริการ Kubernetes เป็นเลเยอร์นามธรรมที่กำหนดชุดตรรกะของพ็อด (Pods) และนโยบายในการเข้าถึง หน้าที่หลักของบริการคือการให้สิทธิ์การเข้าถึงเครือข่ายไปยังชุดของพ็อด (Pods) ไม่ว่าจะภายในคลัสเตอร์หรือจากอินเทอร์เน็ต
1.1 ทำไมต้องบริการ (Services)
เหตุใดเราจึงต้องใช้บริการหากเราสามารถโต้ตอบกับ Pods ได้โดยตรง คำตอบอยู่ในธรรมชาติชั่วคราวของ Pods พวกมันถูกออกแบบมาให้ใช้งานได้ชั่วคราวและใช้แล้วทิ้ง ซึ่งหมายความว่าพวกมันสามารถตายและทำซ้ำได้ทุกเมื่อ ในทางกลับกัน บริการจะมอบจุดสิ้นสุดที่เสถียรซึ่งส่วนอื่นๆ ของระบบหรือผู้ใช้ภายนอกสามารถโต้ตอบด้วยได้
1.2 ประเภทของบริการ (Services)
บริการมีไม่กี่ประเภท:
- ClusterIP : ประเภทบริการเริ่มต้น ให้บริการที่อยู่ IP ภายในที่แอปพลิเคชันอื่นภายในคลัสเตอร์ของคุณสามารถใช้ได้ ไม่ให้การเข้าถึงใด ๆ จากภายนอกคลัสเตอร์
- NodePort : สิ่งนี้เปิดเผยบริการบน IP ของโหนดแต่ละรายการที่พอร์ตแบบคงที่ มันกำหนดเส้นทางไปยังบริการโดยใช้
<NodeIP>:<NodePort>
เป็นวิธีการเปิดเผยบริการภายนอก แม้ว่าพอร์ตจะต้องอยู่ในช่วงที่กำหนด (ค่าเริ่มต้น 30000-32767) - LoadBalancer : สิ่งนี้เปิดเผยบริการภายนอกโดยใช้ตัวจัดสรรภาระงานของผู้ให้บริการคลาวด์ มีคุณสมบัติทั้งหมดของประเภท ClusterIP และ NodePort พร้อมข้อได้เปรียบเพิ่มเติมของการจัดสรรภาระงานแบบเนทีฟของผู้ให้บริการคลาวด์
- ExternalName : สิ่งนี้แมปบริการกับเนื้อหาของฟิลด์ externalName (เช่น foo.bar.example.com) โดยส่งคืนระเบียน CNAME พร้อมค่า
2. ระบบเครือข่าย (Networking) ใน Kubernetes
ระบบเครือข่ายเป็นส่วนสำคัญของ Kubernetes ทุกคลัสเตอร์มีโมเดลเครือข่ายที่รับประกันความสอดคล้องและการสื่อสาร เครือข่าย Kubernetes มีเอกลักษณ์เฉพาะตัวเนื่องจากมีเนมสเปซเครือข่ายแบบเรียบ ซึ่งหมายความว่า Pod ทุกเครื่องจะได้รับที่อยู่ IP และสามารถสื่อสารกับ Pod อื่นๆ ทั้งหมดในคลัสเตอร์ได้ โดยไม่คำนึงว่าโหนดนั้นทำงานบนโหนดใด โมเดลเครือข่ายแบบแบนนี้ช่วยลดความยุ่งยากในการตั้งค่าเครือข่าย เพิ่มความปลอดภัย และอำนวยความสะดวกในการสื่อสาร
2.1 นโยบาย (Policies) เครือข่าย (Network)
นโยบายเครือข่ายใช้ใน Kubernetes เพื่อระบุวิธีที่อนุญาตให้กลุ่มพ็อดสื่อสารระหว่างกันและกับปลายทางเครือข่ายอื่นๆ การไม่มีนโยบายเครือข่ายหมายความว่าพ็อด (Pods) สามารถสื่อสารได้อย่างอิสระ ดังนั้นการกำหนดนโยบายเครือข่ายที่เหมาะสมจึงช่วยในการรักษาความปลอดภัยของเลเยอร์เครือข่าย
2.2 Ingress
Ingress เป็นอีกหนึ่งแนวคิดเครือข่ายที่สำคัญใน Kubernetes โดยจะจัดการการเข้าถึงบริการภายนอกภายในคลัสเตอร์ โดยจัดเตรียมเส้นทาง HTTP และ HTTPS ไปยังบริการต่างๆ จำเป็นต้องมี Ingress Controller เพื่อให้เป็นไปตาม Ingress และสามารถใช้ Ingress Controllers ของบริษัทอื่น เช่น Nginx, HAProxy และ Traefik ได้
3. การทำแอพใน Kubernetes
ตอนนี้เราเข้าใจบริการและเครือข่ายแล้ว เรามาเริ่มทำแอพใน Kubernetes กันเลย เพื่อสาธิตสิ่งนี้ เราจะทำแอพ Node.js แบบธรรมดาและคอนเทนเนอร์โดยใช้ Docker
// A simple Hello World Node.js app
const express = require('express')
const app = express()
const port = 8080
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
Dockerize แอปพลิเคชัน Node.js นี้โดยสร้าง Dockerfile:
// Dockerfile
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
เมื่อเรามีแอปพลิเคชัน Dockerized แล้ว เราก็สามารถสร้างการปรับใช้ใน Kubernetes ได้ อย่างไรก็ตาม ขั้นแรก ตรวจสอบให้แน่ใจว่าคลัสเตอร์ Kubernetes ของคุณเปิดใช้งานอยู่ จากนั้น รันคำสั่งต่อไปนี้เพื่อสร้าง Deployment:
kubectl create deployment node-app --image=<your_dockerhub_username>/node-app
ที่นี่ ‘node-app’ คือชื่อของการปรับใช้ และค่าสถานะ ‘–image’ ชี้ไปที่อิมเมจ Docker ในรีจิสทรี Docker Hub
ตอนนี้ เปิดเผยการปรับใช้นี้เป็นบริการโดยใช้คำสั่งเปิดเผย:
kubectl expose deployment node-app --type=LoadBalancer --port=8080
คำสั่งนี้สร้างบริการใหม่ประเภท LoadBalancer และแสดงแอปของเราบนพอร์ต 8080 หลังจากเรียกใช้คำสั่งนี้ Kubernetes จะกำหนด IP ภายนอกให้กับบริการ ใช้คำสั่ง kubectl get service
เพื่อรับ IP นี้ ตอนนี้ คุณควรจะสามารถเข้าถึงแอปพลิเคชันของคุณในเว็บเบราว์เซอร์ใดก็ได้โดยใช้ IP และพอร์ต 8080 ที่กำหนด
การทำความเข้าใจเกี่ยวกับบริการและเครือข่ายใน Kubernetes เป็นสิ่งสำคัญเนื่องจากช่วยให้การสื่อสารราบรื่นในคลัสเตอร์ Kubernetes ของคุณ เมื่อทำแอพ โปรดจำไว้ว่า Pods เป็นข้อมูลชั่วคราว พวกมันสามารถถูกฆ่าและจำลองได้ทุกเมื่อ ดังนั้นเราจึงใช้บริการเพื่อจัดหาอินเทอร์เฟซเครือข่ายที่เสถียรให้กับพวกมัน ด้วยรูปแบบเครือข่ายแบบแบนของ Kubernetes พ็อด (Pods) ทั้งหมดสามารถสื่อสารกันได้ และการกำหนดนโยบายเครือข่ายที่เหมาะสมจะเพิ่มความปลอดภัยอีกชั้นหนึ่ง
การทำแอพใน Kubernetes ดังที่แสดงไว้ด้านบน เกี่ยวข้องกับการบรรจุแอปพลิเคชัน การปรับใช้ในคลัสเตอร์ Kubernetes และเปิดเผยเป็นบริการ เมื่อเปิดใช้บริการแล้ว จะสามารถเข้าถึงได้จากภายนอกหรือภายในคลัสเตอร์ ขึ้นอยู่กับประเภทของบริการ