1) Look into the case.
Hiện tại mình đang gặp vấn đề như sau:
Bạn có thể thấy hình ảnh là các pod của mình không comsume nhiều ram và cpu.
Nhưng nó có rất nhiều pod trên 1 node.
Nhưng 1 bài viết mình có giải thích thì số pod trên 1 node của eks là có giới hạn.
https://nimtechnology.com/2022/12/25/eks-the-exciting-things-about-eks/#an_example_of_network_interface_IP_address_exhaustion
2) Solution
2.1) decrease the type of EC2 instance
Cách này mình nghĩ là sẽ hiệu quả, dễ làm nhất.
Hiện tại mình đang sử dụng con m5.2xlarge 8CPU/32Gi Ram
Nó có 4 interface and 15 IPs per interface.
giờ mình giảm xuống m5.2xlarge 4 CPU và 16 Gb RAm
Các thông số network thì không đổi
==> Bạn sẽ tạo ra nhiều node hơn và nhiều ip hơn mà giả thì chỉ có rẻ hơn và bằng thôi
2.2) Using Prefix Assigment to have more many IPs than previous
2.2.1) How to understand about Prefix Assigment
Bài này dạo gần đây mới nổi
https://itnext.io/ip-and-pod-allocations-in-eks-5be6612b8325
dưới đây là tóm tắt sự khác biệt
Bạn sẽ hiện đơn giản là thây vị chỉ cập 1 IP trên network ảo thì aws sẽ assign range IP – /28 network ảo.
2.2.2) How to do it.
https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html
Sau khi đọc bài viết trên chúng ta cần làm 2 việc là:
+ Sửa kubelet
+ update env cho aws-node.
2.2.2.1) Adjust kubelet
Đâu tiên chúng ta cần Calculate the number of maximum pods per node
Chúng ta sẽ cần download script:
curl -o max-pods-calculator.sh https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/files/max-pods-calculator.sh
chmod +x max-pods-calculator.sh
Để run script, bạn cần cung cấp instance type và CNI version để tính toán max pod trên 1 node.
./max-pods-calculator.sh \ --instance-type <m5.large> \ --cni-version <1.9.x-eksbuild.y> \ --cni-prefix-delegation-enabled
Về Instance thì bạn chọn các instance trong list EC2 Nitro Amazon Linux 2 Instance Type
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances
cni-version: thì bạn sẽ lấy ở kube-proxy
Ở đây thỉ result của mình là 110 IP trên 1 node.
mình sử dụng terraform thì mình sẽ add trong terraform eks module
Với linux trong self_managed_node_groups
https://github.com/mrnim94/terraform-aws-eks-windows/blob/master/eks.tf#L110-L112
self_managed_node_groups = { linux = { platform = "linux" name = "linux" public_ip = false instance_type = var.lin_instance_type key_name = var.node_host_key_name desired_size = var.lin_desired_size max_size = var.lin_max_size min_size = var.lin_min_size ami_id = data.aws_ami.lin_ami.id ##################### #### BOOTSTRAPING ### ##################### bootstrap_extra_args = chomp( <<-EOT --kubelet-extra-args '--max-pods=${var.max_ips_per_node} --node-labels=apps=true' EOT ) }
Với windows trong self_managed_node_groups
windows = { platform = "windows" name = "windows" public_ip = false instance_type = var.win_instance_type key_name = var.node_host_key_name desired_size = var.win_desired_size max_size = var.win_max_size min_size = var.win_min_size ami_id = data.aws_ami.win_ami.id ##################### #### BOOTSTRAPING ### ##################### bootstrap_extra_args = chomp( <<-EOT -KubeletExtraArgs '--max-pods=${var.max_ips_per_node} --node-labels=apps=true' EOT ) } }
2.2.2.2) Update environments cho aws-node.
Tiếp theo bạn vào aws-node và edit env
https://github.com/mrnim94/terraform-aws-eks-windows/blob/master/eks.tf#L137-L144
cluster_addons = { vpc-cni = { configuration_values = jsonencode({ env = { # Reference docs https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html ENABLE_PREFIX_DELEGATION = "true" WARM_PREFIX_TARGET = "1" } }) } } }
2.2.3) The issues when using Prefix Assignment.
Thoạt đầu bạn có thể nghĩ rằng “Prefix Assigment” là solution hiệu quả thì mình sẽ trình các vần đề gặp phải
Nếu bạn có 1 subnet là 10.0.0.0/24 và như phần trên giới thiệu thì “Prefix Assignment” sẽ chia network của bạn thành các 16 subnet nhỏ với “/26”
Những subnet nay được asign cho các Ec2:
Đây là hỉnh ảnh trên aws web:
Vậy nếu 1 EC2 giữ 1 subnet/28 thì chúng ta maybe chỉa được 16 node trong 1 subnet
==> 1 Ec2 có thể giữ tốt đa 16 pods trong 1 node
==> nếu bạn các pod của bạn chiếm nhiều ram cpu => khiến 1 node chĩ hold được 5 pods.
===> Kiến chúng ta cần 17 nodes trên 1 subnet thì chúng ta ko con IPs to assign for Node
Sẽ thấy trong Network Interface như anh bên dưới
Bạn có thể truy nghĩ thêm nếu apply “Prefix Assignment”
3) What type is adequate for your Eks?
Bạn có thể dùng trang web này để tính toán pod của bạn sài bao nhiều ram/cpu và bạn sẽ sử dụng type node nào: