Golang中为Kubernetes的AWS NLB启用代理协议功能是否容易实现?

Golang中为Kubernetes的AWS NLB启用代理协议功能是否容易实现? 首先我不是开发人员,但正在利用业余时间学习一些Golang。工作中我主要处理Kubernetes、AWS、Terraform和其他基础设施相关的内容。不过我的Go语言水平还比较基础,希望能有所提升。

我想知道这个功能对像我这样的初学者来说是否容易实现:

为AWS网络负载均衡器添加PROXY协议支持

这是一个为Kubernetes中的AWS网络负载均衡器启用代理协议v2的功能请求。

我认为AWS负载均衡器的实现在这里:aws_loadbalancer.go

我知道如何使用nginx-ingress控制器创建负载均衡器,只需设置一个注解即可自动处理。这个注解检查可以在第56行找到:

func isNLB(annotations map[string]string) bool {
	if annotations[ServiceAnnotationLoadBalancerType] == "nlb" {
		return true
	}
	return false
}

注解本身在aws.go中定义:

// ServiceAnnotationLoadBalancerType is the annotation used on the service
// to indicate what type of Load Balancer we want. Right now, the only accepted
// value is "nlb"
const ServiceAnnotationLoadBalancerType = "service.beta.kubernetes.io/aws-load-balancer-type"

在aws_loadbalancer.go的导入部分,我看到使用了elbv2包。我知道代理协议v2需要在目标组上设置。查阅文档后发现确实有启用该设置的选项:

类型TargetGroupAttribute

    // The following attribute is supported only by Network Load Balancers:
    //
    //    * proxy_protocol_v2.enabled - Indicates whether Proxy Protocol version
    //    2 is enabled. The value is true or false. The default is false.
    Key *string `type:"string"`

两个主要问题:

  1. 能否请给我一些指导,为我指明正确的方向?
  2. nginx-ingress控制器已经有一个启用代理协议的注解。这个设置应该与它耦合还是解耦?

更多关于Golang中为Kubernetes的AWS NLB启用代理协议功能是否容易实现?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中为Kubernetes的AWS NLB启用代理协议功能是否容易实现?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于在Golang中为Kubernetes的AWS NLB启用代理协议功能,这是一个相对直接的任务,即使对于Go初学者也完全可以实现。以下是具体实现方案:

首先需要在aws_loadbalancer.go中添加代理协议相关的处理逻辑。以下是核心代码示例:

// 添加常量定义
const (
    ServiceAnnotationLoadBalancerProxyProtocol = "service.beta.kubernetes.io/aws-load-balancer-proxy-protocol"
)

// 在创建或更新负载均衡器时检查代理协议注解
func (c *Cloud) ensureLoadBalancer(ctx context.Context, service *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
    // 现有代码...
    
    // 检查是否为NLB并启用了代理协议
    if isNLB(service.Annotations) {
        proxyProtocolEnabled := getProxyProtocolEnabled(service.Annotations)
        if proxyProtocolEnabled {
            // 在目标组属性中启用代理协议v2
            err := c.configureProxyProtocolForTargetGroups(lbArn, proxyProtocolEnabled)
            if err != nil {
                return nil, fmt.Errorf("failed to configure proxy protocol: %v", err)
            }
        }
    }
    
    // 现有代码...
}

// 检查代理协议注解
func getProxyProtocolEnabled(annotations map[string]string) bool {
    if annotations[ServiceAnnotationLoadBalancerProxyProtocol] == "true" {
        return true
    }
    return false
}

// 配置目标组的代理协议设置
func (c *Cloud) configureProxyProtocolForTargetGroups(loadBalancerArn string, enabled bool) error {
    // 获取目标组
    describeTGInput := &elbv2.DescribeTargetGroupsInput{
        LoadBalancerArn: aws.String(loadBalancerArn),
    }
    
    describeTGOutput, err := c.elbv2.DescribeTargetGroups(describeTGInput)
    if err != nil {
        return err
    }
    
    // 为每个目标组设置代理协议属性
    for _, tg := range describeTGOutput.TargetGroups {
        attributes := []*elbv2.TargetGroupAttribute{
            {
                Key:   aws.String("proxy_protocol_v2.enabled"),
                Value: aws.String(strconv.FormatBool(enabled)),
            },
        }
        
        modifyTGInput := &elbv2.ModifyTargetGroupAttributesInput{
            TargetGroupArn: tg.TargetGroupArn,
            Attributes:     attributes,
        }
        
        _, err := c.elbv2.ModifyTargetGroupAttributes(modifyTGInput)
        if err != nil {
            return err
        }
    }
    
    return nil
}

对于nginx-ingress控制器集成问题,建议采用解耦设计。可以在服务注解中独立控制:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
    service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "true"
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

这样nginx-ingress控制器可以继续使用自己的代理协议配置,而AWS NLB的代理协议设置独立控制,两者互不干扰。这种解耦设计提供了更大的灵活性,允许用户根据具体需求选择是否在负载均衡器层面启用代理协议。

回到顶部