ไปลองเล่น 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
![](https://myifew.com/wp-content/uploads/2021/09/k8s-cluster-diagram-1200x891.png)
![](https://myifew.com/wp-content/uploads/2021/09/k8s-node-overview-1200x973.png)
ในรายละเอียด สามารถอ่านจากบล็อกต่างๆ ได้เลยครับ ผมขอสรุปไวๆ ดังนี้
- 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 ที่จะใช้
จะได้หน้าตาแบบนี้
![](https://myifew.com/wp-content/uploads/2021/09/eksctl-create-namespace.png)
สร้าง 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
จะได้หน้าตาแบบนี้
![](https://myifew.com/wp-content/uploads/2021/09/eksctl-apply-deploy-1.png)
ถ้าอยากรู้ว่าสร้างจริงไหม มีอะไรใน namespace เราแล้วบ้าง ให้ใช้คำสั่งนี้ครับ
kubectl get all -n myweb
myweb คือ ระบุชื่อ namespace
จากนั้นจะได้ข้อมูลดังนี้
![](https://myifew.com/wp-content/uploads/2021/09/eksctl-get-all-namespace.png)
ใน config ผมสร้างไว้ 2 pod ดังนั้น และถ้าใช้งานได้ ตรง Status จะขึ้นว่า Running
ลองไปดูใน AWS Console โดยเข้าไปที่เมนู EKS > เลือกชื่อ Cluster ที่เราสร้าง > เลือก Node ที่เราสร้าง > Pods จะแสดงรายการสองกลุ่ม คือ กลุ่ม Node Processes กับกลุ่ม Pod ที่เราสร้างขึ้นมา
![](https://myifew.com/wp-content/uploads/2021/09/eksctl-aws-console-pods.png)
ตอนนี้แอพเราขึ้นไปรันรอไว้แล้ว แต่ยังไม่มีช่องทางเข้านะครับ เราต้องสร้าง 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
จะได้หน้าตาแบบนี้
![](https://myifew.com/wp-content/uploads/2021/09/eksctl-apply-service-1.png)
ลองดูสิ่งที่อยู่ใน namespace อีกครั้ง
![](https://myifew.com/wp-content/uploads/2021/09/eksctl-get-all-namespace-with-service-1200x202.png)
จะเห็นว่า มี Service เพิ่มเข้ามาแล้ว โดย Type เป็น LoadBalancer ตามที่ได้ config ใน yml ของเรา
ส่วน URL ที่ใช้เข้า App เรา อยู่ตรง External-IP นั้นเอง
ลองเข้า App ที่สร้างขึ้นมา
เปิด Brower และเข้า URL จากExternal-IP ที่แสดงในขั้นตอนก่อนหน้านี้ ก็สามารถใช้งานได้แล้วครับ
![](https://myifew.com/wp-content/uploads/2021/09/eks-web-demo-home-1-1200x643.png)
![](https://myifew.com/wp-content/uploads/2021/09/eks-web-demo-phpinfo-1-1200x646.png)
![](https://myifew.com/wp-content/uploads/2021/09/eks-web-demo-env-1-1200x320.png)
Tip: ใช้งาน HTTPS ผ่าน ACM Certificate
โดยให้สร้าง ACM certificate ขึ้นมา และใน yml ไฟล์ของ service ให้เพิ่มสองส่วนตามภาพด้านล่าง
![](https://myifew.com/wp-content/uploads/2021/09/eks-ssl-1200x571.png)
โดยรายละเอียดวิธีติดตั้ง ให้ดูได้ที่ https://aws.amazon.com/premiumsupport/knowledge-center/terminate-https-traffic-eks-acm/
สรุป
สำหรับ Kubernetes ผมเองเรียกว่าเบสิกมากๆ เป็นมือใหม่เลย ได้ลองเรียนรู้ใช้งานมาสักพัก เลยอยากสรุปไว้ให้ผู้อ่าน ที่กำลังริเริ่มอยากทดลองใช้ Kubernetes มาได้ใช้ด้วยกันครับ ผ่านบริการของ Amazon EKS ก็หวังว่าจะช่วยให้การเริ่มต้นได้ง่ายขึ้น และเอาไปต่อยอดเพื่อใช้งานระดับ Advance ต่อไป
หากใครอยากได้สรุปคำสั่งต่างๆ รวมถึงโค้ดตัวอย่าง ทั้งหมดในโพสต์นี้
สามารถไปดูได้ที่ https://github.com/ifew/eks-test-php