EKS - Day 2

Nội dung kiến thức:

  • Ngày 2:

    • Sáng: Tổng quan về Amazon EKS: Điều gì làm EKS khác biệt? Kubernetes được quản lý, lợi ích, trường hợp sử dụng.

    • Chiều: Kiến trúc EKS: Các thành phần của control plane, nhóm node, mạng (VPC, subnet).

    • Bài tập:

      1. Tạo một cluster EKS sử dụng eksctl (công cụ dòng lệnh).

      2. Kết nối với cluster EKS của bạn bằng kubectl.

      3. Triển khai một ứng dụng đơn giản lên cluster EKS của bạn.

Tổng quan về Amazon EKS

  • EKS: Managed k8s service, người dùng không còn cần phải cài đặt, vận hành và maintain K8s control plane.

Các tính năng của EKS

Chi tiết: https://aws.amazon.com/eks/features/

  • Secure networking và authentication: Tích hợp với mạng và security services của AWS, tích hợp với AWS IAM để quản lý authentication cho K8s cluster.

  • Khả năng tương thích và mở rộng cao:

    • Tương thích với các công cụ và ứng dụng chuẩn trong hệ sinh thái Kubernetes.

    • Có thể tích hợp với các giải pháp CI/CD như Jenkins, GitLab, AWS CodePipeline.

    • Dễ dàng mở rộng quy mô theo chiều ngang bằng cách thêm worker nodes.

  • Độ tin cậy và sẵn sàng cao:

    • Control plane được AWS quản lý với độ khả dụng cao trên nhiều Availability Zones.

    • Tự động thay thế các worker nodes bị lỗi bằng tính năng auto-healing.

    • Dễ dàng tạo cluster dự phòng để đảm bảo tính liên tục của dịch vụ.

  • Tích hợp sâu với các dịch vụ của AWS:

    • Tích hợp với IAM để quản lý bảo mật truy cập tới Kubernetes API.

    • Tích hợp với các dịch vụ lưu trữ như EBS, EFS, FSx for Lustre.

    • Kết nối với Virtual Private Cloud (VPC) để đảm bảo an toàn mạng.

    • Tích hợp với các dịch vụ khác như CloudTrail, CloudWatch để giám sát.

  • Tương tác với EKS: Bạn có thể tương tác với EKS cluster bằng eksctl, AWS Console, AWS CLI, API, kubectl, và Terraform.

A basic flow diagram of the steps described previously.

Quy trình làm việc với EKS

  • Tạo cluster - Bắt đầu bằng cách tạo cluster của bạn bằng eksctl, AWS Management Console, AWS CLI hoặc một trong các AWS SDK.

  • Chọn cách tiếp cận tài nguyên tính toán - Quyết định giữa AWS Fargate, Karpenter, các node group được quản lý và các node tự quản lý.

  • Cài đặt - Thiết lập các bộ controllers, drivers, và services cần thiết.

  • Triển khai workload - Điều chỉnh các workload Kubernetes của bạn để tận dụng tốt nhất các tài nguyên và khả năng của loại node mà bạn đã chọn.

  • Quản lý - Giám sát các workload của bạn, tích hợp các dịch vụ AWS để enhance các hoạt động và nâng cao hiệu suất workload. Bạn có thể xem thông tin về các workload của mình bằng AWS Management Console.

Cách tính giá EKS

  • Phí Amazon EKS: 0,10 đô la/giờ/cluster.

  • Có thể chạy nhiều ứng dụng trên một cluster EKS bằng cách sử dụng Kubernetes namespaces và IAM policy.

  • Sử dụng EC2: trả phí cho tài nguyên AWS (EC2 instances, EBS volumes, Outposts capacity) để chạy worker nodes. Chỉ trả cho những gì sử dụng, không có phí tối thiểu, không cần cam kết trước.

  • Amazon EKS extended support (dành cho EKS clusters chạy các version bị outdated):

    • Tối đa 26 tháng từ khi version mới được GA.

    • Phí 0,60 đô la/giờ/cluster (đã bao gồm 0,10 đô la/giờ/cluster tiêu chuẩn).

  • Sử dụng Fargate: tính phí dựa trên tài nguyên vCPU và bộ nhớ sử dụng từ lúc tải container image đến khi pod kết thúc. Tối thiểu 1 phút.

  • EKS trên AWS Outposts:

    • Phí 0,10 đô la/giờ/cluster cho cả triển khai cluster mở rộng và cục bộ.

    • Phí dịch vụ EKS không bao gồm trong giá Outposts.

Xem thêm: https://aws.amazon.com/eks/pricing/

