As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Visão geral
O Kubernetes Cluster Autoscaler é uma solução popular de escalonamento.DesiredReplicas
campo dos seus grupos de Auto EC2 Scaling.

Este guia fornecerá um modelo mental para configurar o autoescalador de cluster e escolher o melhor conjunto de compensações para atender aos requisitos da sua organização. Embora não exista uma única melhor configuração, há um conjunto de opções de configuração que permitem que você troque desempenho, escalabilidade, custo e disponibilidade. Além disso, este guia fornecerá dicas e melhores práticas para otimizar sua configuração para a AWS.
Glossário
A terminologia a seguir será usada com frequência em todo este documento. Esses termos podem ter um significado amplo, mas estão limitados às definições abaixo para os fins deste documento.
A escalabilidade se refere ao desempenho do autoescalador de cluster à medida que seu cluster Kubernetes aumenta em número de pods e nós. À medida que os limites de escalabilidade são atingidos, o desempenho e a funcionalidade do Cluster Autoscaler diminuem. Como o autoescalador de cluster excede seus limites de escalabilidade, ele não pode mais adicionar ou remover nós em seu cluster.
O desempenho se refere à rapidez com que o autoescalador de cluster é capaz de tomar e executar decisões de escalabilidade. Um autoescalador de cluster com desempenho perfeito tomaria instantaneamente uma decisão e acionaria uma ação de escalonamento em resposta a estímulos, como um pod se tornando não programável.
A disponibilidade significa que os pods podem ser programados rapidamente e sem interrupções. Isso inclui quando os pods recém-criados precisam ser programados e quando um nó reduzido encerra todos os pods restantes programados nele.
O custo é determinado pela decisão por trás da expansão e da escala nos eventos. Recursos são desperdiçados se um nó existente for subutilizado ou se for adicionado um novo nó grande demais para os pods de entrada. Dependendo do caso de uso, pode haver custos associados ao encerramento prematuro dos pods devido a uma decisão agressiva de redução de escala.
Grupos de nós são um conceito abstrato do Kubernetes para um grupo de nós em um cluster. Ele não é um verdadeiro recurso do Kubernetes, mas existe como uma abstração no autoescalador de cluster, na API de cluster e em outros componentes. Os nós dentro de um grupo de nós compartilham propriedades como rótulos e manchas, mas podem consistir em várias zonas de disponibilidade ou tipos de instância.
EC2 Os grupos de Auto Scaling podem ser usados como uma implementação do Node Groups on. EC2 EC2 Os grupos de Auto Scaling são configurados para iniciar instâncias que se juntam automaticamente aos clusters do Kubernetes e aplicam rótulos e contaminações ao recurso Node correspondente na API do Kubernetes.
EC2 Os grupos de nós gerenciados são outra implementação dos grupos de nós emEC2. Eles eliminam a complexidade da configuração manual dos grupos de EC2 escalabilidade automática e fornecem recursos adicionais de gerenciamento, como atualização da versão do nó e encerramento normal do nó.
Operando o escalador automático de cluster
O Cluster Autoscaler é normalmente instalado como uma implantação
Certifique-se de que:
-
A versão do Cluster Autoscaler corresponde à versão do Cluster. A compatibilidade entre versões não foi testada nem suportada
. -
A descoberta automática
está ativada, a menos que você tenha casos de uso avançados específicos que impeçam o uso desse modo.
Empregue o acesso menos privilegiado à função do IAM
Quando a Descoberta Automáticaautoscaling:SetDesiredCapacity
e os grupos de autoscaling:TerminateInstanceInAutoScalingGroup
Auto Scaling que têm como escopo o cluster atual.
Isso impedirá que um autoescalador de cluster executado em um cluster modifique grupos de nós em um cluster diferente, mesmo que o --node-group-auto-discovery
argumento não tenha sido reduzido aos grupos de nós do cluster usando tags (por exemplo). k8s.io/cluster-autoscaler/<cluster-name>
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"autoscaling:SetDesiredCapacity",
"autoscaling:TerminateInstanceInAutoScalingGroup"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/k8s.io/cluster-autoscaler/enabled": "true",
"aws:ResourceTag/k8s.io/cluster-autoscaler/<my-cluster>": "owned"
}
}
},
{
"Effect": "Allow",
"Action": [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DescribeAutoScalingInstances",
"autoscaling:DescribeLaunchConfigurations",
"autoscaling:DescribeScalingActivities",
"autoscaling:DescribeTags",
"ec2:DescribeImages",
"ec2:DescribeInstanceTypes",
"ec2:DescribeLaunchTemplateVersions",
"ec2:GetInstanceTypesFromInstanceRequirements",
"eks:DescribeNodegroup"
],
"Resource": "*"
}
]
}
Configurando seus grupos de nós
O escalonamento automático eficaz começa com a configuração correta de um conjunto de grupos de nós para seu cluster. Selecionar o conjunto certo de grupos de nós é fundamental para maximizar a disponibilidade e reduzir os custos em suas cargas de trabalho. A AWS implementa grupos de nós usando grupos de EC2 Auto Scaling, que são flexíveis para um grande número de casos de uso. No entanto, o escalador automático de clusters faz algumas suposições sobre seus grupos de nós. Manter as configurações do EC2 Auto Scaling Group consistentes com essas suposições minimizará o comportamento indesejado.
Certifique-se de que:
-
Cada nó em um grupo de nós tem propriedades de agendamento idênticas, como rótulos, manchas e recursos.
-
Pois MixedInstancePolicies, os tipos de instância devem ter o mesmo formato para CPU, memória e GPU
-
O primeiro tipo de instância especificado na política será usado para simular o agendamento.
-
Se sua política tiver tipos de instância adicionais com mais recursos, os recursos podem ser desperdiçados após a expansão horizontal.
-
Se sua política tiver tipos de instância adicionais com menos recursos, os pods podem falhar no agendamento das instâncias.
-
-
Grupos de nós com muitos nós são preferidos em relação a muitos grupos de nós com menos nós. Isso terá o maior impacto na escalabilidade.
-
Sempre que possível, prefira EC2 recursos quando os dois sistemas fornecerem suporte (por exemplo, regiões MixedInstancePolicy)
Observação: recomendamos o uso de grupos de nós gerenciados do EKS. Os grupos de nós gerenciados vêm com recursos de gerenciamento poderosos, incluindo recursos para o escalador automático de cluster, como descoberta automática de grupos de Auto EC2 Scaling e encerramento de nós sem problemas.
Otimizando o desempenho e a escalabilidade
Os botões principais para ajustar a escalabilidade do autoescalador de cluster são os recursos fornecidos ao processo, o intervalo de varredura do algoritmo e o número de grupos de nós no cluster. Há outros fatores envolvidos na verdadeira complexidade do tempo de execução desse algoritmo, como a complexidade do plug-in de agendamento e o número de pods. Esses parâmetros são considerados não configuráveis, pois são naturais à carga de trabalho do cluster e não podem ser facilmente ajustados.
O escalador automático de cluster carrega todo o estado do cluster na memória, incluindo pods, nós e grupos de nós. Em cada intervalo de varredura, o algoritmo identifica pods não programáveis e simula o agendamento para cada grupo de nós. O ajuste desses fatores vem com diferentes compensações que devem ser cuidadosamente consideradas para seu caso de uso.
Escalonamento automático vertical do escalonador automático do cluster
A maneira mais simples de escalar o autoescalador de cluster para clusters maiores é aumentar as solicitações de recursos para sua implantação. Tanto a memória quanto a CPU devem ser aumentadas para clusters grandes, embora isso varie significativamente com o tamanho do cluster. O algoritmo de escalonamento automático armazena todos os pods e nós na memória, o que pode resultar em um espaço de memória maior que um gigabyte em alguns casos. O aumento de recursos geralmente é feito manualmente. Se você achar que o ajuste constante de recursos está criando uma carga operacional, considere usar o Addon Resizer
Reduzindo o número de grupos de nós
Minimizar o número de grupos de nós é uma forma de garantir que o autoescalador de clusters continue funcionando bem em clusters grandes. Isso pode ser um desafio para algumas organizações que estruturam seus grupos de nós por equipe ou por aplicativo. Embora isso seja totalmente suportado pela API Kubernetes, isso é considerado um antipadrão do autoescalador de cluster com repercussões na escalabilidade. Há muitos motivos para usar vários grupos de nós (por exemplo, Spot ou GPUs), mas em muitos casos existem designs alternativos que alcançam o mesmo efeito ao usar um pequeno número de grupos.
Certifique-se de que:
-
O isolamento do pod é feito usando namespaces em vez de grupos de nós.
-
Isso pode não ser possível em clusters multilocatários de baixa confiança.
-
O pod ResourceRequests e o Pod ResourceLimits estão configurados corretamente para evitar a contenção de recursos.
-
Tipos de instância maiores resultarão em um melhor empacotamento de compartimentos e redução da sobrecarga do pod do sistema.
-
-
NodeTaints ou NodeSelectors são usados para programar pods como exceção, não como regra.
-
Os recursos regionais são definidos como um único grupo de EC2 Auto Scaling com várias zonas de disponibilidade.
Reduzindo o intervalo de varredura
Um intervalo de varredura baixo (por exemplo, 10 segundos) garantirá que o escalador automático de cluster responda o mais rápido possível quando os pods não puderem ser programados. No entanto, cada verificação resulta em muitas chamadas de API para a API Kubernetes e o EC2 Auto Scaling Group ou o EKS Managed Node Group. APIs Essas chamadas de API podem resultar na limitação da taxa ou até mesmo na indisponibilidade do serviço para seu plano de controle do Kubernetes.
O intervalo de verificação padrão é de 10 segundos, mas na AWS, a execução de um nó leva muito mais tempo para iniciar uma nova instância. Isso significa que é possível aumentar o intervalo sem aumentar significativamente o tempo geral para o aumento da escala. Por exemplo, se forem necessários 2 minutos para iniciar um nó, alterar o intervalo para 1 minuto resultará em uma troca de chamadas de API reduzidas em 6 vezes por aumentos de escala 38% mais lentos.
Fragmentação entre grupos de nós
O escalador automático de cluster pode ser configurado para operar em um conjunto específico de grupos de nós. Usando essa funcionalidade, é possível implantar várias instâncias do autoescalador de cluster, cada uma configurada para operar em um conjunto diferente de grupos de nós. Essa estratégia permite que você use números arbitrariamente grandes de grupos de nós, trocando o custo pela escalabilidade. Recomendamos usar isso apenas como último recurso para melhorar o desempenho.
O escalador automático de cluster não foi originalmente projetado para essa configuração, portanto, há alguns efeitos colaterais. Como os fragmentos não se comunicam, é possível que vários autoescaladores tentem programar um pod não programável. Isso pode resultar em escalabilidade desnecessária de vários grupos de nós. Esses nós extras voltarão a ser ampliados após scale-down-delay
o.
metadata:
name: cluster-autoscaler
namespace: cluster-autoscaler-1
...
--nodes=1:10:k8s-worker-asg-1
--nodes=1:10:k8s-worker-asg-2
---
metadata:
name: cluster-autoscaler
namespace: cluster-autoscaler-2
...
--nodes=1:10:k8s-worker-asg-3
--nodes=1:10:k8s-worker-asg-4
Certifique-se de que:
-
Cada fragmento é configurado para apontar para um conjunto exclusivo de grupos de EC2 Auto Scaling
-
Cada fragmento é implantado em um namespace separado para evitar conflitos na eleição do líder
Otimizando o custo e a disponibilidade
Instâncias spot
Você pode usar Instâncias Spot em seus grupos de nós e economizar até 90% do preço sob demanda. Com a desvantagem, as Instâncias Spot podem ser interrompidas a qualquer momento quando EC2 precisar recuperar a capacidade. Erros de capacidade insuficiente ocorrerão quando seu grupo de EC2 Auto Scaling não puder ser ampliado devido à falta de capacidade disponível. Maximizar a diversidade selecionando muitas famílias de instâncias pode aumentar sua chance de alcançar a escala desejada explorando vários pools de capacidade spot e diminuir o impacto das interrupções de instâncias spot na disponibilidade do cluster. Políticas de instâncias mistas com instâncias spot são uma ótima maneira de aumentar a diversidade sem aumentar o número de grupos de nós. Lembre-se de que, se você precisar de recursos garantidos, use instâncias sob demanda em vez de instâncias spot.
É fundamental que todos os tipos de instância tenham capacidade de recursos semelhante ao configurar políticas de instância mista. O simulador de agendamento do autoescalador usa o primeiro no. InstanceType MixedInstancePolicy Se os tipos de instância subsequentes forem maiores, os recursos poderão ser desperdiçados após um aumento de escala. Se forem menores, seus pods podem não ser programados nas novas instâncias devido à capacidade insuficiente. Por exemplo, todas as instâncias M4, M5, M5a e M5n têm quantidades semelhantes de CPU e memória e são ótimas candidatas para a. MixedInstancePolicy A ferramenta EC2 Instance Selector

