Tác giả: Jeremy Cowan và Jonathan Hurley
Ngày phát hành: 24 FEB 2026
Chuyên mục: Amazon Elastic Kubernetes Service, Containers
EKS hybrid nodes là một tính năng của Amazon Elastic Kubernetes Service (EKS) cho phép bạn sử dụng một control plane được quản lý bởi EKS với các worker node nằm ngoài đám mây AWS. Bắt đầu một Proof of Concept (PoC) nhỏ với các node hybrid có thể là một thách thức vì các node hybrid yêu cầu kết nối mạng giữa mạng từ xa (nơi bạn triển khai các worker node) và Virtual Private Cloud (VPC) của cluster. Ngoài ra, bạn có thể gặp khó khăn trong việc tìm đủ phần cứng vật lý hoặc máy ảo để kiểm tra các node hybrid một cách đầy đủ. Để giải quyết những thách thức này, chúng tôi đã tạo ra dự án node hybrid được container hóa. Dự án này là một proof of concept cho phép bạn nhanh chóng chạy một node hybrid dưới dạng container trên một máy tính xách tay có cấu hình khiêm tốn. Kết nối giữa mạng từ xa, tức là máy tính xách tay của bạn, và VPC của cluster được thiết lập thông qua mạng Tailscale. Hiện tại, hãy coi mạng Tailscale là một mạng lưới ngang hàng được mã hóa. Khi kết nối mạng được thiết lập, bạn có thể chạy một node hybrid được container hóa và bắt đầu lên lịch các workload cho nó. Các Pod được nhắm mục tiêu chạy trên (các) node hybrid sẽ chạy dưới dạng các container lồng nhau, hay còn gọi là Docker in Docker (DnD).
Trong bài đăng blog này, chúng ta sẽ khám phá cách chạy một Docker container kết nối với một EKS cluster dưới dạng một node hybrid.
Điều kiện tiên quyết
Để triển khai giải pháp này, bạn sẽ cần các điều kiện tiên quyết sau:
- Một tài khoản AWS (xem Cách tạo tài khoản AWS)
- Một Amazon EKS Cluster (xem Thiết lập điều kiện tiên quyết cho các node hybrid)
- Một Amazon EC2 Instance (xem Khởi chạy một Amazon EC2 Instance)
- Một host chạy hệ điều hành Linux (ví dụ: Ubuntu)
- Docker Engine cho Linux (xem Tài liệu cài đặt Docker)
Khởi tạo container
Chúng tôi sử dụng KIND làm image cơ sở cho dự án này vì nó được biết là hoạt động với Cilium, là Container Network Interface (CNI) mà “hybrid-pods” sử dụng để giao tiếp với các pod khác cũng như các tài nguyên mạng chạy bên ngoài cluster. Trong quá trình khởi tạo, chúng tôi cài đặt nodeadm, một tiện ích dòng lệnh để cài đặt tất cả các phần mềm cần thiết cho các node hybrid, cùng với một số script chuẩn bị hệ điều hành “host”, tức là host container, cho các node hybrid.
Lưu ý: Dockerfile hiện được cấu hình để kéo binary amd64. Nếu bạn đang chạy trên Apple silicon, hãy thay đổi URL để khớp với kiến trúc hệ thống của bạn, ví dụ: arm64.
Các script entrypoint.sh và hybrid-node-setup.sh
Một số sửa đổi hệ điều hành là cần thiết để các node hybrid hoạt động đúng cách bên trong một container. Tệp entrypoint.sh được sử dụng để chuẩn bị hệ điều hành cho việc chạy các container lồng nhau và Cilium, cụ thể là eBPF. Tệp hybrid-node-setup.sh được sử dụng để hoàn tất việc thiết lập môi trường và chạy một vài lệnh nodeadm. Lệnh đầu tiên trong số này cài đặt tất cả phần mềm cần thiết cho nodeadm, ví dụ: kubelet, containerd, v.v. Lệnh thứ hai cấu hình các thành phần này từ các cài đặt trong tệp NodeConfig.yaml.
Thiết lập kết nối mạng với Tailscale
Các node hybrid yêu cầu kết nối giữa mạng từ xa của bạn (chẳng hạn như máy tính xách tay của bạn) và mạng VPC nơi EKS cluster của bạn cư trú. Trong môi trường doanh nghiệp, điều này thường yêu cầu quyền truy cập vào một đường truyền thuê riêng, kết nối MPLS hoặc VPN. Những thứ này có thể khó có được hoặc cấu hình cho một proof of concept đơn giản. Ngoài ra, có thể có các quy tắc tường lửa xen kẽ cần được tạo/sửa đổi để cho phép các node hybrid giao tiếp với Kubernetes API. Đối với dự án này, chúng tôi dựa vào Tailscale để kết nối mạng với đám mây AWS. So sánh, Tailscale nhẹ và tương đối đơn giản để cấu hình.
Theo mặc định, container node hybrid được cấu hình để sử dụng host networking. Điều này có nghĩa là nó chia sẻ namespace mạng và địa chỉ IP của host của nó. Tailscale agent chạy trên host vật lý dưới dạng một tiến trình daemon.
Nếu bạn cố gắng chạy một node hybrid mà không có host networking, bạn sẽ cần tạo một static route giữa host và mạng container, ví dụ: Docker.
Tailscale agent được cấu hình như một phần của mạng ngang hàng kết nối nó với một Tailscale router chạy trong VPC của cluster như được hiển thị trong sơ đồ dưới đây:

