0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Triển Khai Lưu Trữ Amazon EFS với EKS Sử Dụng Terraform

Đăng vào 3 ngày trước

• 10 phút đọc

Giới Thiệu

Trong bài viết này, chúng ta sẽ tìm hiểu cách tích hợp Amazon Elastic File System (EFS) với Amazon Elastic Kubernetes Service (EKS) bằng cách sử dụng Terraform để cung cấp hạ tầng và các manifest Kubernetes để triển khai workloads.

Chúng ta sẽ triển khai một container NGINX sử dụng lưu trữ EFS để lưu trữ và phục vụ các tệp tin trên website. Phương pháp này rất phổ biến cho các workloads yêu cầu lưu trữ chia sẻ giữa nhiều pod.

Hiểu Về Amazon EFS Cho Kubernetes

Amazon EFS Là Gì?

Amazon Elastic File System (EFS) là một hệ thống tệp mạng được quản lý hoàn toàn, có khả năng mở rộng và không cần máy chủ, cho phép nhiều EC2 instances, Lambda functions và Kubernetes pods có thể truy cập cùng lúc.

Đối với các workloads trên Kubernetes, EFS cung cấp các persistent volumes có thể được chia sẻ giữa nhiều pod, ngay cả khi nằm ở các Availability Zones (AZs) khác nhau trong một VPC.

Sơ Đồ Kiến Trúc

Kiến trúc tích hợp Amazon EFS với một cluster EKS xoay quanh việc sử dụng các tài nguyên lưu trữ của Kubernetes và các thành phần mạng của AWS. Đầu tiên, một hệ thống tệp EFS được tạo ra với các mount targets trong mỗi Availability Zone của VPC, đảm bảo rằng các worker nodes của EKS ở các zone khác nhau có thể kết nối với lưu trữ này. Driver EFS CSI, được triển khai dưới dạng DaemonSet trong cluster EKS, đóng vai trò như cầu nối giữa Kubernetes và EFS. Để sử dụng lưu trữ này, một StorageClass được định nghĩa, hướng dẫn Kubernetes cách cung cấp PersistentVolumes (PVs) một cách tĩnh (bằng cách chỉ đến một hệ thống tệp/directory hiện có) hoặc động (bằng cách tạo các sub-directories thông qua EFS Access Points). Các ứng dụng sau đó yêu cầu lưu trữ bằng cách sử dụng PersistentVolumeClaims (PVCs), mà sẽ liên kết với PV thích hợp. Khi các pod được triển khai (ví dụ: một container NGINX), driver CSI gắn hệ thống tệp EFS lên worker node thông qua các mount targets, và pod truy cập nó như một đường dẫn thư mục chuẩn. Cấu hình này đảm bảo rằng bất kỳ pod nào trong cluster, bất kể node hay AZ, đều có thể đáng tin cậy kết nối với cùng một lưu trữ EFS để lưu trữ và chia sẻ dữ liệu.

Lợi Ích Chính Khi Sử Dụng EKS

  • Lưu trữ chia sẻ: Nhiều pod có thể đọc và ghi đồng thời.
  • Mở rộng linh hoạt: Tự động tăng và giảm theo nhu cầu.
  • Truy cập đa AZ: Đảm bảo tính khả dụng cao giữa các worker nodes của EKS.
  • Các trường hợp sử dụng: Quản lý nội dung, tổng hợp logs, ứng dụng web, thư mục chính.

Những Điều Cần Lưu Ý Quan Trọng Khi Sử Dụng EKS

  • Phiên bản Kubernetes: Đảm bảo bạn đang sử dụng một phiên bản được hỗ trợ (v1.23+ khuyến nghị).
  • Driver EFS CSI: Phải được cài đặt trong cluster để kích hoạt tích hợp lưu trữ.
  • Pod Identity/IRSA: Cần thiết để cấp quyền IAM chi tiết.
  • Hiệu suất: Phù hợp cho các workloads đa mục đích và nặng throughput, nhưng không lý tưởng cho các cơ sở dữ liệu độ trễ thấp.
  • Quy định: Kích thước hệ thống tệp và các chế độ hiệu suất cần được xem xét khi thiết kế workloads.

Bước 1: Cung Cấp Cluster EKS Bằng Terraform Trong VPC

Bước đầu tiên trong việc tích hợp Amazon EFS với EKS là cung cấp một cluster Kubernetes hoạt động an toàn bên trong một VPC riêng biệt. Chúng ta sẽ sử dụng các module Terraform từ cộng đồng AWS phổ biến cho cả thiết lập VPC và EKS. Vui lòng tham khảo module chính trong repo GitHub.