É recomendável isolar a capacidade sob demanda e spot em grupos separados de Auto EC2 Scaling. Isso é preferível ao uso de uma estratégia de capacidade básica porque as propriedades de agendamento são fundamentalmente diferentes. Como as instâncias spot são interrompidas a qualquer momento (quando é EC2 necessário recuperar a capacidade), os usuários geralmente contaminam seus nós preemptivos, exigindo uma tolerância explícita do pod ao comportamento de preempção. Essas manchas resultam em propriedades de agendamento diferentes para os nós, portanto, eles devem ser separados em vários grupos de Auto EC2 Scaling.
O escalador automático de cluster tem um conceito de expansores--expander=least-waste
é um bom padrão de uso geral e, se você for usar vários grupos de nós para diversificar instâncias spot (conforme descrito na imagem acima), ela poderá ajudar a otimizar ainda mais os custos dos grupos de nós ao escalar o grupo que seria melhor utilizado após a atividade de escalabilidade.
Priorizando um grupo de nós/ASG
Você também pode configurar o escalonamento automático baseado em prioridade usando o expansor de prioridade. --expander=priority
permite que seu cluster priorize um grupo de nós /ASG e, se não conseguir escalar por algum motivo, ele escolherá o próximo grupo de nós na lista priorizada. Isso é útil em situações em que, por exemplo, você deseja usar tipos de instância P3 porque a GPU deles fornece desempenho ideal para sua carga de trabalho, mas, como segunda opção, você também pode usar tipos de instância P2.
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-autoscaler-priority-expander
namespace: kube-system
data:
priorities: |-
10:
- .*p2-node-group.*
50:
- .*p3-node-group.*
O Cluster Autoscaler tentará escalar o grupo Auto EC2 Scaling correspondente ao nome p3-node-group. Se essa operação não for bem-sucedida--max-node-provision-time
, ela tentará escalar um grupo de EC2 Auto Scaling correspondente ao nome p2-node-group. Esse valor é padronizado para 15 minutos e pode ser reduzido para uma seleção de grupos de nós mais responsiva, mas se o valor for muito baixo, isso pode causar escalas desnecessárias.
Provisionamento excessivo
O escalador automático de cluster minimiza os custos ao garantir que os nós sejam adicionados ao cluster somente quando necessário e removidos quando não utilizados. Isso afeta significativamente a latência da implantação, pois muitos pods serão forçados a esperar pelo aumento da escala de um nó antes de poderem ser programados. Os nós podem levar vários minutos para ficarem disponíveis, o que pode aumentar a latência do agendamento do pod em uma ordem de grandeza.
Isso pode ser atenuado usando o provisionamento em excesso
Há outros benefícios menos óbvios no provisionamento excessivo. Sem o provisionamento excessivo, um dos efeitos colaterais de um cluster altamente utilizado é que os pods tomarão decisões de agendamento menos ideais usando a preferredDuringSchedulingIgnoredDuringExecution
regra de Pod ou Node Affinity. Um caso de uso comum para isso é separar pods para um aplicativo altamente disponível em todas as zonas de disponibilidade usando AntiAffinity. O provisionamento excessivo pode aumentar significativamente a chance de que um nó da zona correta esteja disponível.
A quantidade de capacidade superprovisionada é uma decisão comercial cuidadosa para sua organização. Em essência, é uma troca entre desempenho e custo. Uma forma de tomar essa decisão é determinar sua frequência média de aumento de escala e dividi-la pelo tempo necessário para escalar um novo nó. Por exemplo, se, em média, você precisar de um novo nó a cada 30 segundos e EC2 levar 30 segundos para provisionar um novo nó, um único nó de superprovisionamento garantirá que sempre haja um nó extra disponível, reduzindo a latência do agendamento em 30 segundos ao custo de uma única instância adicional. EC2 Para melhorar as decisões de agendamento zonal, provisione em excesso um número de nós igual ao número de zonas de disponibilidade em seu Grupo de EC2 Auto Scaling para garantir que o programador possa selecionar a melhor zona para os pods de entrada.
Evite o despejo em escala reduzida
O despejo de algumas workloads são caros. A análise de big data, as tarefas de aprendizado de máquina e os executores de testes acabarão sendo concluídos, mas deverão ser reiniciados se forem interrompidos. O escalador automático de cluster tentará reduzir qualquer nó abaixo do scale-down-utilization-threshold, o que interromperá todos os pods restantes no nó. Isso pode ser evitado garantindo que os pods caros de serem despejados sejam protegidos por um rótulo reconhecido pelo escalador automático de cluster.
Certifique-se de que:
-
Cápsulas caras de despejar têm a anotação
cluster-autoscaler.kubernetes.io/safe-to-evict=false
Casos de uso avançados
Volumes do EBS
O armazenamento persistente é essencial para criar aplicativos com bom estado, como bancos de dados ou caches distribuídos. Os volumes do EBS
Certifique-se de que:
-
O balanceamento do grupo de nós está ativado pela configuração
balance-similar-node-groups=true
. -
Os grupos de nós são configurados com configurações idênticas, exceto para diferentes zonas de disponibilidade e volumes do EBS.
Co-agendamento
Treinamentos distribuídos de machine learning se beneficiam significativamente da latência minimizada das configurações de nós da mesma zona. Essas cargas de trabalho implantam vários pods em uma zona específica. Isso pode ser feito configurando o Pod Affinity para todos os pods co-programados ou usando o Node Affinity. topologyKey: failure-domain.beta.kubernetes.io/zone
O escalonador automático de cluster então expandirá uma zona específica para atender às demandas. Talvez você queira alocar vários grupos de EC2 Auto Scaling, um por zona de disponibilidade, para permitir o failover de toda a carga de trabalho coagendada.
Certifique-se de que:
-
O balanceamento do grupo de nós está ativado pela configuração
balance-similar-node-groups=false
-
O Node Affinity
e/ou Pod Preemption é usado quando os clusters incluem grupos de nós regionais e zonais. -
Use Node Affinity
para forçar ou incentivar grupos regionais a evitar grupos de nós zonais e vice-versa. -
Se os pods zonais forem programados em grupos de nós regionais, isso resultará em um desequilíbrio na capacidade dos pods regionais.
-
Se suas cargas de trabalho zonais puderem tolerar interrupções e realocação, configure o Pod Preemption para permitir que pods escalonados regionalmente forcem a preempção
e o reagendamento em uma zona menos contestada.
-
Aceleradores
Alguns clusters aproveitam aceleradores de hardware especializados, como a GPU. Ao escalar para baixo, o plug-in do dispositivo acelerador pode levar vários minutos para anunciar o recurso no cluster. O escalador automático de cluster simulou que esse nó terá o acelerador, mas até que o acelerador fique pronto e atualize os recursos disponíveis do nó, os pods pendentes não podem ser programados no nó. Isso pode resultar na repetição desnecessária do aumento de escala
Além disso, nós com aceleradores e alta utilização de CPU ou memória não serão considerados para redução de escala, mesmo que o acelerador não seja usado. Esse comportamento pode ser caro devido ao custo relativo dos aceleradores. Em vez disso, o autoescalador de cluster pode aplicar regras especiais para considerar os nós a serem reduzidos se eles tiverem aceleradores desocupados.
Para garantir o comportamento correto nesses casos, você pode configurar o kubelet nos nós do acelerador para rotular o nó antes que ele se junte ao cluster. O autoescalador de cluster usará esse seletor de rótulos para acionar o comportamento otimizado do acelerador.
Certifique-se de que:
-
O Kubelet para nós de GPU é configurado com
--node-labels k8s.amazonaws.com/accelerator=$ACCELERATOR_TYPE
-
Os nós com aceleradores seguem a mesma regra de propriedades de agendamento mencionada acima.
Escalando a partir de 0
O Cluster Autoscaler é capaz de escalar grupos de nós de e para zero, o que pode gerar economias de custo significativas. Ele detecta os recursos de CPU, memória e GPU de um grupo de Auto Scaling inspecionando InstanceType o especificado em seu ou. LaunchConfiguration LaunchTemplate Alguns pods requerem recursos adicionais, como WindowsENI
ou específicos, PrivateIPv4Address
NodeSelectors ou Taints, que não podem ser descobertos no. LaunchConfiguration O escalador automático de cluster pode explicar esses fatores ao descobri-los nas tags do Auto Scaling Group. EC2 Por exemplo:
Key: k8s.io/cluster-autoscaler/node-template/resources/$RESOURCE_NAME
Value: 5
Key: k8s.io/cluster-autoscaler/node-template/label/$LABEL_KEY
Value: $LABEL_VALUE
Key: k8s.io/cluster-autoscaler/node-template/taint/$TAINT_KEY
Value: NoSchedule
Observação: lembre-se de que, ao escalar para zero, sua capacidade é retornada EC2 e pode ficar indisponível no futuro.
Parâmetros adicionais
Há muitas opções de configuração que podem ser usadas para ajustar o comportamento e a performance do Cluster Autoscaler. Uma lista completa de parâmetros está disponível em GitHub
Parameter | Descrição | Padrão |
---|---|---|
intervalo de digitalização |
Com que frequência o cluster é reavaliado para aumentar ou diminuir a escala |
10 segundos |
max-empty-bulk-delete |
Número máximo de nós vazios que podem ser excluídos ao mesmo tempo. |
10 |
scale-down-delay-after-adicionar |
Quanto tempo após a ampliação, essa avaliação de redução é retomada |
10 minutos |
scale-down-delay-after-excluir |
Quanto tempo após a exclusão do nó, essa avaliação de redução é retomada, o padrão é o intervalo de varredura |
intervalo de digitalização |
scale-down-delay-after-falha |
Quanto tempo após a falha na redução da escala, a avaliação da redução é retomada |
3 minutos |
scale-down-unneeded-time |
Por quanto tempo um nó deve ser desnecessário antes de ser elegível para redução de escala |
10 minutos |
scale-down-unready-time |
Por quanto tempo um nó não pronto deve ser desnecessário antes de ser elegível para redução |
20 minutos |
scale-down-utilization-threshold |
Nível de utilização do nó, definido como a soma dos recursos solicitados dividida pela capacidade, abaixo do qual um nó pode ser considerado para redução |
0,5 |
scale-down-non-empty-contagem de candidatos |
Número máximo de nós não vazios considerados em uma iteração como candidatos à redução de escala com drenagem. Um valor menor significa melhor capacidade de resposta da CA, mas é possível reduzir a latência. Um valor mais alto pode afetar o desempenho da CA com grandes clusters (centenas de nós). Defina como um valor não positivo para desativar essa heurística - a CA não limitará o número de nós que considera. ” |
30 |
scale-down-candidates-pool-proporção |
Uma proporção de nós que são considerados candidatos adicionais não vazios para redução de escala quando alguns candidatos da iteração anterior não são mais válidos. Um valor menor significa melhor capacidade de resposta da CA, mas é possível reduzir a latência. Um valor mais alto pode afetar o desempenho da CA com grandes clusters (centenas de nós). Defina como 1,0 para desativar essa heurística. A CA considerará todos os nós como candidatos adicionais. |
0.1 |
scale-down-candidates-pool-contagem mínima |
Número mínimo de nós que são considerados candidatos adicionais não vazios para redução de escala quando alguns candidatos da iteração anterior não são mais válidos. Ao calcular o tamanho da piscina para candidatos adicionais, tomamos |
50 |
Recursos adicionais
Esta página contém uma lista de apresentações e demonstrações do Cluster Autoscaler. Se você quiser adicionar uma apresentação ou demonstração aqui, envie um pull request.
Apresentação/Demonstração | Apresentadores |
---|---|
Escalonamento automático e otimização de custos no Kubernetes: de 0 a 100 |
Guy Templeton, Skyscanner e Jiaxin Shan, Amazon |
Maciek Pytel e Marcin Wielgus |