@highstate/k3s 0.18.0 → 0.20.0
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
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { l3EndpointToString, l3EndpointToL4, l4EndpointToString, Command } from '@highstate/common';
|
|
2
2
|
import { text } from '@highstate/contract';
|
|
3
3
|
import { createK8sTerminal } from '@highstate/k8s';
|
|
4
|
-
import { k3s } from '@highstate/library';
|
|
5
|
-
import { forUnit, toPromise, output, interpolate, secret,
|
|
4
|
+
import { k3s, k8s, common } from '@highstate/library';
|
|
5
|
+
import { forUnit, toPromise, output, interpolate, secret, makeEntityOutput, makeFileOutput } from '@highstate/pulumi';
|
|
6
6
|
import { KubeConfig } from '@kubernetes/client-node';
|
|
7
7
|
import { Provider, core } from '@pulumi/kubernetes';
|
|
8
|
-
import { uniqueBy, isIncludedIn } from 'remeda';
|
|
8
|
+
import { uniqueBy, isIncludedIn, mergeDeep } from 'remeda';
|
|
9
9
|
|
|
10
10
|
// src/cluster/index.ts
|
|
11
11
|
var { name, args, inputs, outputs } = forUnit(k3s.cluster);
|
|
@@ -40,8 +40,6 @@ for (const disabledComponent of args.disabledComponents) {
|
|
|
40
40
|
if (args.cni === "none") {
|
|
41
41
|
serverConfig["flannel-backend"] = "none";
|
|
42
42
|
}
|
|
43
|
-
var serverConfigContent = JSON.stringify(serverConfig, null, 2);
|
|
44
|
-
var agentConfigContent = JSON.stringify(agentConfig, null, 2);
|
|
45
43
|
var seedInstallCommand = createNode(seed, "server", { K3S_CLUSTER_INIT: "true" });
|
|
46
44
|
var tokenCommand = Command.receiveTextFile(
|
|
47
45
|
"token",
|
|
@@ -62,20 +60,25 @@ var agentTokenCommand = Command.receiveTextFile(
|
|
|
62
60
|
for (const master of masters.slice(1)) {
|
|
63
61
|
createNode(master, "server", {
|
|
64
62
|
K3S_TOKEN: tokenCommand.stdout,
|
|
63
|
+
INSTALL_K3S_EXEC: `--node-ip=${l3EndpointToString(master.endpoints[0])}`,
|
|
65
64
|
K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`
|
|
66
65
|
});
|
|
67
66
|
}
|
|
68
67
|
for (const worker of workers) {
|
|
69
68
|
createNode(worker, "agent", {
|
|
70
69
|
K3S_TOKEN: agentTokenCommand.stdout,
|
|
70
|
+
INSTALL_K3S_EXEC: `--node-ip=${l3EndpointToString(worker.endpoints[0])}`,
|
|
71
71
|
K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
|
-
function createNode(server, type, env
|
|
74
|
+
function createNode(server, type, env) {
|
|
75
|
+
const baseConfig = type === "server" ? serverConfig : agentConfig;
|
|
76
|
+
const nodeSpecificConfig = args.nodeConfig?.[server.hostname] ?? {};
|
|
77
|
+
const mergedConfig = mergeDeep(baseConfig, nodeSpecificConfig);
|
|
75
78
|
const configFileCommand = Command.createTextFile(`config-${server.hostname}`, {
|
|
76
79
|
host: server,
|
|
77
80
|
path: "/etc/rancher/k3s/config.yaml",
|
|
78
|
-
content:
|
|
81
|
+
content: JSON.stringify(mergedConfig, null, 2)
|
|
79
82
|
});
|
|
80
83
|
const registryConfigFileCommand = Command.createTextFile(`registry-config-${server.hostname}`, {
|
|
81
84
|
host: server,
|
|
@@ -93,7 +96,7 @@ function createNode(server, type, env, dependsOn) {
|
|
|
93
96
|
delete: "/usr/local/bin/k3s-uninstall.sh || true"
|
|
94
97
|
},
|
|
95
98
|
{
|
|
96
|
-
dependsOn: [configFileCommand, registryConfigFileCommand
|
|
99
|
+
dependsOn: [configFileCommand, registryConfigFileCommand]
|
|
97
100
|
}
|
|
98
101
|
);
|
|
99
102
|
}
|
|
@@ -114,8 +117,13 @@ var kubeConfig = new KubeConfig();
|
|
|
114
117
|
kubeConfig.loadFromString(kubeconfig);
|
|
115
118
|
var provider = new Provider(name, { kubeconfig: secret(kubeconfig) });
|
|
116
119
|
var kubeSystem = core.v1.Namespace.get("kube-system", "kube-system", { provider });
|
|
117
|
-
var
|
|
118
|
-
|
|
120
|
+
var k8sCluster = makeEntityOutput({
|
|
121
|
+
entity: k8s.clusterEntity,
|
|
122
|
+
identity: kubeSystem.metadata.uid,
|
|
123
|
+
meta: {
|
|
124
|
+
title: name
|
|
125
|
+
},
|
|
126
|
+
value: {
|
|
119
127
|
id: kubeSystem.metadata.uid,
|
|
120
128
|
connectionId: kubeSystem.metadata.uid,
|
|
121
129
|
name,
|
|
@@ -125,8 +133,28 @@ var cluster_default = outputs({
|
|
|
125
133
|
quirks: {
|
|
126
134
|
externalServiceType: args.disabledComponents.includes("servicelb") ? "NodePort" : "LoadBalancer"
|
|
127
135
|
},
|
|
128
|
-
kubeconfig:
|
|
129
|
-
|
|
136
|
+
kubeconfig: makeEntityOutput({
|
|
137
|
+
entity: common.fileEntity,
|
|
138
|
+
identity: interpolate`${kubeSystem.metadata.uid}:kubeconfig`,
|
|
139
|
+
meta: {
|
|
140
|
+
title: "kubeconfig"
|
|
141
|
+
},
|
|
142
|
+
value: {
|
|
143
|
+
meta: {
|
|
144
|
+
name: "kubeconfig",
|
|
145
|
+
mode: 384,
|
|
146
|
+
contentType: "text/yaml"
|
|
147
|
+
},
|
|
148
|
+
content: {
|
|
149
|
+
type: "embedded-secret",
|
|
150
|
+
value: kubeconfig
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
})
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
var cluster_default = outputs({
|
|
157
|
+
k8sCluster,
|
|
130
158
|
$terminals: [createK8sTerminal(kubeconfig)],
|
|
131
159
|
$statusFields: {
|
|
132
160
|
endpoints: endpoints.map(l3EndpointToString),
|
|
@@ -148,7 +176,9 @@ var cluster_default = outputs({
|
|
|
148
176
|
},
|
|
149
177
|
{
|
|
150
178
|
type: "file",
|
|
151
|
-
file:
|
|
179
|
+
file: makeFileOutput({
|
|
180
|
+
name: "kubeconfig",
|
|
181
|
+
content: kubeconfig,
|
|
152
182
|
contentType: "text/yaml",
|
|
153
183
|
isSecret: true
|
|
154
184
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cluster/index.ts"],"names":["env","kubeconfig"],"mappings":"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","file":"index.js","sourcesContent":["import { Command, l3EndpointToL4, l3EndpointToString, l4EndpointToString } 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 => server.endpoints),\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\nexport default outputs({\n k8sCluster: {\n id: kubeSystem.metadata.uid,\n connectionId: kubeSystem.metadata.uid,\n name,\n\n externalIps: endpoints\n .filter(endpoint => endpoint.type !== \"hostname\")\n .map(endpoint => endpoint.address),\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 $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 { Command, l3EndpointToL4, l3EndpointToString, l4EndpointToString } from \"@highstate/common\"\nimport { text } from \"@highstate/contract\"\nimport { createK8sTerminal } from \"@highstate/k8s\"\nimport { common, k3s, k8s } from \"@highstate/library\"\nimport {\n forUnit,\n type InputRecord,\n interpolate,\n makeEntityOutput,\n makeFileOutput,\n output,\n secret,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { KubeConfig } from \"@kubernetes/client-node\"\nimport { core, Provider } from \"@pulumi/kubernetes\"\nimport { isIncludedIn, mergeDeep, 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 => server.endpoints),\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 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 INSTALL_K3S_EXEC: `--node-ip=${l3EndpointToString(master.endpoints[0])}`,\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 INSTALL_K3S_EXEC: `--node-ip=${l3EndpointToString(worker.endpoints[0])}`,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfunction createNode(server: common.Server, type: \"server\" | \"agent\", env: InputRecord<string>) {\n const baseConfig = type === \"server\" ? serverConfig : agentConfig\n const nodeSpecificConfig = args.nodeConfig?.[server.hostname] ?? {}\n\n const mergedConfig = mergeDeep(baseConfig, nodeSpecificConfig)\n\n const configFileCommand = Command.createTextFile(`config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/config.yaml\",\n content: JSON.stringify(mergedConfig, null, 2),\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],\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\nconst k8sCluster = makeEntityOutput({\n entity: k8s.clusterEntity,\n identity: kubeSystem.metadata.uid,\n meta: {\n title: name,\n },\n value: {\n id: kubeSystem.metadata.uid,\n connectionId: kubeSystem.metadata.uid,\n name,\n\n externalIps: endpoints\n .filter(endpoint => endpoint.type !== \"hostname\")\n .map(endpoint => endpoint.address),\n\n endpoints,\n apiEndpoints,\n\n quirks: {\n externalServiceType: args.disabledComponents.includes(\"servicelb\")\n ? \"NodePort\"\n : \"LoadBalancer\",\n },\n\n kubeconfig: makeEntityOutput({\n entity: common.fileEntity,\n identity: interpolate`${kubeSystem.metadata.uid}:kubeconfig`,\n meta: {\n title: \"kubeconfig\",\n },\n value: {\n meta: {\n name: \"kubeconfig\",\n mode: 0o600,\n contentType: \"text/yaml\",\n },\n content: {\n type: \"embedded-secret\",\n value: kubeconfig,\n },\n },\n }),\n },\n})\n\nexport default outputs({\n k8sCluster,\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: makeFileOutput({\n name: \"kubeconfig\",\n content: 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@highstate/k3s",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -21,16 +21,16 @@
|
|
|
21
21
|
"@pulumi/command": "^1.0.2",
|
|
22
22
|
"@pulumi/kubernetes": "^4.18.0",
|
|
23
23
|
"remeda": "^2.21.0",
|
|
24
|
-
"@highstate/common": "0.
|
|
25
|
-
"@highstate/
|
|
26
|
-
"@highstate/
|
|
27
|
-
"@highstate/library": "0.
|
|
28
|
-
"@highstate/pulumi": "0.
|
|
24
|
+
"@highstate/common": "0.20.0",
|
|
25
|
+
"@highstate/k8s": "0.20.0",
|
|
26
|
+
"@highstate/contract": "0.20.0",
|
|
27
|
+
"@highstate/library": "0.20.0",
|
|
28
|
+
"@highstate/pulumi": "0.20.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@biomejs/biome": "2.2.0",
|
|
32
32
|
"@typescript/native-preview": "^7.0.0-dev.20250920.1",
|
|
33
|
-
"@highstate/cli": "0.
|
|
33
|
+
"@highstate/cli": "0.20.0"
|
|
34
34
|
},
|
|
35
35
|
"repository": {
|
|
36
36
|
"url": "https://github.com/highstate-io/highstate"
|