Bước 2: Tạo Hệ Thống Tệp EFS

Hệ Thống Tệp EFS

Cấu hình EFS mã hóa với chế độ hiệu suất có thể cấu hình

hcl Copy
resource "aws_efs_file_system" "main" {
  creation_token = "${var.cluster_name}-efs"
  encrypted      = true
  performance_mode = var.performance_mode
  throughput_mode  = var.throughput_mode
  tags = {
    Name        = "${var.cluster_name}-efs"
    Environment = var.environment
    Terraform   = "true"
  }
}

Mount Targets EFS

Một cho mỗi subnet riêng để đảm bảo khả năng cao và điểm truy cập EFS

hcl Copy
resource "aws_efs_mount_target" "main" {
  count           = length(var.private_subnet_ids)
  file_system_id  = aws_efs_file_system.main.id
  subnet_id       = var.private_subnet_ids[count.index]
  security_groups = [aws_security_group.efs.id]
}

Điểm Truy Cập EFS Cho Pod

hcl Copy
resource "aws_efs_access_point" "pod_access_point" {
  file_system_id = aws_efs_file_system.main.id
  posix_user {
    gid = var.posix_user_gid
    uid = var.posix_user_uid
  }
  root_directory {
    path = "/app-data"
    creation_info {
      owner_gid   = var.posix_user_gid
      owner_uid   = var.posix_user_uid
      permissions = "755"
    }
  }
  tags = {
    Name        = "${var.cluster_name}-efs-access-point"
    Environment = var.environment
    Terraform   = "true"
  }
}

Nhóm Bảo Mật

Cho phép lưu lượng NFS (cổng 2049) từ các node EKS

hcl Copy
resource "aws_security_group" "efs" {
  name_prefix = "${var.cluster_name}-efs-"
  vpc_id      = var.vpc_id
  ingress {
    description = "NFS từ các node EKS"
    from_port   = 2049
    to_port     = 2049
    protocol    = "tcp"
    cidr_blocks = [var.vpc_cidr]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    Name        = "${var.cluster_name}-efs-sg"
    Environment = var.environment
    Terraform   = "true"
  }
}

Vai Trò IAM

Cho driver EFS CSI với danh tính pod

hcl Copy
resource "aws_iam_role" "efs_csi_driver_role" {
  name = "${var.cluster_name}-efs-csi-driver-role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          Service = "pods.eks.amazonaws.com"
        }
        Action = [
          "sts:AssumeRole",
          "sts:TagSession"
        ]
      }
    ]
  })
  tags = {
    Name        = "${var.cluster_name}-efs-csi-driver-role"
    Environment = var.environment
    Terraform   = "true"
  }
}

Chính Sách Driver EFS CSI

hcl Copy
resource "aws_iam_policy" "efs_csi_driver_policy" {
  name        = "${var.cluster_name}-efs-csi-driver-policy"
  description = "Chính sách cho driver EFS CSI"
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "elasticfilesystem:DescribeAccessPoints",
          "elasticfilesystem:DescribeFileSystems",
          "elasticfilesystem:DescribeMountTargets",
          "ec2:DescribeAvailabilityZones"
        ]
        Resource = "*"
      },
      {
        Effect = "Allow"
        Action = [
          "elasticfilesystem:CreateAccessPoint",
          "elasticfilesystem:TagResource"
        ]
        Resource = "*"
      },
      {
        Effect = "Allow"
        Action = [
          "elasticfilesystem:DeleteAccessPoint"
        ]
        Resource = "*"
        Condition = {
          StringEquals = {
            "elasticfilesystem:AccessedViaMountTarget" = "true"
          }
        }
      }
    ]
  })
  tags = {
    Name        = "${var.cluster_name}-efs-csi-driver-policy"
    Environment = var.environment
    Terraform   = "true"
  }
}

Gắn Chính Sách Driver EFS CSI

hcl Copy
resource "aws_iam_role_policy_attachment" "efs_csi_driver_policy" {
  role       = aws_iam_role.efs_csi_driver_role.name
  policy_arn = aws_iam_policy.efs_csi_driver_policy.arn
}

Liên Kết Danh Tính Pod Cho Driver EFS CSI

hcl Copy
resource "aws_eks_pod_identity_association" "efs_csi_driver" {
  cluster_name    = var.cluster_name
  namespace       = "kube-system"
  service_account = "efs-csi-controller-sa"
  role_arn        = aws_iam_role.efs_csi_driver_role.arn
  tags = {
    Name        = "${var.cluster_name}-efs-csi-pod-identity"
    Environment = var.environment
    Terraform   = "true"
  }
}