Các use case phổ biến sử dụng EKS

  1. Triển khai các ứng dụng có tính khả dụng cao:

    • Sử dụng Elastic Load Balancing để đảm bảo ứng dụng luôn sẵn sàng trên nhiều Availability Zones.
  2. Xây dựng kiến trúc microservices:

    • Sử dụng các tính năng service discovery của Kubernetes với AWS Cloud Map hoặc Amazon VPC Lattice để xây dựng các resilient systems.
  3. Tự động hóa software release process:

    • Quản lý các pipeline CI/CD để đơn giản hóa quá trình tự động xây dựng, kiểm thử và triển khai ứng dụng.
  4. Chạy các ứng dụng serverless:

    • Sử dụng AWS Fargate với Amazon EKS để chạy ứng dụng serverless.
  5. Thực thi các workload machine learning:

    • Amazon EKS tương thích với các frameworks machine learning phổ biến như TensorFlow, MXNet và PyTorch.

    • Hỗ trợ GPU để xử lý hiệu quả các tác vụ machine learning phức tạp.

  6. Triển khai nhất quán on-premises và trên cloud:

    • Sử dụng Amazon EKS Anywhere để vận hành các cluster Kubernetes.
  7. Chạy các workload xử lý hàng loạt và big data hiệu quả về chi phí:

    • Sử dụng Spot Instances để chạy các workload xử lý hàng loạt và big data như Apache Hadoop và Spark.

    • Tận dụng capacity chưa sử dụng của Amazon EC2 với giá ưu đãi.

  8. Bảo mật ứng dụng và đảm bảo tuân thủ:

    • Tích hợp với các dịch vụ bảo mật của AWS như IAM, Amazon VPC và AWS KMS để đảm bảo quyền riêng tư và bảo vệ dữ liệu theo các tiêu chuẩn ngành.

EKS Architecture

Control plane

  • Amazon EKS đảm bảo mỗi cluster có control plane Kubernetes riêng biệt và độc nhất.

  • Thiết kế này giúp tách biệt cơ sở hạ tầng của mỗi cluster, không có sự trùng lặp giữa các cluster hoặc các tài khoản AWS.

Cài đặt bao gồm:

  1. Distributed components:

    • Control plane đặt ít nhất hai instances API server và ba instances etcd trên ba Availability Zones của AWS trong một Region.
  2. Optimal performance:

    • Amazon EKS chủ động giám sát và điều chỉnh các instances control plane để duy trì hiệu suất cao nhất.
  3. Resilience:

    • Nếu một instance control plane gặp sự cố, Amazon EKS sẽ nhanh chóng thay thế nó, sử dụng Availability Zone khác nếu cần.
  4. Consistent uptime:

    • Chạy các cluster trên nhiều Availability Zones.
  • Amazon EKS sử dụng Amazon Virtual Private Cloud (Amazon VPC) để hạn chế lưu lượng truy cập giữa các thành phần control plane trong một cluster.

  • Các thành phần của cluster không thể xem hoặc nhận thông tin liên lạc từ các cluster khác hoặc tài khoản AWS khác, trừ khi được ủy quyền bởi các chính sách Kubernetes role-based access control (RBAC).

Compute

Ngoài control plane, một cluster Amazon EKS còn có một tập hợp các worker machines được gọi là nodes.

Amazon EKS cung cấp các loại node chính sau:

  1. AWS Fargate:

    • Là một công cụ tính toán serverless cho các container, loại bỏ nhu cầu quản lý các instances bên dưới.

    • Người dùng chỉ cần chỉ định nhu cầu tài nguyên của ứng dụng, AWS sẽ tự động cung cấp, mở rộng và duy trì cơ sở hạ tầng.

    • Phù hợp cho người dùng ưu tiên tính dễ sử dụng và muốn tập trung vào phát triển và triển khai ứng dụng thay vì quản lý cơ sở hạ tầng.

  2. Karpenter:

    • Là một công cụ tự động điều chỉnh quy mô cluster Kubernetes linh hoạt và hiệu suất cao, giúp cải thiện tính khả dụng của ứng dụng và hiệu quả của cluster.

    • Khởi chạy các tài nguyên tính toán có kích thước phù hợp để đáp ứng tải ứng dụng thay đổi.

    • Có thể cung cấp các tài nguyên tính toán đúng lúc, đáp ứng yêu cầu của workload.

  3. Managed node groups:

    • Kết hợp giữa tự động hóa và tùy chỉnh để quản lý một tập hợp các instances Amazon EC2 trong một cluster Amazon EKS.

    • AWS đảm nhiệm các tác vụ như vá lỗi, cập nhật và mở rộng nodes, giúp giảm bớt các khía cạnh vận hành.

    • Hỗ trợ custom kubelet arguments, mở ra khả năng áp dụng các chính sách quản lý CPU và bộ nhớ nâng cao.

    • Tăng cường bảo mật thông qua IAM roles cho service accounts, đồng thời hạn chế nhu cầu cấp quyền riêng biệt cho mỗi cluster.

  4. Self-managed nodes:

    • Cung cấp quyền kiểm soát hoàn toàn đối với các instances Amazon EC2 trong một cluster Amazon EKS.

    • Người dùng chịu trách nhiệm quản lý, mở rộng và duy trì các nodes, có toàn quyền kiểm soát cơ sở hạ tầng bên dưới.

    • Phù hợp cho người dùng cần kiểm soát và tùy chỉnh chi tiết các nodes của mình và sẵn sàng đầu tư thời gian để quản lý và duy trì cơ sở hạ tầng.

