我想在 Amazon Elastic Kubernetes Service(Amazon EKS)中限制 LoadBalancer 类型服务的 CIDR IP 地址。
简短描述
如果您创建了一个 type:LoadBalancer 服务,那么默认情况下会允许从源 0.0.0.0/0 进行请求。如果您的负载均衡器位于公有子网中,则可以从互联网上的任何位置将请求路由到工件节点。
解决方法
注意:如果您在运行 AWS Command Line Interface(AWS CLI)命令时遇到错误,请确保您使用的是最新版的 AWS CLI。
设置环境
1. 创建 Amazon EKS 集群。
2. 创建并启动工件节点。
3. 设置 kubectl。
4. 设置 AWS CLI。
5. 设置 AWS Load Balancer 控制器。
注意:对于 LoadBalancer 类型的服务,AWS Load Balancer 控制器支持以下版本的 AWS 网络负载均衡器:NLB ip 模式(2.0.0 或更高版本)和 NLB 实例模式(2.2.0 或更高版本)
重要提示:为 LoadBalancer 类型的服务配置新的网络负载均衡器时,最佳实践是使用 AWS Load Balancer 控制器。使用 AWS Load Balancer 控制器而不是 Kubernetes 树内服务负载均衡器控制器。
限制 CIDR IP 地址
1. 在您的服务清单文件(svc.yaml)中,添加 .spec.loadBalancerSourceRanges 字段。例如:
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"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerSourceRanges:
- "143.231.0.0/16"
2. 要应用清单文件,请运行以下命令:
$ kubectl apply -f svc.yaml
3. 要确认安全组上的入站规则已修改,请运行以下 AWS CLI 命令:
$ aws ec2 describe-security-groups --group-ids sg-XXXXXXXXXXXXXXXXX
...
"CidrIp": "143.231.0.0/16"
...
最后,请考虑以下事项:
如果使用 NLB ip 模式,则默认情况下会忽略 .spec.loadBalancerSourceRanges 字段。在这种情况下,请使用以下注释:
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
此注释启用了客户端 IP 保留功能。
对于网络负载均衡器类型的服务,请考虑最高的安全组限制。对于每个节点端口和子网 CIDR 范围,控制器会在工件节点的安全组上创建规则。
相关信息
集群身份验证
Kubernetes 服务