@highstate/k3s 0.11.7 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cluster/index.js
CHANGED
|
@@ -21,20 +21,29 @@ var apiEndpoints = uniqueBy(
|
|
|
21
21
|
masters.flatMap((server) => server.endpoints.map((endpoint) => l3EndpointToL4(endpoint, 6443))),
|
|
22
22
|
l4EndpointToString
|
|
23
23
|
);
|
|
24
|
-
var
|
|
25
|
-
...args.config
|
|
24
|
+
var sharedConfig = {
|
|
25
|
+
...args.config
|
|
26
|
+
};
|
|
27
|
+
var serverConfig = {
|
|
28
|
+
...sharedConfig,
|
|
29
|
+
...args.serverConfig,
|
|
26
30
|
"tls-san": apiEndpoints.map(l3EndpointToString),
|
|
27
31
|
disable: args.disabledComponents.filter(isIncludedIn(k3s.packagedComponents))
|
|
28
32
|
};
|
|
33
|
+
var agentConfig = {
|
|
34
|
+
...sharedConfig,
|
|
35
|
+
...args.agentConfig
|
|
36
|
+
};
|
|
29
37
|
for (const disabledComponent of args.disabledComponents) {
|
|
30
38
|
if (isIncludedIn(disabledComponent, k3s.internalComponents)) {
|
|
31
|
-
|
|
39
|
+
serverConfig[`disable-${disabledComponent}`] = true;
|
|
32
40
|
}
|
|
33
41
|
}
|
|
34
42
|
if (args.cni === "none") {
|
|
35
|
-
|
|
43
|
+
serverConfig["flannel-backend"] = "none";
|
|
36
44
|
}
|
|
37
|
-
var
|
|
45
|
+
var serverConfigContent = JSON.stringify(serverConfig, null, 2);
|
|
46
|
+
var agentConfigContent = JSON.stringify(agentConfig, null, 2);
|
|
38
47
|
var seedInstallCommand = createNode(seed, "server", { K3S_CLUSTER_INIT: "true" });
|
|
39
48
|
var tokenCommand = Command.receiveTextFile(
|
|
40
49
|
"token",
|
|
@@ -68,7 +77,7 @@ function createNode(server, type, env, dependsOn) {
|
|
|
68
77
|
const configFileCommand = Command.createTextFile(`config-${server.hostname}`, {
|
|
69
78
|
host: server,
|
|
70
79
|
path: "/etc/rancher/k3s/config.yaml",
|
|
71
|
-
content:
|
|
80
|
+
content: type === "server" ? serverConfigContent : agentConfigContent
|
|
72
81
|
});
|
|
73
82
|
const registryConfigFileCommand = Command.createTextFile(`registry-config-${server.hostname}`, {
|
|
74
83
|
host: server,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cluster/index.ts"],"names":["env","kubeconfig"],"mappings":"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","file":"index.js","sourcesContent":["import {\n Command,\n filterEndpoints,\n l3EndpointToL4,\n l3EndpointToString,\n l4EndpointToString,\n parseL3Endpoint,\n} from \"@highstate/common\"\nimport { text } from \"@highstate/contract\"\nimport { createK8sTerminal } from \"@highstate/k8s\"\nimport { type common, k3s } from \"@highstate/library\"\nimport {\n fileFromString,\n forUnit,\n type InputRecord,\n interpolate,\n output,\n type Resource,\n secret,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { KubeConfig } from \"@kubernetes/client-node\"\nimport { core, Provider } from \"@pulumi/kubernetes\"\nimport { isIncludedIn, uniqueBy } from \"remeda\"\n\nconst { name, args, inputs, outputs } = forUnit(k3s.cluster)\n\nconst { masters, workers } = await toPromise(inputs)\n\nconst seed = masters[0]\n\nconst endpoints = uniqueBy(\n [...workers, ...masters].flatMap(server =>\n server.endpoints.map(endpoint => parseL3Endpoint(endpoint)),\n ),\n l3EndpointToString,\n)\n\nconst apiEndpoints = uniqueBy(\n masters.flatMap(server => server.endpoints.map(endpoint => l3EndpointToL4(endpoint, 6443))),\n l4EndpointToString,\n)\n\nconst config: Record<string, unknown> = {\n ...args.config,\n \"tls-san\": apiEndpoints.map(l3EndpointToString),\n disable: args.disabledComponents.filter(isIncludedIn(k3s.packagedComponents)),\n}\n\nfor (const disabledComponent of args.disabledComponents) {\n if (isIncludedIn(disabledComponent, k3s.internalComponents)) {\n config[`disable-${disabledComponent}`] = true\n }\n}\n\nif (args.cni === \"none\") {\n config[\"flannel-backend\"] = \"none\"\n}\n\nconst configContent = JSON.stringify(config, null, 2)\n\nconst seedInstallCommand = createNode(seed, \"server\", { K3S_CLUSTER_INIT: \"true\" })\n\nconst tokenCommand = Command.receiveTextFile(\n \"token\",\n {\n host: seed,\n path: \"/var/lib/rancher/k3s/server/node-token\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nconst agentTokenCommand = Command.receiveTextFile(\n \"agent-token\",\n {\n host: seed,\n path: \"/var/lib/rancher/k3s/server/agent-token\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nfor (const master of masters.slice(1)) {\n createNode(master, \"server\", {\n K3S_TOKEN: tokenCommand.stdout,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfor (const worker of workers) {\n createNode(worker, \"agent\", {\n K3S_TOKEN: agentTokenCommand.stdout,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfunction createNode(\n server: common.Server,\n type: \"server\" | \"agent\",\n env: InputRecord<string>,\n dependsOn?: Resource,\n) {\n const configFileCommand = Command.createTextFile(`config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/config.yaml\",\n content: configContent,\n })\n\n const registryConfigFileCommand = Command.createTextFile(`registry-config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/registries.yaml\",\n content: JSON.stringify(args.registries ?? {}, null, 2),\n })\n\n const envString = output(env).apply(env => {\n return Object.entries(env)\n .map(([key, value]) => `${key}=${value}`)\n .join(\" \")\n })\n\n return new Command(\n `install-${server.hostname}`,\n {\n host: server,\n create: interpolate`curl -fL https://raw.githubusercontent.com/k3s-io/k3s/refs/heads/main/install.sh | ${envString} sh -s - ${type}`,\n delete: \"/usr/local/bin/k3s-uninstall.sh || true\",\n },\n {\n dependsOn: [configFileCommand, registryConfigFileCommand, ...(dependsOn ? [dependsOn] : [])],\n },\n )\n}\n\nconst kubeconfigResult = Command.receiveTextFile(\n \"kubeconfig\",\n {\n host: seed,\n path: \"/etc/rancher/k3s/k3s.yaml\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nconst kubeconfig = await toPromise(\n kubeconfigResult.stdout.apply(kubeconfig =>\n kubeconfig.replace(\"127.0.0.1:6443\", l4EndpointToString(apiEndpoints[0])),\n ),\n)\n\nconst kubeConfig = new KubeConfig()\nkubeConfig.loadFromString(kubeconfig)\n\nconst provider = new Provider(name, { kubeconfig: secret(kubeconfig) })\nconst kubeSystem = core.v1.Namespace.get(\"kube-system\", \"kube-system\", { provider })\n\n// const kubeconfigFile = fileFromString(\"config\", kubeconfig, \"text/yaml\", true)\n\nexport default outputs({\n k8sCluster: {\n id: kubeSystem.metadata.uid,\n connectionId: kubeSystem.metadata.uid,\n name,\n\n externalIps: filterEndpoints(endpoints, [\"public\", \"external\"])\n .filter(endpoint => endpoint.type !== \"hostname\")\n .map(l3EndpointToString),\n\n endpoints,\n apiEndpoints,\n\n quirks: {\n externalServiceType: args.disabledComponents.includes(\"servicelb\")\n ? \"NodePort\"\n : \"LoadBalancer\",\n },\n\n kubeconfig: secret(kubeconfig),\n },\n\n endpoints,\n apiEndpoints,\n\n $terminals: [createK8sTerminal(kubeconfig)],\n\n $statusFields: {\n endpoints: endpoints.map(l3EndpointToString),\n apiEndpoints: apiEndpoints.map(l4EndpointToString),\n },\n\n $pages: {\n index: {\n meta: {\n title: \"K3s Cluster\",\n },\n content: [\n {\n type: \"markdown\",\n content: text`\n The cluster is up and running.\n\n You can access the cluster via the terminal or by using the kubeconfig file.\n `,\n },\n {\n type: \"file\",\n file: fileFromString(\"kubeconfig\", kubeconfig, {\n contentType: \"text/yaml\",\n isSecret: true,\n }),\n },\n {\n type: \"markdown\",\n content: secret(text`\n You can also copy the following content of the kubeconfig file and use it to access the cluster:\n\n \\`\\`\\`yaml\n ${kubeconfig}\n \\`\\`\\`\n `),\n },\n ],\n },\n },\n})\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cluster/index.ts"],"names":["env","kubeconfig"],"mappings":"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","file":"index.js","sourcesContent":["import {\n Command,\n filterEndpoints,\n l3EndpointToL4,\n l3EndpointToString,\n l4EndpointToString,\n parseL3Endpoint,\n} from \"@highstate/common\"\nimport { text } from \"@highstate/contract\"\nimport { createK8sTerminal } from \"@highstate/k8s\"\nimport { type common, k3s } from \"@highstate/library\"\nimport {\n fileFromString,\n forUnit,\n type InputRecord,\n interpolate,\n output,\n type Resource,\n secret,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { KubeConfig } from \"@kubernetes/client-node\"\nimport { core, Provider } from \"@pulumi/kubernetes\"\nimport { isIncludedIn, uniqueBy } from \"remeda\"\n\nconst { name, args, inputs, outputs } = forUnit(k3s.cluster)\n\nconst { masters, workers } = await toPromise(inputs)\n\nconst seed = masters[0]\n\nconst endpoints = uniqueBy(\n [...workers, ...masters].flatMap(server =>\n server.endpoints.map(endpoint => parseL3Endpoint(endpoint)),\n ),\n l3EndpointToString,\n)\n\nconst apiEndpoints = uniqueBy(\n masters.flatMap(server => server.endpoints.map(endpoint => l3EndpointToL4(endpoint, 6443))),\n l4EndpointToString,\n)\n\nconst sharedConfig: Record<string, unknown> = {\n ...args.config,\n}\n\nconst serverConfig: Record<string, unknown> = {\n ...sharedConfig,\n ...args.serverConfig,\n \"tls-san\": apiEndpoints.map(l3EndpointToString),\n disable: args.disabledComponents.filter(isIncludedIn(k3s.packagedComponents)),\n}\n\nconst agentConfig: Record<string, unknown> = {\n ...sharedConfig,\n ...args.agentConfig,\n}\n\nfor (const disabledComponent of args.disabledComponents) {\n if (isIncludedIn(disabledComponent, k3s.internalComponents)) {\n serverConfig[`disable-${disabledComponent}`] = true\n }\n}\n\nif (args.cni === \"none\") {\n serverConfig[\"flannel-backend\"] = \"none\"\n}\n\nconst serverConfigContent = JSON.stringify(serverConfig, null, 2)\nconst agentConfigContent = JSON.stringify(agentConfig, null, 2)\n\nconst seedInstallCommand = createNode(seed, \"server\", { K3S_CLUSTER_INIT: \"true\" })\n\nconst tokenCommand = Command.receiveTextFile(\n \"token\",\n {\n host: seed,\n path: \"/var/lib/rancher/k3s/server/node-token\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nconst agentTokenCommand = Command.receiveTextFile(\n \"agent-token\",\n {\n host: seed,\n path: \"/var/lib/rancher/k3s/server/agent-token\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nfor (const master of masters.slice(1)) {\n createNode(master, \"server\", {\n K3S_TOKEN: tokenCommand.stdout,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfor (const worker of workers) {\n createNode(worker, \"agent\", {\n K3S_TOKEN: agentTokenCommand.stdout,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfunction createNode(\n server: common.Server,\n type: \"server\" | \"agent\",\n env: InputRecord<string>,\n dependsOn?: Resource,\n) {\n const configFileCommand = Command.createTextFile(`config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/config.yaml\",\n content: type === \"server\" ? serverConfigContent : agentConfigContent,\n })\n\n const registryConfigFileCommand = Command.createTextFile(`registry-config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/registries.yaml\",\n content: JSON.stringify(args.registries ?? {}, null, 2),\n })\n\n const envString = output(env).apply(env => {\n return Object.entries(env)\n .map(([key, value]) => `${key}=${value}`)\n .join(\" \")\n })\n\n return new Command(\n `install-${server.hostname}`,\n {\n host: server,\n create: interpolate`curl -fL https://raw.githubusercontent.com/k3s-io/k3s/refs/heads/main/install.sh | ${envString} sh -s - ${type}`,\n delete: \"/usr/local/bin/k3s-uninstall.sh || true\",\n },\n {\n dependsOn: [configFileCommand, registryConfigFileCommand, ...(dependsOn ? [dependsOn] : [])],\n },\n )\n}\n\nconst kubeconfigResult = Command.receiveTextFile(\n \"kubeconfig\",\n {\n host: seed,\n path: \"/etc/rancher/k3s/k3s.yaml\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nconst kubeconfig = await toPromise(\n kubeconfigResult.stdout.apply(kubeconfig =>\n kubeconfig.replace(\"127.0.0.1:6443\", l4EndpointToString(apiEndpoints[0])),\n ),\n)\n\nconst kubeConfig = new KubeConfig()\nkubeConfig.loadFromString(kubeconfig)\n\nconst provider = new Provider(name, { kubeconfig: secret(kubeconfig) })\nconst kubeSystem = core.v1.Namespace.get(\"kube-system\", \"kube-system\", { provider })\n\n// const kubeconfigFile = fileFromString(\"config\", kubeconfig, \"text/yaml\", true)\n\nexport default outputs({\n k8sCluster: {\n id: kubeSystem.metadata.uid,\n connectionId: kubeSystem.metadata.uid,\n name,\n\n externalIps: filterEndpoints(endpoints, [\"public\", \"external\"])\n .filter(endpoint => endpoint.type !== \"hostname\")\n .map(l3EndpointToString),\n\n endpoints,\n apiEndpoints,\n\n quirks: {\n externalServiceType: args.disabledComponents.includes(\"servicelb\")\n ? \"NodePort\"\n : \"LoadBalancer\",\n },\n\n kubeconfig: secret(kubeconfig),\n },\n\n endpoints,\n apiEndpoints,\n\n $terminals: [createK8sTerminal(kubeconfig)],\n\n $statusFields: {\n endpoints: endpoints.map(l3EndpointToString),\n apiEndpoints: apiEndpoints.map(l4EndpointToString),\n },\n\n $pages: {\n index: {\n meta: {\n title: \"K3s Cluster\",\n },\n content: [\n {\n type: \"markdown\",\n content: text`\n The cluster is up and running.\n\n You can access the cluster via the terminal or by using the kubeconfig file.\n `,\n },\n {\n type: \"file\",\n file: fileFromString(\"kubeconfig\", kubeconfig, {\n contentType: \"text/yaml\",\n isSecret: true,\n }),\n },\n {\n type: \"markdown\",\n content: secret(text`\n You can also copy the following content of the kubeconfig file and use it to access the cluster:\n\n \\`\\`\\`yaml\n ${kubeconfig}\n \\`\\`\\`\n `),\n },\n ],\n },\n },\n})\n"]}
|