K8s concepts

Managing Kubernetes

  1. Phần cứng:

    • Nếu bạn không có phần cứng sẵn sàng để chạy Kubernetes theo yêu cầu của mình, Amazon EKS có thể giúp bạn tiết kiệm chi phí ban đầu.

    • Với Amazon EKS, bạn có thể sử dụng các tài nguyên đám mây AWS cung cấp, bao gồm các instance tính toán (Amazon EC2), Amazon VPC, quản lý danh tính và quyền truy cập tập trung (IAM) và lưu trữ (Amazon EBS).

    • AWS quản lý các máy tính, mạng, trung tâm dữ liệu và tất cả các thành phần vật lý khác cần thiết để chạy Kubernetes.

    • Đối với Amazon EKS Anywhere hoặc các cluster Kubernetes on-premises khác, bạn chịu trách nhiệm quản lý cơ sở hạ tầng được sử dụng trong các triển khai Kubernetes của mình, nhưng bạn vẫn có thể dựa vào AWS để giúp bạn cập nhật Kubernetes.

  2. Quản lý control plane:

    • Amazon EKS quản lý bảo mật và tính khả dụng của control plane Kubernetes do AWS lưu trữ, chịu trách nhiệm lên lịch cho các container, quản lý tính khả dụng của ứng dụng và các tác vụ quan trọng khác.

    • Nếu cluster của bạn bị lỗi, AWS sẽ có phương tiện để khôi phục cluster của bạn về trạng thái hoạt động.

    • Đối với Amazon EKS Anywhere, bạn sẽ tự quản lý control plane.

  3. Cập nhật đã được thử nghiệm:

    • Khi bạn nâng cấp các cluster của mình, bạn có thể tin tưởng vào Amazon EKS hoặc Amazon EKS Anywhere để cung cấp các phiên bản đã được thử nghiệm của bản phân phối Kubernetes.
  4. Add-ons:

    • AWS cung cấp Amazon EKS Add-ons mà bạn có thể sử dụng với các cluster.

    • Amazon EKS Anywhere cung cấp Curated Packages bao gồm các bản dựng của nhiều dự án mã nguồn mở phổ biến, bạn không cần phải tự xây dựng phần mềm hoặc quản lý các bản vá bảo mật, sửa lỗi hoặc nâng cấp quan trọng.

Kubernetes in action

A Kubernetes cluster in action.

EKS phân bổ các tài nguyên cần thiết để tạo cluster, bao gồm:

  • Tạo hai Virtual Private Clouds (Amazon VPCs) mới cho cluster

  • Thiết lập mạng

  • Ánh xạ quyền Kubernetes vào các quyền để quản lý tài sản trên đám mây

  • Đảm bảo các dịch vụ control plane có nơi để chạy

  • Phân bổ instance Amazon EC2 làm các node Kubernetes để chạy các workload

AWS tự quản lý một Amazon VPC cho control plane, trong khi VPC khác chứa các node khách hàng chạy các workload.

Nhiều tác vụ của Kubernetes Admin được thực hiện bằng các công cụ Kubernetes như kubectl.

Một deverloper muốn triển khai workload lên cluster này có thể thực hiện một số tác vụ:

  • Xây dựng ứng dụng thành một hoặc nhiều container image

  • Đẩy các image đó vào một container registry mà cluster Kubernetes có thể truy cập được (ví dụ: Amazon ECR)

  • Tạo các tệp cấu hình định dạng YAML cho cluster biết cách chạy ứng dụng, bao gồm container nào cần kéo từ registry và cách đóng gói các container đó trong Pods

  • Control plane (scheduler) lên lịch cho các container chạy trên một hoặc nhiều node và chạy các container cần thiết

  • Thiết lập application load balancer để cân bằng lưu lượng truy cập đến các container khả dụng chạy trên mỗi node và expose ứng dụng ra public network.

  • Người dùng có thể kết nối với endpoint để truy cập vào ứng dụng

