Os componentes da camada de contêiner do Lingjun Runtime Kit são de código aberto. Você pode personalizar nomes de recursos, políticas de agendamento, métricas de monitoramento e o comportamento de ativação e desativação de nós a partir do código-fonte. Este tópico aborda a estrutura do código-fonte dos componentes, a criação de imagens, a integração de implantação e os limites de personalização.
Preview público: este produto está atualmente em preview público. Se tiver dúvidas ou sugestões, abra um ticket.
1. Obter o código-fonte
O código-fonte dos componentes de código aberto está publicado no repositório do GitHub aliyun/LJ-RuntimeKit. Cada componente fica em seu próprio subdiretório:
|
Componente |
Localização do código-fonte |
Principais áreas de personalização |
|
Device Plugin |
|
Personalização de nomes de recursos, granularidade de particionamento de memória GPU |
|
Scheduler Framework |
|
Políticas de pontuação de agendamento, modelagem de recursos, adaptação para versões do Kubernetes |
|
Exporter |
|
Métricas personalizadas |
|
Controller (controle de chaveamento) |
Diretório do componente |
Lógica de observação de labels, comportamento de operação de nós |
Convenções de branches e tags:
A branch main sempre contém o código utilizável mais recente.
Tags marcam versões estáveis. Cada versão de componente de código aberto acompanha a versão correspondente do Runtime.
2. Compilar e criar imagens
Compile cada componente a partir da raiz do diretório de código-fonte usando o Makefile:
make build # Compile the binary
make docker # Build the image
Para outros targets de compilação, consulte o Makefile no diretório de cada componente. Após a conclusão da compilação, envie as imagens para um registry do qual os nós do cluster possam fazer pull. Certifique-se de que os nomes e tags das imagens nos manifestos de implantação correspondam aos artefatos de compilação reais (para detalhes sobre arquivos de implantação e configuração de imagens, consulte 3.6 Implantação avançada e personalização).
Adaptar o Scheduler Framework para múltiplas versões do Kubernetes
O Scheduler Framework compila como um plugin out-of-tree e depende de k8s.io/kubernetes e seus submódulos de staging. O diretório hack/ do repositório de código aberto fornece um script para alternar para uma versão específica do Kubernetes:
# 1. Switch dependencies to the target Kubernetes version (for example, v1.28.0)
./hack/download-deps.sh v1.28.0
# 2. Update the vendor directory
go mod tidy && go mod vendor
# 3. Verify the build
make build
A dependência padrão atual é o Kubernetes v1.21.2. Para adaptar a outra versão, siga as etapas anteriores. Mantenha a versão da dependência de compilação consistente com a versão do cluster de destino para evitar problemas de compatibilidade de API. As imagens pré-compiladas atualmente suportam as seguintes versões community do Kubernetes: v1.28, v1.30, v1.32, v1.34 e v1.35.
3. Implantar componentes personalizados
Implante componentes personalizados da mesma forma que os componentes pré-compilados:
Implantação com um clique: o repositório do Scheduler Framework fornece o script
deploy/deploy-all.shpara implantar todos os componentes ou componentes individuais (--components=<name>). Ele também permite sobrescrever parâmetros como o endereço da imagem e o namespace.Implantação por componente: cada componente também oferece seus próprios métodos de implantação, como
make deploy, Helm charts e kustomize.Compatibilidade de versões: componentes personalizados ainda se integram ao Runtime por meio da interface gRPC, e a política de compatibilidade de versões e os requisitos de versão mínima se aplicam da mesma forma. Para detalhes, consulte 5. Compatibilidade de versões e 6. Requisitos de versão mínima para recursos.
-
Personalização no nível de configuração (sem necessidade de recompilação): os manifestos de implantação do Device Plugin, do Scheduler Framework e do Exporter contêm, cada um, um arquivo
configmap.yamlseparado. Esse arquivo externaliza constantes de protocolo, como nomes de recursos estendidos, chaves de labels de nós e chaves de annotations, em um ConfigMap. Para alterar apenas configurações como nomes de recursos sem mexer no código, edite o ConfigMap correspondente e faça a reimplantação. Não é necessário recompilar as imagens. Observação: os três componentes compartilham o mesmo conjunto de constantes de protocolo. Se as configurações estiverem inconsistentes, os componentes usarão nomes de recursos divergentes para relatórios de recursos, agendamento e monitoramento. Os Pods podem falhar no agendamento ou os dados de monitoramento podem ficar incompletos. O exemplo a seguir altera os nomes de recursos gpu-core e gpu-memory:protocol.yaml: resources.memory: "alibabacloud.com/gpu-memory.percentage" resources.core: "alibabacloud.com/gpu-core.percentage" resources.gpu: "alibabacloud.com/gpu"Essas configurações ficam nos arquivos ConfigMap de cada componente, dentro do diretório deploy da implantação com um clique do Scheduler Framework —
deploy/<component>/02-configmap.yaml. Após a edição, executekubectl apply -fpara os três componentes atualizarem seus ConfigMaps e, em seguida, reinicie os DaemonSets e o Deployment correspondentes para aplicar a nova configuração:# 1. Update the ConfigMaps of the three components kubectl apply -f deploy/deviceplugin/02-configmap.yaml kubectl apply -f deploy/exporter/02-configmap.yaml kubectl apply -f deploy/scheduler/02-configmap.yaml # 2. Restart the components to apply the new configuration kubectl rollout restart ds/lj-runtimekit-device-plugin-ds -n kube-system kubectl rollout restart ds/lj-runtimekit-exporter-ds -n kube-system kubectl rollout restart deploy/lj-runtimekit-scheduler-framework -n kube-systemAlternativamente, reimplante todos os componentes de uma vez com
deploy-all.sh deploypara obter o mesmo resultado.
Componentes personalizados são mantidos por você. Ao atualizar para uma nova baseline, integre suas alterações personalizadas na nova versão.
4. Estrutura do código-fonte e pontos de extensão dos componentes
4.1 Device Plugin
Estrutura do código-fonte:
|
Diretório ou arquivo |
Responsabilidade |
|
|
Ponto de entrada do programa; inicializa a conexão gRPC e registra o plugin |
|
|
Lógica principal do Device Plugin (encaminhamento de ListAndWatch e Allocate) |
|
|
Definições de proto e wrapper do cliente gRPC |
|
|
Definições de constantes, como caminhos de socket e nomes de recursos |
Pontos de extensão:
Nomes de recursos personalizados: substitua o nome do recurso estendido padrão, como
aliyun.com/gpu-core, no arquivo de configuração para manter os nomes de recursos separados entre clusters ou seguir as convenções de nomenclatura existentes. Após a alteração, atualize as configurações do Device Plugin, do Scheduler Framework e do Exporter ao mesmo tempo para manter a consistência dos nomes de recursos.Granularidade de particionamento de memória GPU: o padrão é 1 GiB. Ajuste com o parâmetro de inicialização
--memory-unitpara adequar a GPUs com diferentes tamanhos de memória.
4.2 Scheduler Framework
Estrutura do código-fonte:
|
Diretório ou arquivo |
Responsabilidade |
|
|
Ponto de entrada do programa; registra os plugins de agendamento |
|
|
StandardPlugin: agendamento por divisão de tempo (Filter/Score/Reserve/Bind) |
|
|
MigPlugin: particionamento espacial para Multi-Instance GPU (MIG) |
|
|
Definições de constantes, como nomes de políticas de agendamento e labels de recursos |
|
|
Estrutura do registro de recursos GPU do nó |
|
|
Helm chart (values.yaml contém a configuração do scheduler) |
Pontos de extensão:
Extensão de plugins de agendamento: o diretório
pkg/forneceStandardPlugin(agendamento por divisão de tempo) eMigPlugin(particionamento espacial MIG). Ambos implementam os pontos de extensão Filter, Score, Reserve e Bind do Scheduler Framework. Você pode estendê-los com políticas de pontuação personalizadas ou restrições de afinidade.Extensão de modelagem de recursos: na inicialização, o scheduler usa informers para observar Nodes, Pods e relatórios do Device Plugin, e mantém um registro de recursos multidimensional
gpuCount × {core, memory}para cada Node. Cada alocação é deduzida do registro atomicamente, e a exclusão de um Pod devolve os recursos ao registro por meio do fluxo de eventos. Para adicionar uma nova dimensão de recurso, estenda a estrutura do registro.
4.3 Exporter
Estrutura do código-fonte:
|
Diretório ou arquivo |
Responsabilidade |
|
|
Ponto de entrada do programa |
|
|
Lógica de coleta do cliente gRPC (chama as interfaces do Lingjun Runtime Kit para obter métricas) |
|
|
Converte métricas para o formato Prometheus e as expõe por HTTP |
|
|
Lógica de verificação de integridade |
|
|
Templates de implantação do Helm chart |
|
|
Templates de arquivos de configuração |
Pontos de extensão:
Métricas personalizadas: adicione nova lógica de coleta de métricas em
pkg/collector/. Obtenha dados brutos pela interface gRPCExporterGetDataListe converta os dados em métricas Prometheus.
4.4 Controller (controle de chaveamento)
Estrutura do código-fonte:
Controller/
├── cmd/
│ ├── controller/main.go # Controller main program (Kubebuilder framework)
│ └── job-agent/main.go # Job Agent (executes enable/disable on nodes)
├── internal/controller/
│ ├── node_controller.go # Watches Node label changes and creates Jobs
│ └── job_controller.go # Automatically cleans up successful Jobs
├── api/proto/
│ └── config_service.proto # gRPC interface definitions
├── pkg/configpb/ # Generated Go gRPC code
└── config/manager/ # Deployment configuration
Pontos de extensão:
Modifique
node_controller.gopara personalizar a lógica de observação de labels ou a condição de gatilho (o padrão é observarlj_runtimekit_enable=true).Modifique
job-agent/main.gopara personalizar as operações realizadas nos nós.Modifique
config_service.protopara estender o protocolo de comunicação com o config-daemon do nó (para detalhes da interface, consulte Referência da API gRPC).
5. Limites de personalização e considerações
A interface gRPC é o único limite de integração. Desde que você não altere as partes que interagem com o Lingjun Runtime Kit, não precisa lidar com detalhes de proto. Sua personalização fica dentro das políticas do próprio componente, como agendamento, monitoramento, orquestração e armazenamento. Se precisar modificar ou reimplementar a interação com o Runtime, use Referência da API gRPC como base de protocolo e siga sua política de compatibilidade.
Consistência de nomes de recursos: ao personalizar um prefixo de nome de recurso, atualize os componentes Device Plugin, Scheduler Framework e Exporter ao mesmo tempo. Caso contrário, os relatórios de recursos e o agendamento não corresponderão. Para alterações simples que afetam apenas a configuração, edite o ConfigMap de protocolo no manifesto de implantação de cada componente para atualizar os três componentes de uma vez (consulte a seção 3). Não é necessário recompilar. Se a alteração envolver lógica de código, modifique as definições de constantes no código-fonte e recompile as imagens.
A compatibilidade de versões também se aplica: componentes personalizados e o Runtime continuam seguindo a política de interface "aditiva e compatível com versões anteriores", e os requisitos de versão mínima para recursos também se aplicam a implementações personalizadas (para detalhes, consulte 5. Compatibilidade de versões e 6. Requisitos de versão mínima para recursos).
Responsabilidade de manutenção: você é responsável por manter os componentes personalizados. Quando uma nova baseline for lançada, integre suas alterações personalizadas na nova versão. Para detalhes sobre responsabilidade por problemas e canais de suporte, consulte Guia de implantação e lançamento.