Могу ли я развернуть код YAML как файл без файла YAML в Kubernetes

#node.js #kubernetes #yaml #kubectl

#node.js #kubernetes #yaml #kubectl

Вопрос:

Можно легко развернуть файл YAML в Kubernetes либо с помощью kubectl apply , либо с помощью helm install для развертывания всего файла YAML сразу, но я ищу способ, с помощью которого я мог бы развернуть файлы YAML без фактического создания файлов и развернуть его непосредственно через код NodeJS

Что я делаю прямо сейчас:

Я могу развернуть файлы YAML, которые создаются моим кодом NodeJS, который сначала создает объект JSON, анализирует его в YAML, а затем генерирует свой файл YAML, и тот же код способен развернуть эти файлы.

Что мне нужно:

Я хочу иметь возможность развертывать код YAML напрямую, не создавая его файл YAML.

Ответ №1:

Для применения из командной строки используйте:

node-js-generate-yaml-command | kubectl apply -f -

или прямо из кода использовать javascript-клиент kubectl https://github.com/kubernetes-client/javascript

Пример kubectl apply можно найти здесь https://github.com/kubernetes-client/javascript/blob/master/examples/typescript/apply/apply-example.ts

 import * as k8s from '@kubernetes/client-node';
import * as fs from 'fs';
import * as yaml from 'js-yaml';
import { promisify } from 'util';

/**
 * Replicate the functionality of `kubectl apply`.  That is, create the resources defined in the `specFile` if they do
 * not exist, patch them if they do exist.
 *
 * @param specPath File system path to a YAML Kubernetes spec.
 * @return Array of resources created
 */
export async function apply(specPath: string): Promise<k8s.KubernetesObject[]> {
    const kc = new k8s.KubeConfig();
    kc.loadFromDefault();
    const client = k8s.KubernetesObjectApi.makeApiClient(kc);
    const fsReadFileP = promisify(fs.readFile);
    const specString = await fsReadFileP(specPath, 'utf8');
    const specs: k8s.KubernetesObject[] = yaml.safeLoadAll(specString);
    const validSpecs = specs.filter((s) => s amp;amp; s.kind amp;amp; s.metadata);
    const created: k8s.KubernetesObject[] = [];
    for (const spec of validSpecs) {
        // this is to convince the old version of TypeScript that metadata exists even though we already filtered specs
        // without metadata out
        spec.metadata = spec.metadata || {};
        spec.metadata.annotations = spec.metadata.annotations || {};
        delete spec.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration'];
        spec.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration'] = JSON.stringify(spec);
        try {
            // try to get the resource, if it does not exist an error will be thrown and we will end up in the catch
            // block.
            await client.read(spec);
            // we got the resource, so it exists, so patch it
            const response = await client.patch(spec);
            created.push(response.body);
        } catch (e) {
            // we did not get the resource, so it does not exist, so create it
            const response = await client.create(spec);
            created.push(response.body);
        }
    }
    return created;
}
  

Комментарии:

1. Есть идеи, как я могу читать, исправлять и создавать в / из пространства имен?

2. Часть чтения и создания работает, но при исправлении я получаю the body of the request was in an unknown format - accepted media types include: application/json-patch json, application/merge-patch json, application/apply-patch yaml

3. Попробуйте найти подходящий клиент для вашей версии дистрибутива Kubernetes. Понятия не имею. Я пытаюсь обновить клиент Kubernetes.