Cluster

  1. Để quản lý cluster Kubernetes, cần nắm rõ:

    • Cách tạo, cải thiện, quản lý và xóa cluster.

    • Các thành phần cấu thành cluster và cách duy trì chúng.

  2. Công cụ quản lý cluster xử lý sự tương tác giữa Kubernetes và nhà cung cấp phần cứng:

    • Tự động hóa thường do nhà cung cấp dịch vụ quản lý Kubernetes thực hiện (như Amazon EKS, Amazon EKS Anywhere).

    • Sử dụng công cụ đặc thù cho từng nhà cung cấp. Đối với EKS, thì bạn sẽ sử dụng AWS CLI, eksctl, hoặc Terraform.

  3. Công cụ tạo và quản lý cluster:

    • Kubernetes cung cấp công cụ tạo cluster thủ công: kind, minikube, kubeadm.

    • Để đơn giản hóa và tự động hóa vòng đời cluster, nên dùng công cụ từ nhà cung cấp uy tín như Amazon EKS, Amazon EKS Anywhere.

  4. Tạo cluster Amazon EKS trên AWS Cloud:

    • Dùng công cụ CLI như eksctl hoặc công cụ khai báo như Terraform.

    • Có thể tạo từ AWS Management Console.

  5. Trách nhiệm của Amazon EKS:

    • Quản lý control plane, đảm bảo tính khả dụng và khả năng mở rộng.

    • Quản lý node: tự động tạo node khi cần bằng Managed Node Groups hoặc Karpenter.

    • Thiết lập mạng cluster.

    • Cung cấp các add-on phổ biến.

  6. Amazon EKS Anywhere:

    • Chạy cluster trên máy tính và mạng on-premises.

    • Dựa trên Amazon EKS Distro, sử dụng Kubernetes Cluster API (CAPI) để quản lý vòng đời máy.

    • Người dùng chịu trách nhiệm quản lý control plane và sao lưu dữ liệu.

  7. Thành phần cluster Kubernetes:

    • Control plane: quản lý cluster, cung cấp API.

    • Worker nodes (Nodes): chạy workload thực tế.

  8. Control plane components:

    • API server: giao tiếp với các thành phần cluster.

    • etcd: lưu trữ dữ liệu về trạng thái cluster.

    • Scheduler: lên lịch cho Pod chạy trên node.

    • Controller Manager: giữ các thành phần ở trạng thái mong muốn.

    • Cloud Controller Manager: tương tác với nhà cung cấp cloud.

  9. Worker node components:

    • kubelet: quản lý từng node.

    • Container runtime: chạy container trên node.

    • kube-proxy: quản lý kết nối mạng giữa các container.

  10. Mở rộng cluster:

    • Thêm các dịch vụ hỗ trợ cluster nhưng không chạy trong control plane.

    • Ví dụ: CoreDNS, công cụ giám sát, lưu trữ, v.v.

Extended clusters

  1. Một số dịch vụ có thể được thêm vào Kubernetes để hỗ trợ cluster, nhưng không chạy trong control plane:

    • Thường chạy trực tiếp trên các node trong namespace kube-system hoặc namespace riêng (thường được thực hiện bởi các nhà cung cấp dịch vụ bên thứ ba).

    • Ví dụ điển hình là dịch vụ CoreDNS, cung cấp dịch vụ DNS cho cluster.

  2. Có nhiều loại add-on khác nhau có thể được thêm vào cluster:

    a. Add-on giám sát (observability) để giữ cho cluster khỏe mạnh:

    • Ghi log, kiểm toán và đo lường (metrics).

    • Giúp xử lý sự cố thông qua giao diện giám sát.

    • Ví dụ: Amazon GuardDuty, CloudWatch, AWS Distro for OpenTelemetry, Amazon VPC CNI plugin for Kubernetes, Grafana Kubernetes Monitoring.

b. Add-on lưu trữ cho Amazon EKS:

  • Amazon Elastic Block Store CSI Driver: thêm thiết bị lưu trữ khối (block storage).

  • Amazon Elastic File System CSI Driver: thêm lưu trữ hệ thống tệp (file system storage).

  • Các add-on lưu trữ của bên thứ ba, như Amazon FSx for NetApp ONTAP CSI driver.

  1. Để xem danh sách đầy đủ hơn về các add-on khả dụng của Amazon EKS, tham khảo tài liệu "Amazon EKS add-ons".

