EKS Hybrid Nodes 完整指南
📅 撰写日期: 2025-08-20 | 修改日期: 2026-02-14 | ⏱️ 阅读时间: 约 6 分钟
目录
- 概述
- 前提条件
- 网络与 DNS 配置
- Harbor 私有镜像仓库安装
- EKS Hybrid Nodes 配置
- Harbor 与 EKS 集成
- GPU 服务器集成
- 成本分析与优化
- 动态资源分配 (DRA)
- 运维与维护
概述
本指南提供了 Amazon EKS Hybrid Nodes 的完整采用方法。EKS Hybrid Nodes 于 2024 年 12 月正式发布,支持将本地基础设施与 AWS EKS 进行统一管理,允许在单个 Kubernetes 集群内管理高性能 GPU 服务器和云资源。
主要特性:
- 本地与云端统一管理
- Harbor 2.13 私有镜像仓库集成
- H100 GPU 服务器支持
- 动态资源分配 (DRA)
- 灵活的工作负载调度
前提条件
系统要求
本地节点:
- 操作系统:Ubuntu 20.04/22.04/24.04 LTS 或 RHEL 8/9
- Docker Engine 20.10.10+(用于 Harbor)
- 容器运行时:containerd 1.6.x 或更高版本
- 最低硬件要求:2 CPU 核心,4GB RAM
GPU 服务器(可选):
- NVIDIA 驱动 550.x 或更高版本
- NVIDIA Container Toolkit
- H100/H200 GPU 支持
网络要求
| 项目 | 要求 |
|---|---|
| 带宽 | 最低 10Gbps(Direct Connect 或 VPN) |
| 延迟 | 建议 5ms 以下 |
| MTU | 建议 Jumbo Frame (9000) |
网络与 DNS 配置
所需防火墙设置
配置本地与 AWS 之间所需的防火墙端口:
| 协议 | 端口 | 方向 | 用途 |
|---|---|---|---|
| TCP | 443 | 双向 | Kubernetes API 服务器通信 |
| TCP | 10250 | 本地 → AWS | Kubelet API |
| TCP/UDP | 53 | 双向 | DNS 查询 |
| TCP | 6443 | 本地 → AWS | Kubernetes API(备选) |
Pod CIDR 防火墙配置
建议
建议在防火墙中注册整个 Pod CIDR 范围。
配置方法:
-
完整 CIDR 注册(推荐):例如
10.244.0.0/16- 灵活适应动态 Pod IP 分配
- Pod 扩展时无需额外防火墙设置
- 降低管理复杂度
-
仅固定 IP Worker 节点(不推荐):
- 每当 Pod IP 变更时需更新防火墙规则
- 增加运维复杂度
- 增加服务中断风险
Istio + Calico CNI 混合模式
同时使用 Istio 服务网格和 Calico CNI 时的额外端口配置:
| 组件 | 端口 | 用途 |
|---|---|---|
| Envoy Proxy | 15001 | 出站流量 |
| Envoy Proxy | 15006 | 入站流量 |
| Pilot | 15010 | xDS 服务器 |
| Istio Telemetry | 15004 | Mixer 策略 |
| Calico BGP | 179 | BGP 对等 |
| Calico Felix | 9099 | 指标 |
# 防火墙规则示例(AWS Security Group)
aws ec2 authorize-security-group-ingress \
--group-id sg-hybrid-nodes \
--protocol tcp \
--port 15001 \
--source-group sg-eks-cluster
aws ec2 authorize-security-group-ingress \
--group-id sg-hybrid-nodes \
--protocol tcp \
--port 179 \
--source-group sg-hybrid-nodes
DNS 配置
Route 53 Resolver Inbound Endpoint(本地 → AWS)
用途:使本地服务器能够查询 AWS 内部域名
# 创建 Route 53 Resolver Inbound Endpoint
aws route53resolver create-resolver-endpoint \
--creator-request-id unique-id-123 \
--name hybrid-inbound-endpoint \
--security-group-ids sg-resolver-xxxxx \
--direction INBOUND \
--ip-addresses SubnetId=subnet-xxxxx,Ip=10.0.1.100 \
SubnetId=subnet-yyyyy,Ip=10.0.2.100
本地 DNS 配置(示例:BIND):
# /etc/named.conf
zone "eks.amazonaws.com" {
type forward;
forward only;
forwarders { 10.0.1.100; 10.0.2.100; };
};
Route 53 Resolver Outbound Endpoint(AWS → 本地)
用途:使 AWS Worker 节点能够查询本地内部域名
# 创建 Outbound Endpoint
aws route53resolver create-resolver-endpoint \
--creator-request-id unique-id-456 \
--name hybrid-outbound-endpoint \
--security-group-ids sg-resolver-xxxxx \
--direction OUTBOUND \
--ip-addresses SubnetId=subnet-xxxxx \
SubnetId=subnet-yyyyy
# 创建 Resolver 规则
aws route53resolver create-resolver-rule \
--creator-request-id unique-id-789 \
--name on-prem-dns-rule \
--rule-type FORWARD \
--domain-name company.local \
--target-ips Ip=192.168.1.53,Port=53 Ip=192.168.1.54,Port=53 \
--resolver-endpoint-id rslvr-out-xxxxx
双向 DNS 查询验证
# 从本地查询 AWS 域名
dig @10.0.1.100 my-service.eks.amazonaws.com
# 从 AWS 查询本地域名
dig harbor.company.local
CIDR 设计
CIDR 设计原则
AWS VPC CIDR:
- 主要:
10.0.0.0/16(65,536 个 IP) - 辅助(如需要):
10.1.0.0/16
本地 CIDR:
- 现有网络:
192.168.0.0/16 - Pod CIDR:
10.244.0.0/16 - Service CIDR:
10.96.0.0/16
防止地址重叠:
# 检查 CIDR 重叠
aws ec2 describe-vpcs --query 'Vpcs[*].CidrBlock'
# 检查本地路由表
ip route show
路由配置
# 创建 AWS Transit Gateway
aws ec2 create-transit-gateway \
--description "Hybrid connectivity" \
--options AmazonSideAsn=64512,AutoAcceptSharedAttachments=enable
# 创建 VPN 连接
aws ec2 create-vpn-connection \
--type ipsec.1 \
--customer-gateway-id cgw-xxxxx \
--transit-gateway-id tgw-xxxxx \
--options TunnelInsideIpVersion=ipv4,TunnelOptions=[{TunnelInsideCidr=169.254.10.0/30}]
Harbor 私有镜像仓库安装
下载 Harbor 2.13.2
# 下载 Harbor 2.13.2(最新稳定版)
wget https://github.com/goharbor/harbor/releases/download/v2.13.2/harbor-offline-installer-v2.13.2.tgz
# 解压归档文件
tar xvf harbor-offline-installer-v2.13.2.tgz
cd harbor
SSL/TLS 证书配置
生成自签名证书
# 1. 生成 CA 证书
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-key ca.key \
-out ca.crt \
-subj "/C=US/ST=California/L=San Francisco/O=MyOrganization/CN=Harbor-CA"
# 2. 生成服务器证书
openssl genrsa -out harbor.key 4096
openssl req -new -sha512 \
-key harbor.key \
-out harbor.csr \
-subj "/C=US/ST=California/L=San Francisco/O=MyOrganization/CN=harbor.yourdomain.com"
# 3. 创建 v3.ext 文件(SAN 配置)
cat > v3.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.yourdomain.com
DNS.2=yourdomain.com
IP.1=192.168.1.100
EOF
# 4. 签署证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.csr \
-out harbor.crt
# 5. 创建证书目录并复制文件
mkdir -p /data/cert
cp harbor.crt /data/cert/
cp harbor.key /data/cert/
Harbor 配置文件设置
# 复制并编辑 harbor.yml 文件
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
关键配置内容:
# 主机名设置
hostname: harbor.yourdomain.com
# HTTPS 配置
https:
port: 443
certificate: /data/cert/harbor.crt
private_key: /data/cert/harbor.key
# Harbor 管理员密码
harbor_admin_password: Harbor12345!
# 数据库配置
database:
password: root123
max_idle_conns: 100
max_open_conns: 900
conn_max_lifetime: 5m
conn_max_idle_time: 0
# 数据存储路径
data_volume: /data
# 日志配置
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
# Trivy 漏洞扫描器配置
trivy:
ignore_unfixed: false
skip_update: false
offline_scan: false
insecure: false
# 指标配置
metric:
enabled: true
port: 9090
path: /metrics
Harbor 安装
# 运行安装准备脚本
sudo ./prepare
# 安装 Harbor(包含 Trivy)
sudo ./install.sh --with-trivy
# 验证安装
docker-compose ps
创建 Robot 账户
# 通过 Harbor UI 创建或使用 API
curl -X POST "https://harbor.yourdomain.com/api/v2.0/robots" \
-H "Content-Type: application/json" \
-u "admin:Harbor12345!" \
-d '{
"name": "k8s-robot",
"duration": 365,
"description": "Robot account for Kubernetes",
"disable": false,
"level": "system",
"permissions": [
{
"namespace": "*",
"kind": "project",
"access": [
{
"resource": "repository",
"action": "pull"
}
]
}
]
}'
EKS Hybrid Nodes 配置
安装 nodeadm
# x86_64 架构
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/amd64/nodeadm'
# ARM 架构(如需要)
# curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/arm64/nodeadm'
# 授予执行权限
chmod +x nodeadm
sudo mv nodeadm /usr/local/bin/
# 验证版本
nodeadm version
安装所需组件
# 安装 Kubernetes 1.33 支持组件
sudo nodeadm install 1.33 --credential-provider ssm
# 或使用 IAM Roles Anywhere 时
# sudo nodeadm install 1.33 --credential-provider iam-ra
创建 NodeConfig 文件
# nodeconfig.yaml
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
cluster:
name: my-hybrid-cluster
region: ap-northeast-2
# 使用 SSM 的混合节点配置
hybrid:
ssm:
activationCode: "YOUR-ACTIVATION-CODE"
activationId: "YOUR-ACTIVATION-ID"
# Containerd 配置(Harbor 镜像仓库设置)
containerd:
config: |
version = 2
[plugins."io.containerd.grpc.v1.cri"]
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d:/etc/docker/certs.d"
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.yourdomain.com"]
endpoint = ["https://harbor.yourdomain.com"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.yourdomain.com"]
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.yourdomain.com".auth]
username = "robot$k8s-robot"
password = "YOUR-ROBOT-TOKEN"
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.yourdomain.com".tls]
ca_file = "/etc/ssl/certs/harbor-ca.crt"
insecure_skip_verify = false
# Kubelet 配置
kubelet:
config:
shutdownGracePeriod: 30s
maxPods: 110
flags:
- --node-labels=node-type=hybrid,registry=harbor
安装证书
# 将 CA 证书添加到系统信任存储
sudo cp ca.crt /usr/local/share/ca-certificates/harbor-ca.crt
sudo update-ca-certificates
# 为 containerd 创建证书目录
sudo mkdir -p /etc/containerd/certs.d/harbor.yourdomain.com
# 复制证书
sudo cp ca.crt /etc/containerd/certs.d/harbor.yourdomain.com/ca.crt
# 重启 containerd
sudo systemctl restart containerd
节点初始化
# 使用 NodeConfig 初始化节点
sudo nodeadm init --config-source file://nodeconfig.yaml
# 验证节点状态
kubectl get nodes