我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中限制 LoadBalancer 类型的 Kubernetes 服务的 CIDR IP 地址。
解决方法
如果您创建的是 LoadBalancer 类型的服务,其安全组默认允许来自 0.0.0.0/0 的请求。如果您的负载均衡器位于公有子网中,则它会将来自互联网任意位置的请求路由到 Worker 节点。要限制非 0.0.0.0/0 的源,请使用 loadBalancerSourceRanges。
注意: 如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新版本的 AWS CLI。
设置您的环境
要设置您的环境,请完成以下步骤:
- 创建 Amazon EKS 集群。
- 创建并启动 Worker 节点。
- 设置 kubectl。
- 设置 AWS CLI。
- 设置 AWS 负载均衡器控制器。
注意: 对于 LoadBalancer 类型的服务,AWS 负载均衡器控制器从版本 2.2.0 开始支持实例模式下的网络负载均衡器使用 loadBalancerSourceRanges。对于网络负载均衡器 IP 模式,则需要版本 2.0.0 或更高版本。您必须启用客户端 IP 保留功能。
重要事项: 要为 LoadBalancer 类型的服务分配新的网络负载均衡器,最佳做法是使用 AWS 负载均衡器控制器而非 Kubernetes Service 负载均衡器控制器。有关 AWS 负载均衡器控制器的最新版本,请参阅 GitHub 网站上的 aws-load-balancer-controller。
限制 CIDR IP 地址
要指定 loadBalancerSourceRanges,请添加 loadBalancerSourceRanges 字段或使用注释。
(推荐)添加 loadBalancerSourceRanges 字段
完成以下步骤:
-
在 svc.yaml 文件中,将 .spec.loadBalancerSourceRanges 字段添加到 spec 部分:
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance" # or "ip"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
# For NLB IP mode only - required for loadBalancerSourceRanges to work:
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerSourceRanges:
- "[IP_ADDRESS]"
-
要应用 svc.yaml 文件,请运行以下命令:
kubectl apply -f svc.yaml
-
要确认源 IP 限制已应用,请运行以下命令:
kubectl logs -f YOUR_ALB_CONTROLLER_POD -n YOUR_NAMESPACE
注意: 将 YOUR_ALB_CONTROLLER_POD 替换为您的容器组 (pod) 名称,将 YOUR_NAMESPACE 替换为您的命名空间。
-
要确认安全组的入站规则已修改,请运行以下命令:
aws ec2 describe-security-groups --group-ids YOUR_SECURITY_GROUP_ID
注意: 将 YOUR_SECURITY_GROUP_ID 替换为您的安全组 ID 的名称。AWS 负载均衡器控制器会将配置的负载均衡器源范围添加到安全组的入站规则中。
输出示例:
"CidrIp": "YOUR_CIDR_BLOCK"
如果在 IP 模式下使用网络负载均衡器,则默认情况下会忽略 .spec.loadBalancerSourceRanges 字段。要使用源范围限制,请使用以下注释开启客户端 IP 保留:
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
注意: 对于网络负载均衡器类型的服务,您可以增加最大安全组配额。对于各节点端口和子网 CIDR 范围,控制器会在 Worker 节点的安全组上创建规则。有关更多信息,请参阅 Kubernetes 网站上的 Ingress traffic(入口流量)。
(替代方法)使用注释
您也可以在服务清单文件 svc.yaml 中使用注释。
注释示例:
service.beta.kubernetes.io/load-balancer-source-ranges: YOUR_IP_ADDRESS
有关更多信息,请参阅 Kubernetes 网站上的 Access control(访问控制)。
相关信息
了解 Amazon EKS 中的访问控制工作原理