Thiết lập này cung cấp kết nối giữa host/máy tính xách tay và VPC của cluster. Để biết thêm thông tin về cách cấu hình mạng Tailscale cho các node hybrid (xem Đơn giản hóa kết nối mạng bằng Tailscale với Amazon EKS Hybrid Nodes).
Nếu bạn quan tâm đến việc thử giải pháp này, hãy đảm bảo thiết lập kết nối mạng trước, nếu không các pod cần giao tiếp với Kubernetes API, ví dụ: kube-proxy, Cilium, v.v. sẽ không khởi động được. Bạn thường có thể khắc phục điều này bằng cách thêm biến môi trường KUBERNETES_SERVICE_HOST vào pod (và chỉ định URL của endpoint API server làm giá trị của nó), nhưng bạn không cần phải làm vậy nếu liên kết [network] đã được thiết lập ngay từ đầu.
Thiết lập Tailscale VPN
Tailscale cung cấp các dịch vụ VPN để truy cập mạng riêng trong hoặc ngoài đám mây, và có thể giúp đơn giản hóa đáng kể kết nối cho EKS Hybrid Nodes. Chúng tôi sử dụng Tailscale để cho phép Hybrid Nodes kết nối với mạng AWS VPC từ bất kỳ vị trí nào, như được mô tả trong Đơn giản hóa kết nối mạng bằng Tailscale với Amazon EKS Hybrid Nodes. Cụ thể, Tailscale VPN chạy trên một hệ thống cục bộ sẽ hỗ trợ kết nối cho Docker container của chúng ta, container này sẽ chạy kubelet và nhận dạng là Hybrid Node cho EKS.
Bắt đầu bằng cách cài đặt Tailscale VPN trên hệ thống nơi Docker sẽ chạy và trên EC2 instance đang chạy Tailscale:
curl -fsSL https://tailscale.com/install.sh | sh && \sudo tailscale up
Bạn có thể xác nhận rằng Tailscale đang chạy bằng lệnh này:
tailscale status
Bây giờ VPN đang chạy trên cả hai host, nhưng các host không giao tiếp với nhau. Để cấu hình kết nối, hãy truy cập Tailscale và xác nhận rằng mỗi host được liệt kê trong hộp thoại Machines. Sử dụng menu để chỉnh sửa cài đặt định tuyến của máy sẽ chạy Docker:

Trong hộp thoại mở ra, đảm bảo rằng có ít nhất hai tuyến đường được quảng cáo – một tuyến đường cho mạng của chính host và tuyến đường còn lại đại diện cho mạng dịch vụ của EKS cluster:

Để xác minh kết nối, sử dụng tiện ích ping từ Docker host và gửi các gói ICMP đến Elastic Network Interface (ENI) riêng của EC2 instance đang lưu trữ Tailscale. Nếu thiết lập thành công, hãy mong đợi 0% mất gói trong đầu ra lệnh ping.
Lặp lại kiểm tra ngược lại từ Tailscale EC2 host nhắm mục tiêu địa chỉ IP riêng của hệ thống Docker.
Các tuyến đường cũng sẽ cần được thêm vào AWS VPC để EKS cluster biết cách gửi lưu lượng truy cập đến Docker host đến Tailscale EC2 instance – lưu ý rằng các tuyến đường nhắm mục tiêu ENI của EC2 instance:

