@highstate/k3s 0.9.15 → 0.9.18
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,11 @@
|
|
|
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 { uniqueBy, isIncludedIn } from 'remeda';
|
|
7
|
+
|
|
1
8
|
// 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
9
|
var { name, args, inputs, outputs } = forUnit(k3s.cluster);
|
|
25
10
|
var { masters, workers } = await toPromise(inputs);
|
|
26
11
|
var seed = masters[0];
|
|
@@ -102,7 +87,7 @@ function createNode(server, type, env, dependsOn) {
|
|
|
102
87
|
dependsOn: [
|
|
103
88
|
configFileCommand.command,
|
|
104
89
|
registryConfigFileCommand.command,
|
|
105
|
-
...
|
|
90
|
+
...[]
|
|
106
91
|
]
|
|
107
92
|
}
|
|
108
93
|
);
|
|
@@ -124,7 +109,7 @@ var kubeConfig = new KubeConfig();
|
|
|
124
109
|
kubeConfig.loadFromString(kubeconfig);
|
|
125
110
|
var provider = new Provider(name, { kubeconfig: secret(kubeconfig) });
|
|
126
111
|
var kubeSystem = core.v1.Namespace.get("kube-system", "kube-system", { provider });
|
|
127
|
-
|
|
112
|
+
fileFromString("config", kubeconfig, "text/yaml", true);
|
|
128
113
|
var cluster_default = outputs({
|
|
129
114
|
k8sCluster: {
|
|
130
115
|
id: kubeSystem.metadata.uid,
|
|
@@ -134,49 +119,56 @@ var cluster_default = outputs({
|
|
|
134
119
|
endpoints,
|
|
135
120
|
apiEndpoints,
|
|
136
121
|
quirks: {
|
|
137
|
-
externalServiceType: "LoadBalancer"
|
|
122
|
+
externalServiceType: args.disabledComponents.includes("servicelb") ? "NodePort" : "LoadBalancer"
|
|
138
123
|
},
|
|
139
124
|
kubeconfig: secret(kubeconfig)
|
|
140
125
|
},
|
|
141
126
|
endpoints,
|
|
142
127
|
apiEndpoints,
|
|
143
|
-
$terminals: [createK8sTerminal(kubeconfig)],
|
|
144
|
-
$
|
|
128
|
+
// $terminals: [createK8sTerminal(kubeconfig)],
|
|
129
|
+
$statusFields: {
|
|
145
130
|
endpoints: endpoints.map(l3EndpointToString),
|
|
146
131
|
apiEndpoints: apiEndpoints.map(l4EndpointToString)
|
|
147
132
|
},
|
|
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
|
-
|
|
133
|
+
// $pages: {
|
|
134
|
+
// index: {
|
|
135
|
+
// title: "K3s Cluster",
|
|
136
|
+
// content: [
|
|
137
|
+
// {
|
|
138
|
+
// type: "markdown",
|
|
139
|
+
// content: text`
|
|
140
|
+
// The cluster is up and running.
|
|
141
|
+
// You can access the cluster via the terminal or by using the kubeconfig file.
|
|
142
|
+
// `,
|
|
143
|
+
// },
|
|
144
|
+
// {
|
|
145
|
+
// type: "file",
|
|
146
|
+
// meta: kubeconfigFile.meta,
|
|
147
|
+
// },
|
|
148
|
+
// {
|
|
149
|
+
// type: "markdown",
|
|
150
|
+
// content: secret(text`
|
|
151
|
+
// You can also copy the following content of the kubeconfig file and use it to access the cluster:
|
|
152
|
+
// \`\`\`yaml
|
|
153
|
+
// ${kubeconfig}
|
|
154
|
+
// \`\`\`
|
|
155
|
+
// `),
|
|
156
|
+
// },
|
|
157
|
+
// ],
|
|
158
|
+
// },
|
|
159
|
+
// },
|
|
160
|
+
// $files: [kubeconfigFile],
|
|
161
|
+
$workers: {
|
|
162
|
+
monitoring: {
|
|
163
|
+
image: "ghcr.io/highstate/k8s-monitor-worker:latest@sha256:90b5bb185370a959d92d13120738b879dc0a286dd4df602ecd7f675c9a3642eb",
|
|
164
|
+
params: {
|
|
165
|
+
kubeconfigSecretId: "",
|
|
166
|
+
resourceGroups: []
|
|
167
|
+
}
|
|
175
168
|
}
|
|
176
|
-
}
|
|
177
|
-
$files: [kubeconfigFile]
|
|
169
|
+
}
|
|
178
170
|
});
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
171
|
+
|
|
172
|
+
export { cluster_default as default };
|
|
173
|
+
//# sourceMappingURL=index.js.map
|
|
182
174
|
//# 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, k8s } 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 { 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 $workers: {\n monitoring: {\n image:\n \"ghcr.io/highstate/k8s-monitor-worker:latest@sha256:90b5bb185370a959d92d13120738b879dc0a286dd4df602ecd7f675c9a3642eb\",\n params: {\n kubeconfigSecretId: \"\",\n resourceGroups: [],\n } satisfies k8s.MonitorWorkerParams,\n },\n },\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.18",
|
|
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.18",
|
|
19
|
+
"@highstate/contract": "^0.9.18",
|
|
20
|
+
"@highstate/k8s": "^0.9.18",
|
|
21
|
+
"@highstate/library": "^0.9.18",
|
|
22
|
+
"@highstate/pulumi": "^0.9.18",
|
|
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.18"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "9ebcd7da56b00b8ca08bf52cc8438f527338cd64"
|
|
32
32
|
}
|