Workloads

  1. Workload trong Kubernetes là "một ứng dụng chạy trên Kubernetes", có thể bao gồm một tập hợp các microservices chạy dưới dạng Containers trong Pods hoặc có thể chạy dưới dạng batch job hoặc các loại ứng dụng khác.

  2. Pod là đơn vị có thể triển khai nhỏ nhất, thường chứa một container duy nhất. Tuy nhiên, nhiều container có thể nằm trong một Pod trong trường hợp các container được liên kết chặt chẽ.

  3. Đặc tả Pod (PodSpec) định nghĩa trạng thái mong muốn của Pod. Bạn có thể triển khai Pod riêng lẻ hoặc nhiều Pod bằng cách sử dụng các tài nguyên workload để quản lý Pod Templates, bao gồm Deployments, StatefulSets và DaemonSets.

  4. Khi xây dựng container, bạn thường bắt đầu với Dockerfile, trong đó xác định base image, phần mềm ứng dụng và các hướng dẫn cấu hình. Các công cụ để xây dựng container image bao gồm docker, podman và nerdctl.

  5. Sau khi xây dựng container image, bạn có thể lưu trữ nó trong một container registry trên máy trạm của mình hoặc trên một container registry công khai như Amazon ECR, Red Hat Quay registry hoặc Docker Hub registry.

  6. Khi định nghĩa một Pod, bạn gán một tập hợp các thuộc tính cho nó, bao gồm tên Pod, container image để chạy và các cấu hình khác như lưu trữ, bí mật (secrets), tài nguyên container, ngân sách gián đoạn (disruption budget) và namespace.

  7. Các phương pháp triển khai Pod phụ thuộc vào loại ứng dụng:

    • Ứng dụng stateless: Sử dụng Deployment và ReplicaSet.

    • Ứng dụng stateful: Sử dụng StatefulSet.

    • Ứng dụng chạy trên mỗi node: Sử dụng DaemonSet.

    • Ứng dụng chạy đến khi hoàn thành: Sử dụng Job hoặc CronJob.

  8. Để làm cho ứng dụng có thể truy cập được từ mạng, Kubernetes sử dụng các đối tượng Service và Ingress:

    • Service: Cho phép các Pod khác trong cluster tìm và giao tiếp với nhau bằng cách sử dụng tên.

    • Ingress: Làm cho ứng dụng được biểu diễn bởi Kubernetes Services có thể truy cập được từ bên ngoài cluster thông qua một load balancer và các quy tắc định tuyến.

Bài tập

Tạo một cluster EKS sử dụng eksctl (công cụ dòng lệnh).

Để tạo một cluster EKS sử dụng eksctl, bạn có thể làm theo các bước sau:

  1. Cài đặt và cấu hình AWS CLI và eksctl:

  2. Tạo một tệp cấu hình cluster (ví dụ: cluster.yaml) với nội dung sau:

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: my-cluster
  region: ap-southeast-1

nodeGroups:
  - name: ng-1
    instanceType: t3.medium
    desiredCapacity: 2
    ssh:
      publicKeyName: yentth-eks

Trong tệp cấu hình này:

  • name: Tên của cluster EKS.

  • region: Khu vực AWS nơi bạn muốn tạo cluster.

  • nodeGroups: Định nghĩa các node group cho cluster.

    • name: Tên của node group.

    • instanceType: Loại instance EC2 sử dụng cho các node.

    • desiredCapacity: Số lượng node mong muốn trong node group.

    • ssh.publicKeyName: Tên của key pair SSH để truy cập vào các node (tùy chọn).

  1. Chạy lệnh sau để tạo cluster EKS:
eksctl create cluster -f cluster.yaml

eksctl sẽ deploy các cloudformation template để tạo một VPC, các subnet, IAM roles, security groups và các tài nguyên cần thiết khác cho cluster EKS. Quá trình này có thể mất vài phút.

  1. Sau khi quá trình tạo cluster hoàn tất, bạn có thể kiểm tra trạng thái của cluster bằng lệnh:
eksctl get cluster --name my-cluster

Output dạng như sau:

$ eksctl get cluster --name my-cluster
NAME            VERSION STATUS  CREATED                 VPC                     SUBNETS                                                                                    SECURITYGROUPS           PROVIDER
my-cluster      1.29    ACTIVE  2024-05-23T07:09:10Z    vpc-0d94680cec9683fb3   subnet-0164ace48fcc31480,subnet-059ede9bc8dc85c5e,subnet-08420cd2018a5879c,subnet-0c11c7689f931aa6f,subnet-0d0c59119bf9ca3aa,subnet-0f2c00529401928b3       sg-02ec3ccee8a55f1b7    EKS
  1. Để truy cập vào cluster, bạn cần cập nhật tệp cấu hình kubeconfig bằng lệnh:
aws eks update-kubeconfig --name my-cluster

