Kubernetes и AWS: установите LoadBalancer для использования предварительно определенной группы безопасности
Как видно из заголовка, я ищу способ заставить службу LoadBalancer использовать предопределенную группу безопасности в AWS. Я не хочу вручную редактировать входящие / исходящие правила группы безопасности, созданной для ELB Kubernetes. Я не смог найти ничего в документации, и я не нашел ничего, что работает в другом месте онлайн. Вот мой текущий шаблон:
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
5 ответов
Вы не можете запретить 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
Вы не можете ограничить kubernetes от создания новой группы безопасности, но вы можете указать существующие группы безопасности, используя аннотации, как указано в документации:
service.beta.kubernetes.io/aws-load-balancer-extra-security-groups: "sg-53fae93f, sg-42efd82e" -> Список дополнительных групп безопасности, добавляемых в ELB
Я понимаю, что этому посту уже пару лет, но он нашел меня в поиске Google. Похоже, что теперь с k8s 1.7+ теперь возможно предотвратить создание группой безопасности kubernetes. См. https://github.com/kubernetes/kops/blob/release-1.9/docs/cluster_spec.md#cloudconfig для получения дополнительной информации.
Теперь это возможно и было некоторое время.
См. 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 Security.
Похоже, в настоящее время это невозможно. С помощью следующего кода в 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}
.
.
.
}
Нет способа предотвратить создание группы безопасности.