in Technology

ลองทำ Kubernetes บน Amazon EKS แบบง่ายๆ ด้วย eksctl

ไปลองเล่น 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 เลย แต่ก่อนจะไปต่อ เราควรต้องมีความรู้ในสามเรื่องนี้ก่อน เพื่อจะได้ไม่ไป งง กลางทาง

  1. AWS Service
  2. Docker
  3. 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 Diagram
Node Overview

ในรายละเอียด สามารถอ่านจากบล็อกต่างๆ ได้เลยครับ ผมขอสรุปไวๆ ดังนี้

  1. Kubernetes Cluster – จำเป็นต้องสร้างก่อนเลย เพื่อใช้เป็น Cluster ของชุด Server เช่น ควบคุม (Control) กระจาย (Distribution) ตั้งกำหนดการ (Scheduling)
  2. Control Plane หรือ Master Node – ตัวนี้ก็จะเป็นต้องมี แต่ EKS จะสร้างให้อัตโนมัติ โดยอิงจาก Config ที่เรากำหนดในไฟล์ yml หรือใน AWS Console เช่น Min/Max Node, Min/Max Pod ใช้เพื่อควบคุมสิ่งต่างๆ ใน Cluster
  3. Node – ตัวนี้จำเป็นต้องสร้าง เสมือนเครื่อง Server ของเรา สามารถปั๊มเพิ่ม ลด ได้ตามจำนวนที่กำหนด
  4. 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 ที่แสดงในขั้นตอนก่อนหน้านี้ ก็สามารถใช้งานได้แล้วครับ

หน้าแรกของ Demo ที่รันบน nginx + php
ลองดูว่าเรียกใช้ PHP และ Extension ได้ครบถ้วนไหม
ลองดูว่าส่ง Environment Variable มาครบไหม

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

Reference

มาคุยกัน

Comment