Vista geral
Um limite de ID do processo (PID) é uma restrição de recursos do Kubernetes em nós e pods para evitar a criação excessiva de processos, o que pode afetar a estabilidade dos nós. O Apigee Hybrid suporta a funcionalidade do Kubernetes para definir limites de ID do processo. Este documento fornece instruções sobre como definir estes limites, com recomendações de valores para os serviços do Apigee em plataformas específicas.
Quando os utilizadores do Apigee hybrid gerem os seus próprios clusters, a definição de limites de PIDs no Kubernetes pode melhorar a estabilidade, a segurança e a gestão de recursos do sistema. Isto também é consistente com as práticas recomendadas do Kubernetes.
Definições dos limites de ID do processo
Os limites de ID do processo incluem limites de PID do nó e limites de PID do pod.
Os limites de PIDs dos nós incluem PIDs reservados para o Kube e PIDs reservados para o sistema. O número total de PIDs atribuíveis é o máximo do kernel menos os PIDs reservados para o kube menos os PIDs reservados para o sistema menos os PIDs do limite de despejo:
Limites máximos de IDs do kernel |
|
|
|
= Atribuível |
- Limites máximos de ID do kernel: determinados pelo sistema operativo e pelas respetivas definições do kernel. Uma vez que o Apigee Hybrid é executado exclusivamente num kernel Linux, este guia aborda os limites baseados no Linux nos nós do Kubernetes. O número máximo de limites de ID de processo para um kernel Linux é 4194304.
- Kube-reserved e system-reserved: para a reserva de recursos para Kubernetes ou daemons do sistema operativo.
- Limite de despejo: o limite que indica pressão no nó. O nó é removido quando o limite é atingido. Consulte o artigo Despejo baseado no PID para ver mais detalhes.
- Atribuível: o número de PIDs disponíveis. Consulte o artigo Kubernetes: Node Allocatable para mais informações. Kube-reserved e system-reserved podem ser configurados com as definições do limite de PID do nó.
O limite de PID do agrupamento pode ser configurado para o nó e partilhado entre todos os agrupamentos no nó.
Prepare-se para gerir os limites de IDs de processos
Estes procedimentos usam as seguintes variáveis de ambiente:
export PROJECT_ID=MY_PROJECT_IDexport CLUSTER_NAME=MY_CLUSTER_NAME
export LOCATION=MY_CLUSTER_LOCATION
export APIGEE_NAMESPACE=MY_APIGEE_NAMESPACE # Default: apigee
Valide o acesso
Antes de configurar o limite de IDs de processos, certifique-se de que tem acesso à edição de clusters do Kubernetes.
Os passos seguintes destinam-se a instalações no GKE. Para outras plataformas, consulte a documentação da sua plataforma.
-
Verifique se tem roles/container.clusterAdmin na política de IAM:
gcloud projects get-iam-policy ${PROJECT_ID} \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:your_account_email"
- Se não tiver o acesso, adicione a função à sua conta:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member user:your_account_email \ --role roles/container.clusterAdmin
Valide os limites de PIDs existentes
Verifique se o nó tem limites de PID existentes antes de configurar novos limites.
-
Obtenha um nó do cluster para verificar os valores. Tem de verificar os nós dos conjuntos de nós
apigee-data
eapigee-runtime
:kubectl get nodes -n ${APIGEE_NAMESPACE}
O resultado deve ser semelhante ao seguinte:
NAME STATUS ROLES AGE VERSION gke-my-hybrid-apigee-data-0a1b2c3d-efgh Ready
2d8h v1.31.5-gke.1169000 gke-my-hybrid-apigee-runtime-1b2c3d4e-fghi Ready 2d8h v1.31.5-gke.1169000 -
Exporte o nome do nó a partir do resultado do passo anterior. Execute primeiro este passo seguinte para um nó
apigee-data
e, novamente, para um nóapigee-runtime
:Código
export NODE_NAME=MY_NODE_NAME
Exemplo
export NODE_NAME="gke-my-hybrid-apigee-data-0a1b2c3d-efgh"
- Verifique os limites de PID do node. Use os seguintes comandos para verificar os valores reservados. Se o valor for nulo, o valor não está configurado:
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.kubeReserved'
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.systemReserved'
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.evictionHard'
- Verifique o limite de PID do pod. Use o seguinte comando para verificar o limite de PID do pod existente. Se o valor devolvido for
-1
ou estiver vazio, o limite não é definido:kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.podPidsLimit'
Faça a gestão dos limites de ID do processo
Faça a gestão dos limites de PID do nó
Para instalações no GKE, os recursos de infraestrutura dos nós do Kubernetes são geridos internamente e não precisa de os configurar. Pode ver a capacidade atual e os recursos alocáveis seguindo as instruções em Recursos alocáveis de nós na documentação do Google Kubernetes Engine.
Para plataformas não GKE, consulte a documentação do Kubernetes correspondente para a plataforma. Se o cluster/nó for gerido pelo utilizador (em oposição a totalmente gerido), o limite de PID reservado para o kube e o limite de PID reservado para o sistema podem ser configurados com o Kubelet. Consulte os limites de PID dos nós na documentação do Kubernetes.
Ferramentas
Este procedimento usa o Kubelet para gerir o limite de ID do processo. O Kubelet é o agente que é executado em pods e contentores, e garante que estão a ser executados de acordo com o respetivo PodSpec. Se precisar de instalar o Kubelet, siga as instruções na documentação do Kubernetes: Instalar o kubeadm, o kubelet e o kubectl.
Procedimento
-
Crie um ficheiro de configuração do Kubelet denominado
kubelet-config.yaml
.apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration kubeReserved: pid: PID_VALUE # Example: 1000
Veja mais informações sobre as configurações: Kube Reserved na documentação do Kubernetes.
-
Aplique a configuração do Kubelet:
kubelet --config PATH_TO_KUBELET_CONFIG_YAML
Faça a gestão dos limites de PID do pod
Escolher o limite
Se o limite de PIDs estiver definido para um valor demasiado baixo, pode impedir o arranque de um pod. Se for definido um valor demasiado elevado, pode não detetar comportamentos incorretos dos recursos. Ao selecionar o limite adequado, é importante considerar o comportamento anterior do nó e quaisquer requisitos específicos do serviço.
O GKE tem um intervalo obrigatório para o valor: [1024, 4194304]. Nas plataformas do GKE, pode ver o estado das suas contas de serviço do Kubernetes no Google Cloud console Explorador de métricas. Selecione as métricas Kubernetes Node - PID usage e aplique filtros. Estas métricas mostram a utilização recente de IDs de processos e podem ser consultadas quando escolher um limite de PID.
Em plataformas não GKE, podem estar disponíveis diferentes opções de monitorização. Consulte a documentação do Kubernetes da plataforma correspondente para verificar as métricas.
Processe os requisitos de ID para pods do Apigee
O Apigee Hybrid usa 2 conjuntos de nós, apigee-data e apigee-runtime. Uma vez que alguns dos componentes do Apigee são implementados em ambos os conjuntos de nós, o limite de PID do pod deve ser o mesmo para os dois conjuntos de nós. O limite de PIDs do agrupamento também deve ser superior ao número máximo de PIDs necessários em todos os agrupamentos do Apigee. O limite de PID do pod do Apigee necessário é de 1000, que está abaixo do número mínimo necessário para plataformas GKE.
Limite de PIDs de pods recomendado
Algumas plataformas aplicam um requisito de valor mínimo para o número do limite de PIDs do pod. Nesse caso, é selecionado o requisito de valor mínimo.
Plataforma | Limite mínimo de PID do agrupamento |
---|---|
GKE no Google Cloud | 1024 |
GKE no AWS | 1024 |
GKE no Azure | 1024 |
Google Distributed Cloud (apenas software) no VMware | 1024 |
Google Distributed Cloud (apenas software) em bare metal | 1024 |
EKS | 1000 |
AKS | 1000 |
OpenShift | 1000 |
Rancher Kubernetes Engine (RKE) | 1000 |
Procedimento
Os procedimentos de gestão dos limites de PID de pods são diferentes para plataformas GKE e não GKE.
Plataforma do GKE
A plataforma GKE que suporta a atualização do limite de PID inclui:
- GKE no Google Cloud: consulte gcloud container node-pools.
- GKE na AWS: consulte gcloud container aws node-pools.
- GKE no Azure: consulte gcloud container azure node-pools.
- Google Distributed Cloud (apenas software) no VMware: consulte gcloud container vmware node-pools
- Google Distributed Cloud (apenas software) em bare metal: consulte gcloud container bare-metal node-pools
O limite de PID do pod é controlado pelas configurações do sistema de nós. O GKE tem um intervalo obrigatório para o valor: [1024, 4194304]. Para mais informações, consulte o artigo NodeKubeletConfig.
-
Crie uma configuração do sistema de nós denominada
node-config.yaml
com o limite de PID de pods designado com o seguinte conteúdo:kubeletConfig: podPidsLimit: POD_PID_VALUE # Example: 1024
-
Aplique a configuração aos conjuntos de nós
apigee-data
eapigee-runtime
do Apigee. Quando aplica a configuração, o nó inicia a implementação com uma das estratégias de atualização de nós sem tempo de inatividade.gcloud container OPTIONAL_HOST_PLATFORM node-pools update NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --region CLUSTER_LOCATION \ --system-config-from-file=node-config.yaml \ --project PROJECT_ID
Plataformas não GKE
Para plataformas não pertencentes ao GKE, o limite de PID do pod é controlado pelo Kubelet. O limite é definido pelo campo podPidsLimit
no ficheiro de configuração do Kubelet.
-
Crie um ficheiro de configuração do Kubelet denominado
kubelet-config.yaml
com o seguinte conteúdo:apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration podPidsLimit: POD_PID_VALUE # Example: 1024
-
Aplique a configuração. A definição de podPidsLimit requer o reinício do nó afetado, o que pode causar tempo de inatividade:
kubelet --config PATH_TO_KUBELET_CONFIG_YAML
- Valide a configuração. Consulte o artigo Verifique os limites de PIDs existentes para obter instruções.
Os comandos de configuração dos limites de PID dos pods e as recomendações de ferramentas são diferentes em várias plataformas. Consulte a documentação das respetivas plataformas para ver comandos detalhados. Seguem-se alguns links de documentação de plataformas não GKE para referência. Tenha em atenção que estão sujeitos a alterações:
Plataforma | Documentação |
---|---|
EKS | Personalize nós geridos com modelos de lançamento |
AKS | Personalize a configuração dos nós para os node pools do Serviço Kubernetes do Azure (AKS) |
OpenShift | Riscos de definir limites de ID de processos mais elevados para pods do Red Hat OpenShift Service na AWS |
Rancher Kubernetes Engine (RKE) | Aceda a um cluster com o Kubectl e o kubeconfig |
Resolução de problemas de limites de IDs de processos
O pod está bloqueado no estado Pending
com um erro FailedScheduling
Quando o limite de PIDs do nó ou do pod despeja ou restringe o arranque de um pod, este fica bloqueado no estado Pending
e falha com o erro FailedScheduling
.
-
Obtenha a coluna Node:
kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide
-
Verifique se existe uma condição
PIDPressure
:kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure
-
Em alternativa, verifique o
ApigeeDeployment
do pod correspondente. Obtenha oApigeeDeployment
do resultado que tem o mesmo prefixo que o agrupamento com erro.kubectl get ApigeeDeployment -n ${APIGEE_NAMESPACE}
-
Verifique se o registo recente
Events
tem mensagens de erro relacionadas com o PID:kubectl describe ApigeeDeployment -n ${APIGEE_NAMESPACE} ${APIGEE_DEPLOYMENT_NAME}
- Se a causa for confirmada como o limite de PID, siga os passos em Gerir os limites de PID do nó para atualizar o limite de PID para um valor mais elevado.
O campo podPidsLimit
é inválido.
Quando definir o limite para o GKE, se o podPidsLimit
estiver acima do limite, é apresentada a seguinte mensagem de erro:
ERROR: (gcloud.container.node-pools.update) ResponseError: code=400, message=Invalid podPidsLimit: value must be 1024 <= podPidsLimit <= 4194304.
Atualize o valor de podPidsLimit para dentro do intervalo necessário.