Todos os produtos
Search
Central de documentação

Intelligent Computing LINGJUN:Personalizar componentes de código aberto

Última atualização: Oct 10, 2026

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.

Nota

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

LJ-RuntimeKit-Device-Plugin

Personalização de nomes de recursos, granularidade de particionamento de memória GPU

Scheduler Framework

LJ-RuntimeKit-Scheduler-Framework

Políticas de pontuação de agendamento, modelagem de recursos, adaptação para versões do Kubernetes

Exporter

LJ-RuntimeKit-Exporter

Métricas personalizadas

Controller (controle de chaveamento)

Diretório do componente Controller

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:

  1. Implantação com um clique: o repositório do Scheduler Framework fornece o script deploy/deploy-all.sh para 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.

  2. Implantação por componente: cada componente também oferece seus próprios métodos de implantação, como make deploy, Helm charts e kustomize.

  3. 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.

  4. 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.yaml separado. 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, execute kubectl apply -f para 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-system

    Alternativamente, reimplante todos os componentes de uma vez com deploy-all.sh deploy para 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

cmd/main.go

Ponto de entrada do programa; inicializa a conexão gRPC e registra o plugin

internal/plugin/

Lógica principal do Device Plugin (encaminhamento de ListAndWatch e Allocate)

internal/grpc/

Definições de proto e wrapper do cliente gRPC

internal/utils/

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-unit para adequar a GPUs com diferentes tamanhos de memória.

4.2 Scheduler Framework

Estrutura do código-fonte:

Diretório ou arquivo

Responsabilidade

cmd/scheduler/main.go

Ponto de entrada do programa; registra os plugins de agendamento

pkg/standard/

StandardPlugin: agendamento por divisão de tempo (Filter/Score/Reserve/Bind)

pkg/mig/

MigPlugin: particionamento espacial para Multi-Instance GPU (MIG)

pkg/utils/

Definições de constantes, como nomes de políticas de agendamento e labels de recursos

pkg/utils/noderesource.go

Estrutura do registro de recursos GPU do nó

helm/

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/ fornece StandardPlugin (agendamento por divisão de tempo) e MigPlugin (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

cmd/exporter/main.go

Ponto de entrada do programa

pkg/collector/

Lógica de coleta do cliente gRPC (chama as interfaces do Lingjun Runtime Kit para obter métricas)

pkg/exporter/

Converte métricas para o formato Prometheus e as expõe por HTTP

pkg/detector/

Lógica de verificação de integridade

deployment/

Templates de implantação do Helm chart

etc/

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 gRPC ExporterGetDataList e 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.go para personalizar a lógica de observação de labels ou a condição de gatilho (o padrão é observar lj_runtimekit_enable=true).

  • Modifique job-agent/main.go para personalizar as operações realizadas nos nós.

  • Modifique config_service.proto para 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

  1. 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.

  2. 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.

  3. 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).

  4. 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.