15

正如标题所说,我正在寻找一种方法来强制 LoadBalancer 服务使用 AWS 中的预定义安全组。我不想手动编辑 Kubernetes 为 ELB 创建的安全组的入站/出站规则。我无法在文档中找到任何内容,也没有找到任何可以在线其他地方工作的内容。这是我当前的模板:

apiVersion: v1
kind: Service
metadata:
  name: ds-proxy
spec:
  type: LoadBalancer
  ports:
  - port: 8761 # the port that this service should serve on
    targetPort: 8761
    protocol: TCP
  selector:
    app: discovery-service
4

5 回答 5

24

编辑:2021 - 我被告知我的答案现在已过时,请参阅 stackoverflow.com/a/70162565/699493。

您无法阻止 Kubernetes 创建新的安全组。但是自从提交了 Andonaeus 的答案后,添加了一个新功能,允许通过您的服务的配置文件明确定义入站权限。

有关详细信息,请参阅用户指南详细信息。那里提供的示例表明,通过使用spec.loadBalancerSourceRanges您可以提供允许入站 IP:

在以下示例中,将创建一个负载均衡器,该负载均衡器仅可供 IP 地址为 130.211.204.1 和 130.211.204.2 的客户端访问。

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  ports:
    - port: 8765
      targetPort: 9376
  selector:
    app: example
  type: LoadBalancer
  loadBalancerSourceRanges:
  - 130.211.204.1/32
  - 130.211.204.2/32
于 2016-10-27T18:15:05.117 回答
3

我意识到这篇文章现在已经有几年了,但它是在谷歌搜索中出现的。看起来现在可以使用 k8s 1.7+ 来防止 kubernetes 创建安全组。有关更多信息,请参阅https://github.com/kubernetes/kops/blob/release-1.9/docs/cluster_spec.md#cloudconfig

于 2018-07-19T21:31:14.710 回答
3

您不能限制 Kubernetes 创建新的安全组,但您可以使用文档中提到的注释指定现有的安全组:

service.beta.kubernetes.io/aws-load-balancer-extra-security-groups: "sg-53fae93f,sg-42efd82e" -> 要添加到 ELB 的其他安全组列表

于 2018-03-15T13:50:40.127 回答
2

看起来这目前是不可能的。通过 api 中的以下代码https://github.com/kubernetes/kubernetes/blob/37b5726716231c13117c4b05a841e00417b92cda/pkg/cloudprovider/providers/aws/aws.go

func (s *AWSCloud) EnsureLoadBalancer(name, region string, publicIP net.IP, ports []*api.ServicePort, hosts []string, affinity api.ServiceAffinity) (*api.LoadBalancerStatus, error) {
glog.V(2).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v)", name, region,    publicIP, ports, hosts)

.
.
.

// Create a security group for the load balancer
var securityGroupID string
{
    sgName := "k8s-elb-" + name
    sgDescription := "Security group for Kubernetes ELB " + name
    securityGroupID, err = s.ensureSecurityGroup(sgName, sgDescription, vpcId)
    if err != nil {
        glog.Error("Error creating load balancer security group: ", err)
        return nil, err
    }

    permissions := []*ec2.IpPermission{}
    for _, port := range ports {
        portInt64 := int64(port.Port)
        protocol := strings.ToLower(string(port.Protocol))
        sourceIp := "0.0.0.0/0"

        permission := &ec2.IpPermission{}
        permission.FromPort = &portInt64
        permission.ToPort = &portInt64
        permission.IpRanges = []*ec2.IpRange{{CidrIp: &sourceIp}}
        permission.IpProtocol = &protocol

        permissions = append(permissions, permission)
    }
    _, err = s.ensureSecurityGroupIngress(securityGroupID, permissions)
    if err != nil {
        return nil, err
    }
}
securityGroupIDs := []string{securityGroupID}

.
.
.

}

没有办法阻止它创建安全组。

于 2016-01-15T17:52:32.517 回答
0

现在这是可能的,并且已经有一段时间了。

https://kubernetes.io/docs/concepts/services-networking/service/

        service.beta.kubernetes.io/aws-load-balancer-security-groups: "sg-53fae93f"
        # A list of existing security groups to be configured on the ELB created. Unlike the annotation
        # service.beta.kubernetes.io/aws-load-balancer-extra-security-groups, this replaces all other security groups previously assigned to the ELB and also overrides the creation 
        # of a uniquely generated security group for this ELB.
        # The first security group ID on this list is used as a source to permit incoming traffic to target worker nodes (service traffic and health checks).
        # If multiple ELBs are configured with the same security group ID, only a single permit line will be added to the worker node security groups, that means if you delete any
        # of those ELBs it will remove the single permit line and block access for all ELBs that shared the same security group ID.
        # This can cause a cross-service outage if not used properly

密切注意这样一个事实,如果您有多个负载均衡器并且您破坏了其中一个,则允许工作 SG 与 ELB SG 对话的入口规则将被撤销。

我想要的是“service.beta.kubernetes.io/aws-load-balancer-stop-messing-with-my-security-groups: true”注释。

我们还使用 service.beta.kubernetes.io/aws-load-balancer-target-node-labels 作为实验,最终我拒绝了 ec2:RevokeSecurityGroupIngress 但这可能会导致其他问题。

AWS 的官方建议是不要共享 LB 安全组。

于 2021-11-29T23:34:26.367 回答