Kết nối với cluster EKS của bạn bằng kubectl.

Để kết nối với cluster EKS của bạn bằng kubectl, bạn cần thực hiện các bước sau:

  1. Cài đặt kubectl:

  2. Cấu hình kubectl để kết nối với cluster EKS:

    • Chạy lệnh sau để cập nhật tệp cấu hình kubeconfig với thông tin về cluster EKS của bạn:

        aws eks update-kubeconfig --name my-cluster --region ap-southeast-1
      
    • Lệnh trên sẽ tự động thêm thông tin về cluster EKS vào tệp ~/.kube/config (hoặc tệp kubeconfig tùy chỉnh nếu bạn đã chỉ định).

  3. Kiểm tra kết nối với cluster EKS:

    • Chạy lệnh sau để xác minh rằng kubectl đã được cấu hình chính xác và có thể kết nối với cluster EKS:

        kubectl get nodes
      

      Lệnh này sẽ hiển thị danh sách các node trong cluster EKS của bạn. Nếu lệnh chạy thành công và trả về danh sách các node, điều đó có nghĩa là kubectl đã được cấu hình chính xác và có thể kết nối với cluster.

    • Bạn cũng có thể chạy lệnh sau để xem thông tin chi tiết về cluster:

        kubectl cluster-info
      

      Lệnh này sẽ hiển thị thông tin về máy chủ API của Kubernetes và các dịch vụ khác trong cluster.

Sau khi hoàn tất các bước trên, kubectl đã sẵn sàng để tương tác với cluster EKS của bạn. Bạn có thể sử dụng các lệnh kubectl để triển khai ứng dụng, quản lý tài nguyên, xem logs và thực hiện các tác vụ khác trên cluster.

Triển khai một ứng dụng đơn giản lên cluster EKS của bạn.

Để triển khai một ứng dụng đơn giản lên cluster EKS của bạn, bạn có thể làm theo các bước sau:

  1. Tạo một tệp tin YAML để định nghĩa Deployment và Service cho ứng dụng của bạn. Ví dụ, tạo một tệp tin có tên app.yaml với nội dung sau:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx
        ports:
        - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

Trong ví dụ trên, chúng ta định nghĩa một Deployment với 3 replicas của ứng dụng sử dụng image nginx. Chúng ta cũng định nghĩa một Service kiểu LoadBalancer để expose ứng dụng ra bên ngoài cluster.

  1. Sử dụng kubectl để triển khai ứng dụng lên cluster EKS:
kubectl apply -f app.yaml

Lệnh này sẽ tạo Deployment và Service dựa trên định nghĩa trong tệp tin app.yaml.

  1. Kiểm tra trạng thái của Deployment và Service:
kubectl get deployments
kubectl get services

Output như sau:

$ kubectl get deployments
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-app   3/3     3            3           10s

$ kubectl get services
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP                                                                  PORT(S)        AGE
kubernetes       ClusterIP      10.100.0.1      <none>                                                                       443/TCP        16m
my-app-service   LoadBalancer   10.100.129.75   ab64bdfe633434a3099a136a79464604-26580163.ap-southeast-1.elb.amazonaws.com   80:31421/TCP   11s

Lệnh kubectl get deployments sẽ hiển thị danh sách các Deployment trong cluster, và lệnh kubectl get services sẽ hiển thị danh sách các Service.

  1. Lấy địa chỉ IP của Service để truy cập ứng dụng:
kubectl get service my-app-service -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'

Lệnh này sẽ trả về địa chỉ IP của LoadBalancer được tạo cho Service. Bạn có thể sử dụng địa chỉ IP này để truy cập ứng dụng từ trình duyệt web.

  1. Truy cập ứng dụng từ trình duyệt web:

Mở trình duyệt web và truy cập vào địa chỉ IP của LoadBalancer. Bạn sẽ thấy trang chào mừng mặc định của Nginx.

