@highstate/k3s 0.9.14 → 0.9.16
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,26 +1,13 @@
|
|
|
1
|
+
import { parseL3Endpoint, l3EndpointToString, l3ToL4Endpoint, l4EndpointToString, Command, filterEndpoints } from '@highstate/common';
|
|
2
|
+
import { k3s } from '@highstate/library';
|
|
3
|
+
import { forUnit, toPromise, output, interpolate, secret, fileFromString } from '@highstate/pulumi';
|
|
4
|
+
import { KubeConfig } from '@kubernetes/client-node';
|
|
5
|
+
import { Provider, core } from '@pulumi/kubernetes';
|
|
6
|
+
import '@highstate/k8s';
|
|
7
|
+
import '@highstate/contract';
|
|
8
|
+
import { uniqueBy, isIncludedIn } from 'remeda';
|
|
9
|
+
|
|
1
10
|
// src/cluster/index.ts
|
|
2
|
-
import {
|
|
3
|
-
Command,
|
|
4
|
-
filterEndpoints,
|
|
5
|
-
l3EndpointToString,
|
|
6
|
-
l3ToL4Endpoint,
|
|
7
|
-
l4EndpointToString,
|
|
8
|
-
parseL3Endpoint
|
|
9
|
-
} from "@highstate/common";
|
|
10
|
-
import { k3s } from "@highstate/library";
|
|
11
|
-
import {
|
|
12
|
-
fileFromString,
|
|
13
|
-
forUnit,
|
|
14
|
-
interpolate,
|
|
15
|
-
output,
|
|
16
|
-
secret,
|
|
17
|
-
toPromise
|
|
18
|
-
} from "@highstate/pulumi";
|
|
19
|
-
import { KubeConfig } from "@kubernetes/client-node";
|
|
20
|
-
import { core, Provider } from "@pulumi/kubernetes";
|
|
21
|
-
import { createK8sTerminal } from "@highstate/k8s";
|
|
22
|
-
import { text } from "@highstate/contract";
|
|
23
|
-
import { uniqueBy, isIncludedIn } from "remeda";
|
|
24
11
|
var { name, args, inputs, outputs } = forUnit(k3s.cluster);
|
|
25
12
|
var { masters, workers } = await toPromise(inputs);
|
|
26
13
|
var seed = masters[0];
|
|
@@ -102,7 +89,7 @@ function createNode(server, type, env, dependsOn) {
|
|
|
102
89
|
dependsOn: [
|
|
103
90
|
configFileCommand.command,
|
|
104
91
|
registryConfigFileCommand.command,
|
|
105
|
-
...
|
|
92
|
+
...[]
|
|
106
93
|
]
|
|
107
94
|
}
|
|
108
95
|
);
|
|
@@ -124,7 +111,7 @@ var kubeConfig = new KubeConfig();
|
|
|
124
111
|
kubeConfig.loadFromString(kubeconfig);
|
|
125
112
|
var provider = new Provider(name, { kubeconfig: secret(kubeconfig) });
|
|
126
113
|
var kubeSystem = core.v1.Namespace.get("kube-system", "kube-system", { provider });
|
|
127
|
-
|
|
114
|
+
fileFromString("config", kubeconfig, "text/yaml", true);
|
|
128
115
|
var cluster_default = outputs({
|
|
129
116
|
k8sCluster: {
|
|
130
117
|
id: kubeSystem.metadata.uid,
|
|
@@ -134,49 +121,47 @@ var cluster_default = outputs({
|
|
|
134
121
|
endpoints,
|
|
135
122
|
apiEndpoints,
|
|
136
123
|
quirks: {
|
|
137
|
-
externalServiceType: "LoadBalancer"
|
|
124
|
+
externalServiceType: args.disabledComponents.includes("servicelb") ? "NodePort" : "LoadBalancer"
|
|
138
125
|
},
|
|
139
126
|
kubeconfig: secret(kubeconfig)
|
|
140
127
|
},
|
|
141
128
|
endpoints,
|
|
142
129
|
apiEndpoints,
|
|
143
|
-
$terminals: [createK8sTerminal(kubeconfig)],
|
|
144
|
-
$
|
|
130
|
+
// $terminals: [createK8sTerminal(kubeconfig)],
|
|
131
|
+
$statusFields: {
|
|
145
132
|
endpoints: endpoints.map(l3EndpointToString),
|
|
146
133
|
apiEndpoints: apiEndpoints.map(l4EndpointToString)
|
|
147
|
-
}
|
|
148
|
-
$pages: {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
},
|
|
177
|
-
$files: [kubeconfigFile]
|
|
134
|
+
}
|
|
135
|
+
// $pages: {
|
|
136
|
+
// index: {
|
|
137
|
+
// title: "K3s Cluster",
|
|
138
|
+
// content: [
|
|
139
|
+
// {
|
|
140
|
+
// type: "markdown",
|
|
141
|
+
// content: text`
|
|
142
|
+
// The cluster is up and running.
|
|
143
|
+
// You can access the cluster via the terminal or by using the kubeconfig file.
|
|
144
|
+
// `,
|
|
145
|
+
// },
|
|
146
|
+
// {
|
|
147
|
+
// type: "file",
|
|
148
|
+
// meta: kubeconfigFile.meta,
|
|
149
|
+
// },
|
|
150
|
+
// {
|
|
151
|
+
// type: "markdown",
|
|
152
|
+
// content: secret(text`
|
|
153
|
+
// You can also copy the following content of the kubeconfig file and use it to access the cluster:
|
|
154
|
+
// \`\`\`yaml
|
|
155
|
+
// ${kubeconfig}
|
|
156
|
+
// \`\`\`
|
|
157
|
+
// `),
|
|
158
|
+
// },
|
|
159
|
+
// ],
|
|
160
|
+
// },
|
|
161
|
+
// },
|
|
162
|
+
// $files: [kubeconfigFile],
|
|
178
163
|
});
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
164
|
+
|
|
165
|
+
export { cluster_default as default };
|
|
166
|
+
//# sourceMappingURL=index.js.map
|
|
182
167
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cluster/index.ts"],"sourcesContent":["import {\n Command,\n filterEndpoints,\n l3EndpointToString,\n l3ToL4Endpoint,\n l4EndpointToString,\n parseL3Endpoint,\n} from \"@highstate/common\"\nimport { common, k3s } from \"@highstate/library\"\nimport {\n fileFromString,\n forUnit,\n interpolate,\n output,\n Resource,\n secret,\n toPromise,\n type InputMap,\n} from \"@highstate/pulumi\"\nimport { KubeConfig } from \"@kubernetes/client-node\"\nimport { core, Provider } from \"@pulumi/kubernetes\"\nimport { createK8sTerminal } from \"@highstate/k8s\"\nimport { text } from \"@highstate/contract\"\nimport { uniqueBy, isIncludedIn } 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 => l3ToL4Endpoint(endpoint, 6443))),\n l4EndpointToString,\n)\n\nconst config: Record<string, unknown> = {\n ...args.config,\n \"tls-san\": apiEndpoints.map(l4EndpointToString),\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: InputMap<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 -sfL https://raw.githubusercontent.com/k3s-io/k3s/refs/heads/master/install.sh | ${envString} sh -s - ${type}`,\n delete: \"/usr/local/bin/k3s-uninstall.sh\",\n },\n {\n dependsOn: [\n configFileCommand.command,\n registryConfigFileCommand.command,\n ...(dependsOn ? [dependsOn] : []),\n ],\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 kubeconfigFile = fileFromString(\"config\", kubeconfig, \"text/yaml\", true)\n\nexport default outputs({\n k8sCluster: {\n id: kubeSystem.metadata.uid,\n name,\n cni: \"other\",\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: \"LoadBalancer\",\n },\n\n kubeconfig: secret(kubeconfig),\n },\n\n endpoints,\n apiEndpoints,\n\n $terminals: [createK8sTerminal(kubeconfig)],\n\n $status: {\n endpoints: endpoints.map(l3EndpointToString),\n apiEndpoints: apiEndpoints.map(l4EndpointToString),\n },\n\n $pages: {\n index: {\n title: \"K3s Cluster\",\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 fileMeta: kubeconfigFile.meta,\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 $files: [kubeconfigFile],\n})\n"],"mappings":"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","names":["env","kubeconfig"]}
|
|
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 l3EndpointToString,\n l3ToL4Endpoint,\n l4EndpointToString,\n parseL3Endpoint,\n} from \"@highstate/common\"\nimport { common, k3s } from \"@highstate/library\"\nimport {\n fileFromString,\n forUnit,\n interpolate,\n output,\n Resource,\n secret,\n toPromise,\n type InputMap,\n} from \"@highstate/pulumi\"\nimport { KubeConfig } from \"@kubernetes/client-node\"\nimport { core, Provider } from \"@pulumi/kubernetes\"\nimport { createK8sTerminal } from \"@highstate/k8s\"\nimport { text } from \"@highstate/contract\"\nimport { uniqueBy, isIncludedIn } 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 => l3ToL4Endpoint(endpoint, 6443))),\n l4EndpointToString,\n)\n\nconst config: Record<string, unknown> = {\n ...args.config,\n \"tls-san\": apiEndpoints.map(l4EndpointToString),\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: InputMap<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 -sfL https://raw.githubusercontent.com/k3s-io/k3s/refs/heads/master/install.sh | ${envString} sh -s - ${type}`,\n delete: \"/usr/local/bin/k3s-uninstall.sh\",\n },\n {\n dependsOn: [\n configFileCommand.command,\n registryConfigFileCommand.command,\n ...(dependsOn ? [dependsOn] : []),\n ],\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 kubeconfigFile = fileFromString(\"config\", kubeconfig, \"text/yaml\", true)\n\nexport default outputs({\n k8sCluster: {\n id: kubeSystem.metadata.uid,\n name,\n cni: \"other\",\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 // title: \"K3s Cluster\",\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 // meta: kubeconfigFile.meta,\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 // $files: [kubeconfigFile],\n})\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@highstate/k3s",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.16",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -15,18 +15,18 @@
|
|
|
15
15
|
"build": "highstate build"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@highstate/common": "^0.9.
|
|
19
|
-
"@highstate/contract": "^0.9.
|
|
20
|
-
"@highstate/k8s": "^0.9.
|
|
21
|
-
"@highstate/library": "^0.9.
|
|
22
|
-
"@highstate/pulumi": "^0.9.
|
|
18
|
+
"@highstate/common": "^0.9.16",
|
|
19
|
+
"@highstate/contract": "^0.9.16",
|
|
20
|
+
"@highstate/k8s": "^0.9.16",
|
|
21
|
+
"@highstate/library": "^0.9.16",
|
|
22
|
+
"@highstate/pulumi": "^0.9.16",
|
|
23
23
|
"@kubernetes/client-node": "^1.1.0",
|
|
24
24
|
"@pulumi/command": "^1.0.2",
|
|
25
25
|
"@pulumi/kubernetes": "^4.18.0",
|
|
26
26
|
"remeda": "^2.21.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@highstate/cli": "^0.9.
|
|
29
|
+
"@highstate/cli": "^0.9.16"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "458d6f1f9f6d4aec0ba75a2b2c4c01408cb9c8df"
|
|
32
32
|
}
|