Cài đặt và cấu hình Cilium CNI
Cilium Container Network Interface (CNI) (xem Mạng đám mây hiệu suất cao) là một trong những CNI được khuyến nghị cho EKS Hybrid Nodes (xem Cấu hình CNI cho các node hybrid). Cilium sẽ chạy trên EKS cluster của chúng ta và khởi chạy Pod trên Hybrid Node chạy trong Docker trên hệ thống từ xa.
Hiện tại, chỉ cần cài đặt Helm chart trên EKS cluster:
helm repo add cilium https://helm.cilium.io && \helm repo update && \helm install cilium cilium/cilium \ --version 1.18.3 \ --namespace kube-system
Bạn có thể kiểm tra trạng thái cài đặt này bằng cách chạy:
helm status cilium -n kube-system
Bạn sẽ thấy đầu ra tương tự như sau:
NAME: ciliumLAST DEPLOYED: Sat Nov 1 13:36:15 2025NAMESPACE: kube-systemSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES: You have successfully installed Cilium with Hubble.Your release version is 1.18.3.For any further help, visit https://docs.cilium.io/en/v1.18/gettinghelp
Hoặc kiểm tra trạng thái của Pod bằng cách chạy:
kubectl get pods -n kube-system -l k8s-app=cilium
Đầu ra dự kiến tương tự như (mong đợi một Pod cho mỗi EKS cluster Node):
NAME READY STATUS RESTARTS AGEcilium-7bzn7 1/1 Running 0 5d6hcilium-mwg26 1/1 Running 0 3d5hcilium-s6q5m 1/1 Running 0 5d6hcilium-sfxxs 1/1 Running 0 5d7hcilium-xrb9l 1/1 Running 0 5d7h
Cấu hình mạng từ xa của EKS
Để có thể kết nối với Hybrid Node để quản lý, EKS control plane cần được cấu hình với CIDR block tương ứng với Node. Vì chúng ta chỉ xây dựng một Hybrid Node, đây có thể là địa chỉ /32 của host/máy tính xách tay.
Ngoài ra, để EKS control plane kết nối với các webhook trong Hybrid Node Pod, chúng ta nên cấu hình cài đặt Remote pod network để khớp với cấu hình Cilium cho mạng pod; theo mặc định, Cilium cấu hình 10.0.0.0/8 theo tài liệu Cilium Cluster Scope.

