【问题标题】:Can I deploy YAML code as file without YAML file in Kubernetes我可以在 Kubernetes 中将 YAML 代码部署为没有 YAML 文件的文件吗
【发布时间】:2020-12-07 09:05:45
【问题描述】:

通过使用kubectl apply 或使用helm install 一次部署所有 YAML 文件,可以轻松地在 Kubernetes 中部署 YAML 文件,但我正在寻找一种无需实际创建即可部署 YAML 文件的方法文件并通过nodeJS代码直接部署

我现在在做什么:

我可以部署由我的 nodeJS 代码创建的 YAML 文件,它首先创建 JSON 对象,将其解析为 YAML,然后生成其 YAML 文件,并且相同的代码能够部署这些文件。

我需要什么:

我希望能够直接部署 YAML 代码,而无需创建 YAML 文件。

【问题讨论】:

    标签: node.js kubernetes yaml kubectl


    【解决方案1】:

    从命令行应用:

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

    或直接从代码中使用 kubectl javascript 客户端 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 && s.kind && 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;
    }
    

    【讨论】:

    • 知道如何从命名空间读取、修补和创建命名空间吗?
    • 读取和创建部分有效,但在修补时我得到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
    • 尝试为您的 Kubernetes 分发版本找到合适的客户端。不知道。 Mby 尝试升级 Kubernetes 客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多