ไปลองเล่น Kubernetes บน Amazon EKS มา ขอบันทึกไว้หน่อย ใช้งานง่ายดีครับ ด้วยเครื่องมือของทาง Amazon ที่ชื่อว่า eksctl (ใช้งานร่วมกับ kubectl)
วิธีจัดการ Kubernetes บน Amazon EKS
ตัว Amazon EKS (Amazon Elastic Kubernetes Service) มีวิธีการจัดการสองแบบ คือ
- eksctl – ที่เป็น CLI tool ของ Amazon เอง ในการจัดการ Amazon EKS โดยเฉพาะ
- AWS CLI – ที่เป็น CLI tool ของ Amazon ที่ไว้จัดการ Service ต่างๆ ของ Amazon รวมถึง Amazon EKS ด้วย
จากที่ลองทดสอบเล่นทั้งสองแบบ eksctl ใช้งานง่ายกว่ามาก เรียกว่าเป็น Automated Tool สำหรับ shortcut คำสั่งในการจัดการ EKS เลย แต่ก่อนจะไปต่อ เราควรต้องมีความรู้ในสามเรื่องนี้ก่อน เพื่อจะได้ไม่ไป งง กลางทาง
- AWS Service
- Docker
- Kubernetes
เริ่มต้นใช้งาน Amazon EKS
ไม่ว่าจะเลือกวิธีการใดก็ตาม สิ่งที่ต้องทำ มีดังนี้
- ติดตั้ง AWS CLI , สร้าง Access Key ID และ Configure AWS CLI – เพื่อให้เครื่องเราสามารถเชื่อมต่อและควบคุม Account AWS ของเราได้
- ติดตั้ง kubectl – เป็นตัว Core เพื่อใช้ควบคุม Kubernetes Clusters
- ติดตั้ง eksctl – เพื่อไปใช้ร่วมกับ kubectl อีกที ในการควบคุม Kubernetes Clusters บน Amazon EKS
- AWS IAM Permissions – โดย Account AWS เราจะต้องได้รับสิทธิ์ที่เกี่ยวข้องทั้งหมดสำหรับการควบคุม Amazon EKS ทั้งหมด รวมไปถึง ECR, Network, EC2 ด้วยครับ
โครงสร้าง Kubernetes และสิ่งที่จะต้องทำบน EKS
ในรายละเอียด สามารถอ่านจากบล็อกต่างๆ ได้เลยครับ ผมขอสรุปไวๆ ดังนี้
- Kubernetes Cluster – จำเป็นต้องสร้างก่อนเลย เพื่อใช้เป็น Cluster ของชุด Server เช่น ควบคุม (Control) กระจาย (Distribution) ตั้งกำหนดการ (Scheduling)
- Control Plane หรือ Master Node – ตัวนี้ก็จะเป็นต้องมี แต่ EKS จะสร้างให้อัตโนมัติ โดยอิงจาก Config ที่เรากำหนดในไฟล์ yml หรือใน AWS Console เช่น Min/Max Node, Min/Max Pod ใช้เพื่อควบคุมสิ่งต่างๆ ใน Cluster
- Node – ตัวนี้จำเป็นต้องสร้าง เสมือนเครื่อง Server ของเรา สามารถปั๊มเพิ่ม ลด ได้ตามจำนวนที่กำหนด
- Pod – ตัวนี้จำเป็นต้องสร้าง คือกลุ่มของ Container ของเรา
สร้าง Kubernetes Cluster
ให้รันคำสั่งตามนี้ครับ
eksctl create cluster --name=test-php-web --region ap-southeast-1 --managed --nodes=2 --node-type=t2.micro --with-oidc --ssh-access --ssh-public-key ifew_orm_macbook --profile few_orm
คำอธิบาย
- –name=test-php-web คือ ชื่อ Cluster
- –region ap-southeast-1 คือ Zone ทวีป AWS ที่เราจะใช้งาน ในที่นี้คือสิงคโปร์
- –nodes=2 คือ จำนวน node หรือจำนวนเครื่อง ec2 ที่จะถูกเปิดขึ้นมา (Optional)
- –node-type=t2.micro คือ type class ของเครื่อง ec2 ที่จะถูกเปิดขึ้นมา (Optional)
- –managed คือ บอกว่าจะสร้างแบบ Managed nodes ไม่ใช่แบบ Fargate
- –with-oidc คือ เปิดให้ใช้ OIDC ใน cluster นี้ได้ (Optional)
- –ssh-access คือ เปิดให้ใช้ SSH Access ใน cluster นี้ได้ (Optional)
- –ssh-public-key ifew_orm_macbook คือ ระบุ Public Key สำหรับ SSH Access (Optional)
- –profile few_orm คือ บอกว่าใช้ AWS Profile ไหนในการรันคำสั่งนี้ (Optional)
สร้าง Namespace
ในที่นี้ ผมขอเสริมเรื่องการสร้าง namespace นิดนึง ไว้จำกัดขอบเขตการทำงาน และเพื่อความปลอดภัย กันพลาดพลั้งไปลบอะไรออก
kubectl create namespace myweb
- myweb คือ ชื่อของ namespace ที่จะใช้
จะได้หน้าตาแบบนี้
สร้าง YML File สำหรับ Deployment
สร้างไฟล์ yml ขึ้นมา เพื่อ config pod และการ deployment ในที่นี้ผมใช้ไฟล์ชื่อ eks-myweb-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myweb-deployment
namespace: myweb
labels:
app: myweb
spec:
replicas: 2
selector:
matchLabels:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: phpfpm
image: xxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/test:v1
ports:
- containerPort: 80
env:
- name: MYSQL_DB_HOST
value: mydb.host.com
- name: MYSQL_DATABASE
value: test
- name: MYSQL_USER
value: ifew
- name: MYSQL_PASSWORD
value: password1234
- name: MYSQL_ROOT_PASSWORD
value: password1234
- name: TEST
value: test
จากนั้นทำการรันคำสั่ง
kubectl apply -f eks-myweb-deploy.yml
จะได้หน้าตาแบบนี้
ถ้าอยากรู้ว่าสร้างจริงไหม มีอะไรใน namespace เราแล้วบ้าง ให้ใช้คำสั่งนี้ครับ
kubectl get all -n myweb
myweb คือ ระบุชื่อ namespace
จากนั้นจะได้ข้อมูลดังนี้
ใน config ผมสร้างไว้ 2 pod ดังนั้น และถ้าใช้งานได้ ตรง Status จะขึ้นว่า Running
ลองไปดูใน AWS Console โดยเข้าไปที่เมนู EKS > เลือกชื่อ Cluster ที่เราสร้าง > เลือก Node ที่เราสร้าง > Pods จะแสดงรายการสองกลุ่ม คือ กลุ่ม Node Processes กับกลุ่ม Pod ที่เราสร้างขึ้นมา
ตอนนี้แอพเราขึ้นไปรันรอไว้แล้ว แต่ยังไม่มีช่องทางเข้านะครับ เราต้องสร้าง Service ขึ้นมาก่อน
สร้าง YML File สำหรับ Service
สร้างไฟล์ yml ขึ้นมา เพื่อ กำหนด Service และให้มีช่องทางเข้าไป Pod ที่เราสร้าง โดยผมจะสร้างแบบมี Load Balance ด้วย และตั้งไฟล์ชื่อ eks-myweb-service.yml
apiVersion: v1
kind: Service
metadata:
name: myweb-service
namespace: myweb
labels:
app: myweb
spec:
selector:
app: myweb
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer
จากนั้นทำการรันคำสั่ง
kubectl apply -f eks-myweb-service.yml
จะได้หน้าตาแบบนี้
ลองดูสิ่งที่อยู่ใน namespace อีกครั้ง
จะเห็นว่า มี Service เพิ่มเข้ามาแล้ว โดย Type เป็น LoadBalancer ตามที่ได้ config ใน yml ของเรา
ส่วน URL ที่ใช้เข้า App เรา อยู่ตรง External-IP นั้นเอง
ลองเข้า App ที่สร้างขึ้นมา
เปิด Brower และเข้า URL จาก External-IP ที่แสดงในขั้นตอนก่อนหน้านี้ ก็สามารถใช้งานได้แล้วครับ
Tip: ใช้งาน HTTPS ผ่าน ACM Certificate
โดยให้สร้าง ACM certificate ขึ้นมา และใน yml ไฟล์ของ service ให้เพิ่มสองส่วนตามภาพด้านล่าง
โดยรายละเอียดวิธีติดตั้ง ให้ดูได้ที่ https://aws.amazon.com/premiumsupport/knowledge-center/terminate-https-traffic-eks-acm/
สรุป
สำหรับ Kubernetes ผมเองเรียกว่าเบสิกมากๆ เป็นมือใหม่เลย ได้ลองเรียนรู้ใช้งานมาสักพัก เลยอยากสรุปไว้ให้ผู้อ่าน ที่กำลังริเริ่มอยากทดลองใช้ Kubernetes มาได้ใช้ด้วยกันครับ ผ่านบริการของ Amazon EKS ก็หวังว่าจะช่วยให้การเริ่มต้นได้ง่ายขึ้น และเอาไปต่อยอดเพื่อใช้งานระดับ Advance ต่อไป
หากใครอยากได้สรุปคำสั่งต่างๆ รวมถึงโค้ดตัวอย่าง ทั้งหมดในโพสต์นี้
สามารถไปดูได้ที่ https://github.com/ifew/eks-test-php