Tạo thêm 1 số resources mở rộng khác cho app:

  1. ConfigMaps:

    • Tạo một tệp tin config.yaml để định nghĩa ConfigMap:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-app-config
    data:
      APP_COLOR: blue
      APP_MODE: prod
  • Áp dụng ConfigMap vào cluster:
    kubectl apply -f config.yaml
  • Sửa đổi tệp tin app.yaml để sử dụng ConfigMap trong Deployment:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-app
            image: nginx
            ports:
            - containerPort: 80
            env:
            - name: APP_COLOR
              valueFrom:
                configMapKeyRef:
                  name: my-app-config
                  key: APP_COLOR
            - name: APP_MODE
              valueFrom:
                configMapKeyRef:
                  name: my-app-config
                  key: APP_MODE
    ---

    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service
    spec:
      selector:
        app: my-app
      ports:
      - port: 80
        targetPort: 80
      type: LoadBalancer
  • Áp dụng thay đổi cho Deployment:
    kubectl apply -f app.yaml
    [ssm-user@ip-172-31-44-127 ~]$ kubectl apply -f app.yaml
    deployment.apps/my-app configured
    service/my-app-service unchanged

    [ssm-user@ip-172-31-44-127 ~]$ kubectl get configmap
    NAME               DATA   AGE
    kube-root-ca.crt   1      21m
    my-app-config      2      2m33s
  1. Secrets:

    • Tạo một tệp tin secrets.yaml để định nghĩa Secret:
    apiVersion: v1
    kind: Secret
    metadata:
      name: my-app-secret
    type: Opaque
    data:
      USERNAME: dXNlcm5hbWU=
      PASSWORD: cGFzc3dvcmQ=
  • Áp dụng Secret vào cluster:
    kubectl apply -f secrets.yaml
    ssm-user@ip-172-31-44-127 ~]$ nano secrets.yaml
    [ssm-user@ip-172-31-44-127 ~]$ kubectl apply -f secrets.yaml
    secret/my-app-secret created
    [ssm-user@ip-172-31-44-127 ~]$ kubectl get secret
    NAME            TYPE     DATA   AGE
    my-app-secret   Opaque   2      12s
  • Sửa đổi tệp tin app.yaml để sử dụng Secret trong Deployment:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-app
            image: nginx
            ports:
            - containerPort: 80
            env:
            - name: USERNAME
              valueFrom:
                secretKeyRef:
                  name: my-app-secret
                  key: USERNAME
            - name: PASSWORD
              valueFrom:
                secretKeyRef:
                  name: my-app-secret
                  key: PASSWORD
  • Áp dụng thay đổi cho Deployment:
    kubectl apply -f app.yaml
  1. Ingress:

    • Tạo một tệp tin ingress.yaml để định nghĩa Ingress:
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-app-ingress
    spec:
      rules:
      - host: devopslearning.co.uk
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-app-service
                port:
                  number: 80
  • Áp dụng Ingress vào cluster:
    kubectl apply -f ingress.yaml

Sau khi hoàn tất các bước trên, ứng dụng của chúng ta đã được mở rộng với các tài nguyên Kubernetes bổ sung:

  • ConfigMap được sử dụng để cung cấp các cấu hình cho ứng dụng.

  • Secret được sử dụng để lưu trữ thông tin nhạy cảm như tên người dùng và mật khẩu.

  • Ingress được sử dụng để định tuyến lưu lượng truy cập từ bên ngoài vào ứng dụng dựa trên tên miền.

Lưu ý: Để Ingress hoạt động, bạn cần có một Ingress Controller được triển khai trong cluster EKS của mình và cấu hình DNS để trỏ tên miền tùy chỉnh đến Ingress Controller.

Tạo Ingress Controller:

Ở bước này, chúng ta sẽ tạo Nginx Ingress Controller bằng Helm.

Cài đặt Helm:

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
  1. Triển khai Ingress Controller (ví dụ: NGINX Ingress Controller):

    • Cài đặt NGINX Ingress Controller bằng Helm:
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    helm install ingress-nginx ingress-nginx/ingress-nginx

