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á.
Kubernetes Upstream SLOs
O Amazon EKS executa o mesmo código das versões upstream do Kubernetes e garante que os clusters EKS operem dentro do SLOs definido pela comunidade do Kubernetes. O Kubernetes Scalability Special Interest Group (SIG)
SLIs são como medimos um sistema, como métricas ou medidas que podem ser usadas para determinar o quão “bem” o sistema está funcionando, por exemplo, latência ou contagem de solicitações. SLOs defina os valores que são esperados para quando o sistema está funcionando “bem”, por exemplo, a latência da solicitação permanece em menos de 3 segundos. O Kubernetes SLOs e o Kubernetes SLIs se concentram no desempenho dos componentes do Kubernetes e são completamente independentes do Amazon EKS Service, SLAs que se concentra na disponibilidade do endpoint do cluster EKS.
O Kubernetes tem vários recursos que permitem aos usuários ampliar o sistema com complementos ou drivers personalizados, como drivers CSI, webhooks de admissão e escalonadores automáticos. Essas extensões podem impactar drasticamente o desempenho de um cluster Kubernetes de maneiras diferentes, ou seja, um webhook de admissão failurePolicy=Ignore
pode adicionar latência às solicitações de API K8s se o destino do webhook não estiver disponível. O Kubernetes Scalability SIG define escalabilidade usando uma estrutura do tipo “você promete, nós prometemos
Kubernetes SLOs
O Kubernetes SLOs não leva em conta todos os plug-ins e limitações externas que podem afetar um cluster, como escalabilidade de nós de trabalho ou webhooks de admissão. Eles SLOs se concentram nos componentes do Kubernetes e garantem que as ações e os
O Kubernetes Scalability SIG define
Objetivo | Definição | SLO |
---|---|---|
Latência da solicitação de API (mutação) |
Latência de processamento de chamadas de API mutantes para objetos únicos para cada par (recurso, verbo), medida como 99º percentil nos últimos 5 minutos |
Na instalação padrão do Kubernetes, para cada par (recurso, verbo), excluindo recursos virtuais e agregados e definições de recursos personalizadas, 99º percentil por dia de cluster <= 1s |
Latência da solicitação de API (somente leitura) |
Latência de processamento de chamadas de API sem streaming (somente leitura) para cada par (recurso, escopo), medida como 99º percentil nos últimos 5 minutos |
Na instalação padrão do Kubernetes, para cada par (recurso, escopo), excluindo recursos virtuais e agregados e definições de recursos personalizadas, 99º percentil por dia de cluster: (a) <= 1s se (b) <= 30s caso contrário (se ou) |
Latência de inicialização do pod |
Latência de inicialização de pods sem estado programáveis, excluindo o tempo para extrair imagens e executar contêineres de inicialização, medido desde o registro de data e hora de criação do pod até o momento em que todos os contêineres são relatados como iniciados e observados por meio do watch, medido como 99º percentil nos últimos 5 minutos |
Na instalação padrão do Kubernetes, 99º percentil por dia de cluster <= 5s |
Latência da solicitação de API
O kube-apiserver
foi --request-timeout
definido como 1m0s
por padrão, o que significa que uma solicitação pode ser executada por até um minuto (60 segundos) antes de atingir o tempo limite e ser cancelada. Os SLOs definidos para latência são divididos pelo tipo de solicitação que está sendo feita, que pode ser mutante ou somente para leitura:
Mutante
Solicitações mutantes no Kubernetes fazem alterações em um recurso, como criações, exclusões ou atualizações. Essas solicitações são caras porque essas alterações devem ser gravadas no back-end do etcd
Essa latência é medida como o 99º percentil em 5 minutos para pares (recurso, verbo) de recursos do Kubernetes. Por exemplo, isso mediria a latência das solicitações Create Pod e Update Node. A latência da solicitação deve ser <= 1 segundo para satisfazer o SLO.
Somente leitura
Solicitações somente para leitura recuperam um único recurso (como Get Pod X) ou uma coleção (como “Get all Pods from Namespace X”). O kube-apiserver
mantém um cache de objetos, portanto, os recursos solicitados podem ser retornados do cache ou talvez precisem ser recuperados primeiro do etcd. Essas latências também são medidas pelo 99º percentil em 5 minutos, no entanto, as solicitações somente para leitura podem ter escopos separados. O SLO define dois objetivos diferentes:
-
Para solicitações feitas para um único recurso (ou seja,
kubectl get pod -n mynamespace my-controller-xxx
), a latência da solicitação deve permanecer <= 1 segundo. -
Para solicitações feitas para vários recursos em um namespace ou cluster (por exemplo,
kubectl get pods -A
), a latência deve permanecer <= 30 segundos
O SLO tem valores-alvo diferentes para diferentes escopos de solicitação porque as solicitações feitas para uma lista de recursos do Kubernetes esperam que os detalhes de todos os objetos na solicitação sejam retornados dentro do SLO. Em grandes clusters ou grandes coleções de recursos, isso pode resultar em grandes tamanhos de resposta que podem levar algum tempo para retornar. Por exemplo, em um cluster executando dezenas de milhares de pods, com cada pod custando aproximadamente 1 KiB quando codificado em JSON, o retorno de todos os pods no cluster consistiria em 10 MB ou mais. Os clientes do Kubernetes podem ajudar a reduzir esse tamanho de resposta usando o APIList Chunking para recuperar
Latência de inicialização do pod
Esse SLO se preocupa principalmente com o tempo que leva desde a criação do pod até o momento em que os contêineres desse pod realmente começam a ser executados. Para medir isso, calcula-se a diferença entre o timestamp de criação registrado no pod e quando um WATCH nesse pod relata que
Observe que esse SLO pressupõe que os nós de trabalho já existam nesse cluster em um estado pronto para o agendamento do pod. Esse SLO não leva em conta a extração de imagens ou a execução de contêineres de inicialização e também limita o teste a “pods sem estado” que não utilizam plug-ins de armazenamento persistente.
Métricas de SLI do Kubernetes
O Kubernetes também está melhorando a observabilidade ao SLIs adicionar métricas do Prometheus
Latência da solicitação do servidor de API
Métrica | Definição |
---|---|
apiserver_request_sli_duration_seconds |
Distribuição da latência de resposta (sem contar a duração do webhook e os tempos de espera da fila de prioridade e imparcialidade) em segundos para cada verbo, grupo, versão, recurso, sub-recurso, escopo e componente. |
apiserver_request_duration_seconds |
Distribuição da latência de resposta em segundos para cada verbo, valor de simulação, grupo, versão, recurso, sub-recurso, escopo e componente. |
Observação: a apiserver_request_sli_duration_seconds
métrica está disponível a partir do Kubernetes 1.27.
Você pode usar essas métricas para investigar os tempos de resposta do API Server e se há gargalos nos componentes do Kubernetes ou em outros plugins/componentes. As consultas abaixo são baseadas no painel do SLO da comunidade
Latência de solicitação de API SLI (mutante) - dessa vez, não inclui a execução do webhook ou o tempo de espera na fila. histogram_quantile(0.99, sum(rate(apiserver_request_sli_duration_seconds_bucket{verb=~"CREATE|DELETE|PATCH|POST|PUT", subresource!~"proxy|attach|log|exec|portforward"}[5m])) by (resource, subresource, verb, scope, le)) > 0
Total da latência da solicitação de API (mutante) - esse é o tempo total que a solicitação levou no servidor da API. Esse tempo pode ser maior que o tempo de SLI, pois inclui a execução do webhook e os tempos de espera de prioridade e justiça da API. histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket{verb=~"CREATE|DELETE|PATCH|POST|PUT", subresource!~"proxy|attach|log|exec|portforward"}[5m])) by (resource, subresource, verb, scope, le)) > 0
Nessas consultas, estamos excluindo as solicitações da API de streaming que não retornam imediatamente, como kubectl port-forward
or kubectl exec
requests (subresource!~"proxy|attach|log|exec|portforward"
), e estamos filtrando apenas os verbos do Kubernetes que modificam objects (). verb=~"CREATE|DELETE|PATCH|POST|PUT"
Em seguida, calculamos o 99º percentil dessa latência nos últimos 5 minutos.
Podemos usar uma consulta semelhante para as solicitações de API somente para leitura. Basta modificar os verbos que estamos filtrando para incluir as ações LIST
somente leitura e. GET
Também há limites de SLO diferentes, dependendo do escopo da solicitação, ou seja, obter um único recurso ou listar vários recursos.
Latência de solicitação de API SLI (somente leitura) - dessa vez não inclui a execução do webhook ou o tempo de espera na fila. Para um único recurso (escopo=recurso, limite=1s) histogram_quantile(0.99, sum(rate(apiserver_request_sli_duration_seconds_bucket{verb=~"GET", scope=~"resource"}[5m])) by (resource, subresource, verb, scope, le))
Para uma coleção de recursos no mesmo namespace (scope=namespace, threshold=5s) histogram_quantile(0.99, sum(rate(apiserver_request_sli_duration_seconds_bucket{verb=~"LIST", scope=~"namespace"}[5m])) by (resource, subresource, verb, scope, le))
Para uma coleção de recursos em todo o cluster (escope=cluster, threshold=30s) histogram_quantile(0.99, sum(rate(apiserver_request_sli_duration_seconds_bucket{verb=~"LIST", scope=~"cluster"}[5m])) by (resource, subresource, verb, scope, le))
Latência total da solicitação de API (somente leitura) - esse é o tempo total que a solicitação levou no servidor da API. Esse tempo pode ser maior que o tempo de SLI, pois inclui a execução do webhook e os tempos de espera. Para um único recurso (escopo=recurso, limite=1s) histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket{verb=~"GET", scope=~"resource"}[5m])) by (resource, subresource, verb, scope, le))
Para uma coleção de recursos no mesmo namespace (scope=namespace, threshold=5s) histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket{verb=~"LIST", scope=~"namespace"}[5m])) by (resource, subresource, verb, scope, le))
Para uma coleção de recursos em todo o cluster (escope=cluster, threshold=30s) histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket{verb=~"LIST", scope=~"cluster"}[5m])) by (resource, subresource, verb, scope, le))
As métricas do SLI fornecem informações sobre o desempenho dos componentes do Kubernetes, excluindo o tempo que as solicitações passam esperando nas filas de prioridade e justiça da API, trabalhando por meio de webhooks de admissão ou outras extensões do Kubernetes. As métricas totais fornecem uma visão mais holística, pois refletem o tempo que seus aplicativos esperariam por uma resposta do servidor da API. A comparação dessas métricas pode fornecer informações sobre onde os atrasos no processamento da solicitação estão sendo introduzidos.
Latência de inicialização do pod
Métrica | Definição |
---|---|
kubelet_pod_start_sli_duration_seconds |
Duração em segundos para iniciar um pod, excluindo o tempo para extrair imagens e executar contêineres de inicialização, medido desde o registro de data e hora de criação do pod até o momento em que todos os contêineres são relatados como iniciados e observados por meio do watch |
kubelet_pod_start_duration_seconds |
Duração em segundos, desde o kubelet ver um pod pela primeira vez até o pod começar a funcionar. Isso não inclui o tempo para programar o pod ou expandir a capacidade do nó de trabalho. |
Observação: kubelet_pod_start_sli_duration_seconds
está disponível a partir do Kubernetes 1.27.
Semelhante às consultas acima, você pode usar essas métricas para obter informações sobre por quanto tempo o escalonamento de nós, as extraições de imagens e os contêineres de inicialização estão atrasando o lançamento do pod em comparação com as ações do Kubelet.
Latência de inicialização do pod SLI - esse é o tempo desde a criação do pod até o momento em que os contêineres do aplicativo são relatados como em execução. Isso inclui o tempo necessário para que a capacidade do nó de trabalho esteja disponível e o pod seja programado, mas não inclui o tempo necessário para extrair imagens ou para que os contêineres de inicialização sejam executados. histogram_quantile(0.99, sum(rate(kubelet_pod_start_sli_duration_seconds_bucket[5m])) by (le))
Latência total de inicialização do pod - esse é o tempo que o kubelet leva para iniciar o pod pela primeira vez. Isso é medido a partir do momento em que o kubelet recebe o pod via WATCH, o que não inclui o tempo de escalonamento ou agendamento do nó de trabalho. Isso inclui o tempo para extrair imagens e iniciar contêineres para execução. histogram_quantile(0.99, sum(rate(kubelet_pod_start_duration_seconds_bucket[5m])) by (le))
SLOs em seu cluster
Se você estiver coletando as métricas do Prometheus dos recursos do Kubernetes em seu cluster EKS, poderá obter informações mais detalhadas sobre o desempenho dos componentes do plano de controle do Kubernetes.
O repositório perf-tests inclui
Se você estiver usando a solução Prometheus kube-prometheus-stack
ou uma solução similar, poderá instalar o mesmo painel para observar SLOs o seu cluster em tempo real.
-
Primeiro, você precisará instalar as Regras do Prometheus que são usadas nos painéis com.
kubectl apply -f prometheus-rules.yaml
Você pode baixar uma cópia das regras aqui: https://github.com/kubernetes/perf- tests/blob/master/clusterloader2/pkg/prometheus/manifests/prometheus -rules.yaml-
Certifique-se de verificar se o namespace no arquivo corresponde ao seu ambiente
-
Verifique se os rótulos correspondem ao valor do
prometheus.prometheusSpec.ruleSelector
leme se você estiver usandokube-prometheus-stack
-
-
Em seguida, você pode instalar os painéis no Grafana. Os painéis json e os scripts python para gerá-los estão disponíveis aqui: perf- https://github.com/kubernetes/ tests/tree/master/clusterloader2/pkg/prometheus/manifests/dashboards
-
o
slo.json
painelexibe o desempenho do cluster em relação ao Kubernetes SLOs
-
Considere que SLOs eles estão focados no desempenho dos componentes do Kubernetes em seus clusters, mas há métricas adicionais que você pode analisar que fornecem diferentes perspectivas ou insights sobre seu cluster. Projetos comunitários do Kubernetes, como o K
O Guia de Melhores Práticas de Observabilidade