Add-on EKS

Driver EFS CSI cho tích hợp Kubernetes

hcl Copy
resource "aws_eks_addon" "efs_csi_driver" {
  cluster_name = module.eks.cluster_name
  addon_name   = "aws-efs-csi-driver"
  depends_on = [module.efs]
  tags = {
    Name        = "${var.cluster_name}-efs-csi-driver"
    Environment = var.environment
    Terraform   = "true"
  }
}

Bước 3: Mô Hình Thực Hiện Lưu Trữ EFS

Cung Cấp Tĩnh

Trong cung cấp tĩnh, PersistentVolume (PV) được tạo thủ công bởi quản trị viên. PV sẽ chỉ định rõ đến một EFS File System ID và thư mục hiện có.

Cách thức hoạt động:

  1. Bạn trước tiên cung cấp một hệ thống tệp EFS và tạo các mount targets trong VPC của bạn.
  2. Sau đó, bạn định nghĩa một tài nguyên PersistentVolume (PV) Kubernetes tham chiếu đến EFS File System ID.
  3. Các ứng dụng yêu cầu lưu trữ thông qua một PersistentVolumeClaim (PVC) liên kết với PV này.
  4. Volume EFS được gắn trực tiếp vào các pod thông qua PVC.

Cung Cấp Động

Trong cung cấp động, Kubernetes tự động tạo ra các PersistentVolumes (PVs) khi cần, dựa trên một StorageClass sử dụng driver EFS CSI. Phương pháp này tận dụng các EFS Access Points, hoạt động như các thư mục con với quyền riêng của chúng bên trong hệ thống tệp.

Cách thức hoạt động:

  1. Định nghĩa một StorageClass chỉ định hệ thống tệp EFS và chế độ cung cấp.
  2. Khi một ứng dụng yêu cầu lưu trữ thông qua một PVC, Kubernetes sẽ tự động tạo:
    • Một PV mới được hỗ trợ bởi một EFS Access Point.
    • Một thư mục dành riêng trong hệ thống tệp EFS.
    • Các pod gắn PV được cung cấp động thông qua PVC.

Các Thực Hành Tốt Nhất

  • Kiểm Tra Phiên Bản: Luôn đảm bảo rằng bạn đang sử dụng phiên bản Kubernetes được hỗ trợ và driver EFS CSI tương thích.
  • Giám Sát Hiệu Suất: Theo dõi hiệu suất của EFS để tối ưu hóa chi phí và hiệu suất.
  • Bảo Mật: Đảm bảo rằng các quy tắc bảo mật được cấu hình chính xác để hạn chế truy cập không mong muốn.

Những Cạm Bẫy Thường Gặp

  • Cấu Hình Sai: Thiết lập sai các quyền IAM sẽ dẫn đến sự cố khi pods không thể truy cập EFS.
  • Quản Lý Tài Nguyên: Quá nhiều PV có thể dẫn đến việc tiêu tốn tài nguyên không cần thiết.

Mẹo Tối Ưu Hiệu Suất

  • Sử Dụng Access Points: Sử dụng EFS Access Points để quản lý quyền truy cập theo cách linh hoạt hơn.
  • Tối Ưu Thư Mục: Tạo cấu trúc thư mục hợp lý trong EFS để dễ dàng quản lý dữ liệu.

Khắc Phục Sự Cố

  • Kiểm Tra Kết Nối: Nếu pods không thể truy cập EFS, kiểm tra các rules bảo mật và trạng thái các mount targets.
  • Xem Lại Logs: Kiểm tra logs của driver EFS CSI để xác định nguyên nhân sự cố.

Kết Luận

Amazon EFS với EKS cung cấp một giải pháp lưu trữ có thể mở rộng, chia sẻ và có tính khả dụng cao cho các workloads trên Kubernetes. Bằng cách sử dụng Terraform, các manifest YAML và driver EFS CSI, bạn có thể tích hợp lưu trữ cloud-native một cách dễ dàng với các workloads của mình.

Hãy thử triển khai ngay hôm nay và khám phá những lợi ích mà EFS có thể mang lại cho ứng dụng của bạn!

Tài Liệu Tham Khảo

  • Repo GitHub của tôi – Triển Khai Đầy Đủ Terraform & YAML
  • Tài Liệu Driver EFS CSI của Amazon
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào