要为 AWS EKS 管理的 Kubernetes 工作节点分配固定 IP 地址,可以使用 AWS VPC 的 Elastic IP 和 Network Load Balancer(NLB)来实现。下面是一个示例解决方案:
创建一个 Elastic IP 地址:
aws ec2 allocate-address --domain vpc
创建一个 Network Load Balancer(NLB):
aws elbv2 create-load-balancer --name my-nlb --type network --scheme internet-facing --subnets subnet-1a subnet-1b subnet-1c
将 Elastic IP 地址关联到 NLB 的目标组:
aws elbv2 create-target-group --name my-target-group --protocol TCP --port 443 --target-type ip --vpc-id vpc-id
aws elbv2 register-targets --target-group-arn target-group-arn --targets Id=my-ip-address
创建一个 DaemonSet,在每个节点上运行一个 Pod,并分配固定 IP 地址:
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: assign-ip
spec:
selector:
matchLabels:
app: assign-ip
template:
metadata:
labels:
app: assign-ip
spec:
containers:
- name: assign-ip
image: nginx
ports:
- containerPort: 80
lifecycle:
postStart:
exec:
command: ["/bin/bash", "-c", "curl -X PUT -H 'Content-Type: application/json' -H 'Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)' -d '{\"apiVersion\": \"v1\", \"kind\": \"Pod\", \"metadata\": {\"name\": \"$(hostname -i)\", \"annotations\": {\"service.beta.kubernetes.io/aws-load-balancer-nlb-target-type\": \"ip\", \"service.beta.kubernetes.io/aws-load-balancer-nlb-name\": \"my-nlb\", \"service.beta.kubernetes.io/aws-load-balancer-nlb-ports\": \"443\", \"service.beta.kubernetes.io/aws-load-balancer-nlb-ip\": \"\"}}}' https://kubernetes.default.svc/api/v1/namespaces/$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)/pods/$(hostname -i)"]
请确保将
替换为之前创建的 Elastic IP 地址。
应用 DaemonSet:
kubectl apply -f assign-ip.yaml
这样,每个 Kubernetes 工作节点都会在启动后自动分配到固定的 Elastic IP 地址。