如何让EKS中Redis的Service使用VPC子网IP供同VPC内EC2访问?
同VPC下EC2访问EKS集群Redis的无LoadBalancer解决方案
方案1:使用NodePort类型Service
- 操作步骤:
- 修改Redis的Service配置,将
type从ClusterIP改为NodePort,可指定固定nodePort(范围30000-32767),示例yaml片段:apiVersion: v1 kind: Service metadata: name: redis-service spec: type: NodePort ports: - port: 6379 targetPort: 6379 nodePort: 30063 # 可选,不指定会自动分配 selector: app: redis - 更新Service:执行
kubectl apply -f redis-service.yaml,或通过Helm修改values.yaml中service.type为NodePort后运行helm upgrade redis redis/redis -f values.yaml - 配置EKS节点安全组,允许EC2实例所在IP段访问指定的NodePort(如30063)
- EC2实例通过
EKS节点的VPC IP:NodePort连接Redis,示例命令:redis-cli -h 10.111.0.10 -p 30063
- 修改Redis的Service配置,将
方案2:在EC2上通过kubectl port-forward转发端口
- 适合临时访问或小规模场景,无需修改集群资源:
- 在EC2实例上安装kubectl,并配置具备Redis Service访问权限的kubeconfig
- 运行端口转发命令:
kubectl port-forward svc/redis-service 6379:6379 --address 0.0.0.0(--address 0.0.0.0允许同VPC内其他EC2访问,仅本地访问可省略) - 若需长期运行,将命令封装为systemd服务:
- 创建服务文件
/etc/systemd/system/redis-port-forward.service:[Unit] Description=Redis Port Forward to EKS After=network.target [Service] User=ec2-user ExecStart=/usr/local/bin/kubectl port-forward svc/redis-service 6379:6379 --address 0.0.0.0 Restart=always [Install] WantedBy=multi-user.target - 启动并启用服务:
sudo systemctl daemon-reload && sudo systemctl start redis-port-forward && sudo systemctl enable redis-port-forward
- 创建服务文件
- EC2实例直接通过
localhost:6379或EC2的VPC IP:6379连接Redis
方案3:让EC2解析EKS集群内部DNS(访问ClusterIP)
- 利用同VPC优势,让EC2直接解析ClusterIP对应的服务域名:
- 获取EKS集群CoreDNS的ClusterIP:
kubectl get svc coredns -n kube-system -o jsonpath='{.spec.clusterIP}' - 配置EC2实例的DNS解析:
- 临时生效:编辑
/etc/resolv.conf,添加nameserver <CoreDNS ClusterIP>(放在现有nameserver之前) - 永久生效:修改EC2所在VPC的DNS设置,将CoreDNS的ClusterIP加入自定义DNS服务器列表(需确保VPC的
enableDnsSupport和enableDnsHostnames为true)
- 临时生效:编辑
- 配置CoreDNS Pod所在安全组,允许EC2实例所在IP段访问53端口(UDP和TCP)
- EC2实例直接通过Redis Service的集群域名访问:
redis-cli -h redis-service.default.svc.cluster.local -p 6379(default为Redis所在命名空间,需根据实际修改)
- 获取EKS集群CoreDNS的ClusterIP:
方案4:给Redis Pod分配固定VPC IP(适合长期稳定访问)
- 基于AWS VPC CNI特性,为Redis Pod分配固定VPC子网IP,避免Pod重启后IP变更:
- 将Redis的Deployment改为StatefulSet(固定Pod名称如redis-0、redis-1),提升调度稳定性
- 在StatefulSet的Pod模板中添加固定IP注解:
apiVersion: apps/v1 kind: StatefulSet metadata: name: redis spec: serviceName: redis-headless # 需提前创建Headless Service replicas: 1 selector: matchLabels: app: redis template: metadata: annotations: eks.amazonaws.com/fixed-ip: "10.111.0.20" # 指定VPC子网内未被占用的固定IP labels: app: redis spec: containers: - name: redis image: redis:latest ports: - containerPort: 6379 - 提前创建对应的Headless Service:
apiVersion: v1 kind: Service metadata: name: redis-headless spec: clusterIP: None selector: app: redis ports: - port: 6379 targetPort: 6379 - 确保指定的固定IP属于EKS集群使用的VPC子网,且未被其他AWS资源占用
- EC2实例直接通过该固定IP连接Redis:
redis-cli -h 10.111.0.20 -p 6379
内容的提问来源于stack exchange,提问作者prosto.vint
相关产品推荐
相关产品推荐

