EKS - Day 2
Table of contents
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:
Tạo một cluster EKS sử dụng
eksctl
(công cụ dòng lệnh).Kết nối với cluster EKS của bạn bằng
kubectl
.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.
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
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.
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.
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.
Chạy các ứng dụng serverless:
- Sử dụng AWS Fargate với Amazon EKS để chạy ứng dụng serverless.
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.
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.
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.
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:
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.
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.
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.
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:
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.
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.
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.
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
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.
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.
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.
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
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
Để 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.
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.
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.
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.
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.
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.
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ế.
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.
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.
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
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.
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.
- Để 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
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.
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ẽ.
Đặ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.
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.
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.
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.
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.
Để 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:
Cài đặt và cấu hình AWS CLI và
eksctl
:Cài đặt AWS CLI và cấu hình nó với access key và secret access key của tài khoản AWS của bạn.
Cài đặt
eksctl
bằng cách làm theo hướng dẫn tại: https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html
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).
- 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.
- 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
- Để 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:
Cài đặt
kubectl
:- Nếu bạn chưa cài đặt
kubectl
, hãy tải xuống và cài đặt theo hướng dẫn tại: https://kubernetes.io/docs/tasks/tools/install-kubectl/
- Nếu bạn chưa cài đặt
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ệpkubeconfig
tùy chỉnh nếu bạn đã chỉ định).
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:
- 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.
- 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
.
- 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.
- 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.
- 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:
ConfigMaps:
- Tạo một tệp tin
config.yaml
để định nghĩa ConfigMap:
- Tạo một tệp tin
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
Secrets:
- Tạo một tệp tin
secrets.yaml
để định nghĩa Secret:
- Tạo một tệp tin
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
Ingress:
- Tạo một tệp tin
ingress.yaml
để định nghĩa Ingress:
- Tạo một tệp tin
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
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
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.
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
Á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
Xóa Ingress:
kubectl delete -f ingress.yaml
Xóa Deployment, Service, ConfigMap và Secret:
kubectl delete -f app.yaml kubectl delete -f config.yaml kubectl delete -f secrets.yaml
Xóa Ingress Controller:
helm uninstall ingress-nginx
Xóa cluster EKS:
eksctl delete cluster --name my-cluster --region ap-southeast-1
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>
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:
- Sử dụng tùy chọn
--force
với lệnheksctl 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
- 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.