Thông tin bổ sung về các khái niệm mạng cho EKS Hybrid Nodes có thể được tìm thấy trong tài liệu AWS EKS Hybrid Nodes.
Cấu hình node hybrid được container hóa
Thiết lập Docker
Trước khi khởi động container Hybrid Node trong Docker, hãy đảm bảo cập nhật các giá trị xx trong tệp nodeConfig.yaml sẽ được container sử dụng để xác thực và kết nối với EKS cluster.
nodeConfig.yaml
apiVersion: node.eks.aws/v1alpha1kind: NodeConfigspec: cluster: name: xxxx # Name of the EKS cluster region: xx-xxxx-x # AWS Region where the EKS cluster resides # Use the public EKS API server endpoint # endpoint: https://10EAC79EAF8CB890A26699ACD31D6EA5.gr7.us-west-2.eks.amazonaws.com kubelet: flags: - --fail-swap-on=false - --cloud-provider=external - --node-ip=xxx.xxx.xxx.xxx # Match IP of host - --v=5 config: containerd: config: |
[plugins.”io.containerd.grpc.v1.cri”]
sandbox_image = “registry.k8s.io/pause:3.9”
[plugins.”io.containerd.grpc.v1.cri”.registry]
config_path = “/etc/containerd/certs.d:/etc/docker/certs.d” hybrid: ssm: activationCode: xxxx # SSM hybrid activation code activationId: xxxx # SSM hybrid activation id
Sau khi cập nhật, đã đến lúc xây dựng và khởi chạy container – lệnh dưới đây sẽ vừa khởi chạy container vừa mở một shell vào container đang chạy:
make && \make run
Đằng sau hậu trường, container được khởi chạy với đối số --network host, hướng dẫn Docker chia sẻ giao diện host với container và do đó cho phép container giao tiếp qua Tailscale VPN. Bạn có thể tìm hiểu thêm về mạng Docker trong tài liệu Tổng quan về mạng Docker.
Để gỡ lỗi, hãy kiểm tra tệp nhật ký để biết trạng thái và bất kỳ lỗi nào từ shell của container:
tail -f /var/log/hybrid-node-setup.log
Ứng dụng ví dụ
Với Hybrid Node đã kết nối và hoạt động, chúng ta có thể khởi chạy một ứng dụng Pod đơn giản để xác thực đầy đủ chức năng. Sử dụng manifest này để tạo một Pod:
apiVersion: v1kind: Podmetadata: name: app namespace: defaultspec: nodeSelector: kubernetes.io/hostname: 'mi-0123456789abcdefg' tolerations: - key: "node.cloudprovider.kubernetes.io/uninitialized" value: "true" effect: "NoSchedule" containers: - name: app image: alpine command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
Với định tuyến và CNI phù hợp, việc tương tác với Pod là có thể:
kubectl -n default logs app
Khắc phục sự cố
Như đã đề cập trong phần trước (Thiết lập Docker), bạn có thể khắc phục các sự cố phát sinh bằng cách kiểm tra nhật ký thiết lập node hybrid tại /var/log/hybrid-node-setup.log. Bạn cũng có thể sử dụng journalctl để định kỳ kiểm tra nhật ký cho kubelet và containerd, ví dụ: journalctl -u kubelet. Các vấn đề bạn có thể gặp phải khi cấu hình các node hybrid thường sẽ được tiết lộ trong các nhật ký này.
Các bước khắc phục sự cố bổ sung
- Xác minh rằng kiểm tra source/destination đã bị tắt trên EC2 instance đang chạy tailscale router.
- Xác minh rằng giao tiếp giữa Tailscale router và mạng từ xa của bạn không bị cản trở bởi các security group.
- Xác minh rằng bạn đang truyền các cờ
--advertise-routevà--accept-routeskhi chạy lệnhtailscale up. - Xác minh rằng bạn đã cập nhật bảng định tuyến trong VPC để định tuyến lưu lượng truy cập đến mạng từ xa thông qua ENI của tailscale router.
- Xác minh rằng các Cilium CRD (xem tài liệu Đăng ký CRD của Cilium Operator) đã được đăng ký bởi Cilium operator.
Khi kết nối hoạt động, bạn sẽ có thể ping các node ở hai phía của mạng.
Dọn dẹp
Nếu bạn đã khởi chạy một Amazon EKS cluster và/hoặc kiến trúc EC2 Instance để thử nghiệm các bước được cung cấp, vui lòng xóa các tài nguyên đó nếu thích hợp:
Tóm tắt
Hybrid nodes là một tính năng của EKS cho phép bạn kết nối các worker node chạy bên ngoài đám mây AWS với một EKS cluster. Bài đăng blog này minh họa cách bạn có thể nhanh chóng kiểm tra tính khả thi của các node hybrid bằng cách chạy một node hybrid dưới dạng container trên máy tính xách tay của bạn (sử dụng dự án node hybrid được container hóa) thay vì cố gắng mua một VM hoặc một máy vật lý.
Chúng tôi đã mở mã nguồn dự án này để khuyến khích sự đóng góp của cộng đồng. Các cải tiến tiềm năng bao gồm thêm hỗ trợ Calico CNI, sử dụng IAM Roles Anywhere thay vì SSM agent, hoặc chạy các node hybrid được container hóa dưới dạng pod trong các KIND cluster với HPA autoscaling. Chúng tôi mong muốn được thấy cách chúng ta, cùng với cộng đồng mã nguồn mở rộng lớn hơn, có thể phát triển dự án trong tương lai.
Về tác giả

Jeremy Cowan là Kiến trúc sư Giải pháp Chuyên gia về container tại AWS, mặc dù gia đình anh nghĩ anh bán “không gian đám mây”. Trước khi gia nhập AWS, Jeremy đã làm việc cho một số nhà cung cấp phần mềm lớn, bao gồm VMware, Microsoft và IBM. Khi không làm việc, bạn thường có thể tìm thấy anh ấy trên một con đường mòn trong vùng hoang dã, cách xa công nghệ.

Jonathan Hurley là Quản lý Tài khoản Kỹ thuật cấp cao hỗ trợ khách hàng trong nhiều ngành khác nhau thuộc phân khúc Doanh nghiệp vừa và nhỏ của AWS. Ngoài các trách nhiệm thông thường, Jonathan còn thích hỗ trợ khách hàng thông qua chuyên môn của mình về cả giải pháp container và các công cụ HashiCorp.