Output dạng như sau:

    [ssm-user@ip-172-31-44-127 ~]$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    "ingress-nginx" has been added to your repositories
    [ssm-user@ip-172-31-44-127 ~]$ helm repo update
    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "ingress-nginx" chart repository
    Update Complete. ⎈Happy Helming!⎈
    [ssm-user@ip-172-31-44-127 ~]$ helm install ingress-nginx ingress-nginx/ingress-nginx
    NAME: ingress-nginx
    LAST DEPLOYED: Thu May 23 07:45:32 2024
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    The ingress-nginx controller has been installed.
    It may take a few minutes for the load balancer IP to be available.
    You can watch the status by running 'kubectl get service --namespace default ingress-nginx-controller --output wide --watch'

    An example Ingress that makes use of the controller:
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: example    namespace: foo
      spec:
        ingressClassName: nginx
        rules:
          - host: www.example.com
            http:
              paths:
                - pathType: Prefix
                  backend:
                    service:
                      name: exampleService
                      port:
                        number: 80
                  path: /
        # This section is only required if TLS is to be enabled for the Ingress
        tls:
          - hosts:
            - www.example.com
            secretName: example-tls

    If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

      apiVersion: v1
      kind: Secret
      metadata:
        name: example-tls
        namespace: foo
      data:
        tls.crt: <base64 encoded cert>
        tls.key: <base64 encoded key>
      type: kubernetes.io/tls
    [ssm-user@ip-172-31-44-127 ~]$
  • Kiểm tra xem Ingress Controller đã được triển khai thành công chưa:
    kubectl get pods -A
  1. Cấu hình DNS:

    • Lấy địa chỉ IP external của Ingress Controller:
    kubectl get service ingress-nginx-controller
    [ssm-user@ip-172-31-44-127 ~]$ kubectl get service ingress-nginx-controller
    NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP                                                                   PORT(S)                      AGE
    ingress-nginx-controller   LoadBalancer   10.100.161.146   a47620b5134354eacaac79f8c228f818-916162401.ap-southeast-1.elb.amazonaws.com   80:32631/TCP,443:31462/TCP   6m11s
    [ssm-user@ip-172-31-44-127 ~]$
  • Sử dụng địa chỉ IP external này để tạo một bản ghi DNS (ví dụ: trong Route 53 của AWS):

    • Đăng nhập vào AWS Management Console và mở dịch vụ Route 53.

    • Chọn Hosted Zone cho tên miền của bạn (ví dụ: devopslearning.co.uk).

    • Tạo một bản ghi Alias mới với tên miền con (ví dụ: myapp.devopslearning.co.uk) và địa chỉ IP external của Ingress Controller.

  1. Cập nhật tệp tin ingress.yaml với tên miền đã cấu hình:

     apiVersion: networking.k8s.io/v1
     kind: Ingress
     metadata:
       name: my-app-ingress
       annotations:
         kubernetes.io/ingress.class: nginx
     spec:
       rules:
       - host: myapp.devopslearning.co.uk
         http:
           paths:
           - path: /
             pathType: Prefix
             backend:
               service:
                 name: my-app-service
                 port:
                   number: 80
    
  2. Áp dụng cập nhật cho Ingress:

     kubectl apply -f ingress.yaml
    

Sau khi hoàn tất các bước trên, Ingress Controller đã được triển khai trong cluster EKS của bạn và DNS đã được cấu hình để trỏ tên miền tùy chỉnh đến Ingress Controller.

Bây giờ, khi bạn truy cập vào tên miền myapp.devopslearning.co.uk, Ingress Controller sẽ định tuyến yêu cầu đến dịch vụ my-app-service và ứng dụng của bạn sẽ được serve.

Dọn dẹp tài nguyên

  1. Xóa Ingress:

     kubectl delete -f ingress.yaml
    
  2. Xóa Deployment, Service, ConfigMap và Secret:

     kubectl delete -f app.yaml
     kubectl delete -f config.yaml
     kubectl delete -f secrets.yaml
    
  3. Xóa Ingress Controller:

     helm uninstall ingress-nginx
    
  4. Xóa cluster EKS:

     eksctl delete cluster --name my-cluster --region ap-southeast-1
    
  5. Xóa các tài nguyên khác (nếu có):

    • Xóa các LoadBalancer tạo bởi Service (nếu còn tồn tại):

        kubectl get services
        kubectl delete service <service-name>
      
  6. Kiểm tra lại trong AWS Management Console:

    • Kiểm tra và xóa các tài nguyên EKS còn tồn tại trong dịch vụ EKS.

    • Kiểm tra và xóa các EC2 instances, Security Groups, Load Balancers và các tài nguyên khác liên quan đến cluster EKS trong các dịch vụ tương ứng của AWS.

Lưu ý: Trước khi xóa các tài nguyên, hãy đảm bảo rằng bạn đã sao lưu các dữ liệu quan trọng và không còn cần thiết sử dụng chúng.

Lưu ý nếu bạn gặp lỗi dạng "1 pods are unevictable from node ip-192-168-49-75.ap-southeast-1.compute.internal" khi xoá eks cluster:

  1. Sử dụng tùy chọn --force với lệnh eksctl delete cluster để buộc xóa cluster bất kể các pods không thể di dời:
eksctl delete cluster --name my-cluster --region ap-southeast-1 --force
  1. Nếu vẫn không được:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=ip-192-168-49-75.ap-southeast-1.compute.internal

Lệnh này sẽ hiển thị tất cả các pods đang chạy trên node có vấn đề.

Và bạn có thể ép xoá các pod đó:

kubectl delete pod <tên pod> -n <tên namespace> --grace-period=0 --force

Sau khi xóa thành công các pods này, hãy thử lại lệnh xóa cluster.

Nếu vẫn không được, có thể xem xét xoá thủ công: Xoá cloudformation templates, sử dụng AWS Management Console hoặc AWS CLI để xóa trực tiếp các tài nguyên liên quan đến cluster, bao gồm các node, VPC, security groups, và IAM roles.