You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让EKS中Redis的Service使用VPC子网IP供同VPC内EC2访问?

同VPC下EC2访问EKS集群Redis的无LoadBalancer解决方案

方案1:使用NodePort类型Service

  • 操作步骤:
    1. 修改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
      
    2. 更新Service:执行kubectl apply -f redis-service.yaml,或通过Helm修改values.yaml中service.type为NodePort后运行helm upgrade redis redis/redis -f values.yaml
    3. 配置EKS节点安全组,允许EC2实例所在IP段访问指定的NodePort(如30063)
    4. EC2实例通过EKS节点的VPC IP:NodePort连接Redis,示例命令:redis-cli -h 10.111.0.10 -p 30063

方案2:在EC2上通过kubectl port-forward转发端口

  • 适合临时访问或小规模场景,无需修改集群资源:
    1. 在EC2实例上安装kubectl,并配置具备Redis Service访问权限的kubeconfig
    2. 运行端口转发命令:kubectl port-forward svc/redis-service 6379:6379 --address 0.0.0.0(--address 0.0.0.0允许同VPC内其他EC2访问,仅本地访问可省略)
    3. 若需长期运行,将命令封装为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
    4. EC2实例直接通过localhost:6379或EC2的VPC IP:6379连接Redis

方案3:让EC2解析EKS集群内部DNS(访问ClusterIP)

  • 利用同VPC优势,让EC2直接解析ClusterIP对应的服务域名:
    1. 获取EKS集群CoreDNS的ClusterIP:kubectl get svc coredns -n kube-system -o jsonpath='{.spec.clusterIP}'
    2. 配置EC2实例的DNS解析:
      • 临时生效:编辑/etc/resolv.conf,添加nameserver <CoreDNS ClusterIP>(放在现有nameserver之前)
      • 永久生效:修改EC2所在VPC的DNS设置,将CoreDNS的ClusterIP加入自定义DNS服务器列表(需确保VPC的enableDnsSupport和enableDnsHostnames为true)
    3. 配置CoreDNS Pod所在安全组,允许EC2实例所在IP段访问53端口(UDP和TCP)
    4. EC2实例直接通过Redis Service的集群域名访问:redis-cli -h redis-service.default.svc.cluster.local -p 6379(default为Redis所在命名空间,需根据实际修改)

方案4:给Redis Pod分配固定VPC IP(适合长期稳定访问)

  • 基于AWS VPC CNI特性,为Redis Pod分配固定VPC子网IP,避免Pod重启后IP变更:
    1. 将Redis的Deployment改为StatefulSet(固定Pod名称如redis-0、redis-1),提升调度稳定性
    2. 在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
      
    3. 提前创建对应的Headless Service:
      apiVersion: v1
      kind: Service
      metadata:
        name: redis-headless
      spec:
        clusterIP: None
        selector:
          app: redis
        ports:
        - port: 6379
          targetPort: 6379
      
    4. 确保指定的固定IP属于EKS集群使用的VPC子网,且未被其他AWS资源占用
    5. EC2实例直接通过该固定IP连接Redis:redis-cli -h 10.111.0.20 -p 6379

内容的提问来源于stack exchange,提问作者prosto.vint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:15:06