alasio 8.0.0 → 9.0.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/cli/src/api-server.js +18 -0
- package/dist/cli/src/api-server.js.map +1 -0
- package/dist/cli/src/branches.js +61 -20
- package/dist/cli/src/branches.js.map +1 -1
- package/dist/cli/src/cluster/docker.js +25 -10
- package/dist/cli/src/cluster/docker.js.map +1 -1
- package/dist/cli/src/cluster/host.js +33 -7
- package/dist/cli/src/cluster/host.js.map +1 -1
- package/dist/cli/src/cluster/k3s.js +43 -11
- package/dist/cli/src/cluster/k3s.js.map +1 -1
- package/dist/cli/src/cluster/node.js +107 -32
- package/dist/cli/src/cluster/node.js.map +1 -1
- package/dist/cli/src/cluster/stargz.js +55 -0
- package/dist/cli/src/cluster/stargz.js.map +1 -0
- package/dist/cli/src/commands/branch.js +5 -4
- package/dist/cli/src/commands/branch.js.map +1 -1
- package/dist/cli/src/commands/common.js +9 -3
- package/dist/cli/src/commands/common.js.map +1 -1
- package/dist/cli/src/commands/folder.js +14 -0
- package/dist/cli/src/commands/folder.js.map +1 -0
- package/dist/cli/src/commands/status.js +64 -12
- package/dist/cli/src/commands/status.js.map +1 -1
- package/dist/cli/src/commands/uninstall.js +8 -9
- package/dist/cli/src/commands/uninstall.js.map +1 -1
- package/dist/cli/src/commands/up.js +11 -3
- package/dist/cli/src/commands/up.js.map +1 -1
- package/dist/cli/src/commands/upgrade.js +1 -1
- package/dist/cli/src/commands/upgrade.js.map +1 -1
- package/dist/cli/src/commands.js +2 -1
- package/dist/cli/src/commands.js.map +1 -1
- package/dist/cli/src/config.js +4 -1
- package/dist/cli/src/config.js.map +1 -1
- package/dist/cli/src/cpu-baseline.js +8 -4
- package/dist/cli/src/cpu-baseline.js.map +1 -1
- package/dist/cli/src/folders.js +67 -0
- package/dist/cli/src/folders.js.map +1 -0
- package/dist/cli/src/gateway-calls.js +58 -0
- package/dist/cli/src/gateway-calls.js.map +1 -0
- package/dist/cli/src/install.js +77 -29
- package/dist/cli/src/install.js.map +1 -1
- package/dist/cli/src/kept-releases.js +27 -20
- package/dist/cli/src/kept-releases.js.map +1 -1
- package/dist/cli/src/kube/api.js +2 -3
- package/dist/cli/src/kube/api.js.map +1 -1
- package/dist/cli/src/kube/apply.js +15 -72
- package/dist/cli/src/kube/apply.js.map +1 -1
- package/dist/cli/src/kube/rollout.js +28 -16
- package/dist/cli/src/kube/rollout.js.map +1 -1
- package/dist/cli/src/manifests/admission.js +342 -223
- package/dist/cli/src/manifests/admission.js.map +1 -1
- package/dist/cli/src/manifests/alasio.js +58 -394
- package/dist/cli/src/manifests/alasio.js.map +1 -1
- package/dist/cli/src/manifests/branch.js +10 -26
- package/dist/cli/src/manifests/branch.js.map +1 -1
- package/dist/cli/src/manifests/collector.js +60 -44
- package/dist/cli/src/manifests/collector.js.map +1 -1
- package/dist/cli/src/manifests/common.js +32 -2
- package/dist/cli/src/manifests/common.js.map +1 -1
- package/dist/cli/src/manifests/config.js +64 -81
- package/dist/cli/src/manifests/config.js.map +1 -1
- package/dist/cli/src/manifests/disruption.js +10 -0
- package/dist/cli/src/manifests/disruption.js.map +1 -1
- package/dist/cli/src/manifests/folders.js +128 -0
- package/dist/cli/src/manifests/folders.js.map +1 -0
- package/dist/cli/src/manifests/grafana.js +4 -2
- package/dist/cli/src/manifests/grafana.js.map +1 -1
- package/dist/cli/src/manifests/index.js +10 -7
- package/dist/cli/src/manifests/index.js.map +1 -1
- package/dist/cli/src/manifests/lake.js +18 -4
- package/dist/cli/src/manifests/lake.js.map +1 -1
- package/dist/cli/src/manifests/log.js +32 -14
- package/dist/cli/src/manifests/log.js.map +1 -1
- package/dist/cli/src/manifests/neon.js +3 -3
- package/dist/cli/src/manifests/neon.js.map +1 -1
- package/dist/cli/src/manifests/network-policies.js +140 -74
- package/dist/cli/src/manifests/network-policies.js.map +1 -1
- package/dist/cli/src/manifests/node-agent.js +11 -4
- package/dist/cli/src/manifests/node-agent.js.map +1 -1
- package/dist/cli/src/manifests/object-store.js +4 -2
- package/dist/cli/src/manifests/object-store.js.map +1 -1
- package/dist/cli/src/manifests/sandbox-gateway.js +663 -0
- package/dist/cli/src/manifests/sandbox-gateway.js.map +1 -0
- package/dist/cli/src/manifests/scalers.js +16 -5
- package/dist/cli/src/manifests/scalers.js.map +1 -1
- package/dist/cli/src/manifests/sizing.js +16 -8
- package/dist/cli/src/manifests/sizing.js.map +1 -1
- package/dist/cli/src/manifests/valkey.js +11 -5
- package/dist/cli/src/manifests/valkey.js.map +1 -1
- package/dist/cli/src/manifests/vpa.js +3 -1
- package/dist/cli/src/manifests/vpa.js.map +1 -1
- package/dist/cli/src/manifests/workspace-storage.js +174 -89
- package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
- package/dist/cli/src/neon-storage.js +54 -14
- package/dist/cli/src/neon-storage.js.map +1 -1
- package/dist/cli/src/release.js +9 -9
- package/dist/cluster/node/pins.json +9 -4
- package/dist/neon/control/branches.js +6 -6
- package/dist/neon/control/branches.js.map +1 -1
- package/dist/neon/control/secrets.js +14 -3
- package/dist/neon/control/secrets.js.map +1 -1
- package/dist/src/binder/names.js +33 -0
- package/dist/src/binder/names.js.map +1 -0
- package/dist/src/binder/tokens.js +58 -0
- package/dist/src/binder/tokens.js.map +1 -0
- package/dist/src/branch/names.js +12 -2
- package/dist/src/branch/names.js.map +1 -1
- package/dist/src/events/names.js +7 -0
- package/dist/src/events/names.js.map +1 -0
- package/dist/src/gateway/names.js +201 -0
- package/dist/src/gateway/names.js.map +1 -0
- package/dist/src/harness/names.js +49 -0
- package/dist/src/harness/names.js.map +1 -0
- package/dist/src/kube/sandbox-shape.js +8 -68
- package/dist/src/kube/sandbox-shape.js.map +1 -1
- package/dist/src/node-agent/names.js +52 -2
- package/dist/src/node-agent/names.js.map +1 -1
- package/dist/src/sandbox/names.js +12 -20
- package/dist/src/sandbox/names.js.map +1 -1
- package/dist/src/sandbox/otlp-resource.js +173 -0
- package/dist/src/sandbox/otlp-resource.js.map +1 -0
- package/dist/src/sandbox/telemetry.js +43 -0
- package/dist/src/sandbox/telemetry.js.map +1 -0
- package/dist/src/telemetry/config.js +131 -0
- package/dist/src/telemetry/config.js.map +1 -0
- package/dist/src/telemetry/forward.js +154 -0
- package/dist/src/telemetry/forward.js.map +1 -0
- package/package.json +1 -1
- package/dist/cli/src/manifests/agent-sandbox.js +0 -92
- package/dist/cli/src/manifests/agent-sandbox.js.map +0 -1
- package/dist/cli/src/manifests/juicefs-csi.js +0 -320
- package/dist/cli/src/manifests/juicefs-csi.js.map +0 -1
- package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +0 -6295
- package/dist/src/kube/config.js +0 -145
- package/dist/src/kube/config.js.map +0 -1
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
import { imageReference } from "../images.js";
|
|
2
|
-
import { VOLUME_DRIVER_LABEL } from "../kube/apply.js";
|
|
3
|
-
import { goJson, ONE, replicasOf } from "./common.js";
|
|
4
|
-
import { verticalPodAutoscaler } from "./sizing.js";
|
|
5
|
-
/** The driver's name, which StorageClasses name as their provisioner. */
|
|
6
|
-
export const CSI_DRIVER = "csi.juicefs.com";
|
|
7
|
-
const VERSION = "v0.33.0";
|
|
8
|
-
const CONTROLLER = "juicefs-csi-controller";
|
|
9
|
-
const NODE = "juicefs-csi-node";
|
|
10
|
-
const CONFIG = "juicefs-csi-driver-config";
|
|
11
|
-
const CONTROLLER_ACCOUNT = "juicefs-csi-controller-sa";
|
|
12
|
-
const NODE_ACCOUNT = "juicefs-csi-node-sa";
|
|
13
|
-
/** The PriorityClass of mount pods. */
|
|
14
|
-
const MOUNT_PRIORITY_CLASS = "alasio-juicefs-mount";
|
|
15
|
-
/** The name label of the node service's mount pods, the clients. */
|
|
16
|
-
export const MOUNT_POD_NAME = "juicefs-mount";
|
|
17
|
-
/** The name label of the controller's and the node service's pods, the driver. */
|
|
18
|
-
export const DRIVER_POD_NAME = "juicefs-csi-driver";
|
|
19
|
-
/** The labels of the node service's mount pods. */
|
|
20
|
-
export const MOUNT_POD_LABELS = { "app.kubernetes.io/name": MOUNT_POD_NAME };
|
|
21
|
-
/** The labels that select the controller's and the node service's pods, upstream's but for its version. */
|
|
22
|
-
export const CONTROLLER_POD_LABELS = { app: CONTROLLER, "app.kubernetes.io/name": DRIVER_POD_NAME, "app.kubernetes.io/instance": DRIVER_POD_NAME };
|
|
23
|
-
export const NODE_POD_LABELS = { app: NODE, "app.kubernetes.io/name": DRIVER_POD_NAME, "app.kubernetes.io/instance": DRIVER_POD_NAME };
|
|
24
|
-
/**
|
|
25
|
-
* What selects the pods of the Jobs the controller runs to delete a volume's directory
|
|
26
|
-
* once its claim is gone: upstream labels such a Job but not its pod template
|
|
27
|
-
* (pkg/juicefs/mount/builder/job.go), so its pod carries only what Kubernetes gives a
|
|
28
|
-
* Job's pods, the name of its Job.
|
|
29
|
-
*/
|
|
30
|
-
export const JOB_POD_SELECTOR = { matchExpressions: [{ key: "batch.kubernetes.io/job-name", operator: "Exists" }] };
|
|
31
|
-
/** The selector of the controller's, the node service's and the mount pods' pods, by their name labels. */
|
|
32
|
-
export const JUICEFS_PODS_SELECTOR = `app.kubernetes.io/name in (${MOUNT_POD_NAME}, ${DRIVER_POD_NAME})`;
|
|
33
|
-
/** Where mount pods serve their Prometheus metrics, the client's (administration/monitoring.md). */
|
|
34
|
-
export const JUICEFS_METRICS_PORT = 9567;
|
|
35
|
-
/** Where the controller's and the node service's pods serve theirs, the driver's own: its provisioning and volume errors among them. */
|
|
36
|
-
export const DRIVER_METRICS_PORT = 8080;
|
|
37
|
-
/** The label of what the driver needs to delete its volumes' data, which alasio keeps while they remain. */
|
|
38
|
-
export const VOLUME_DRIVER = { [VOLUME_DRIVER_LABEL]: CSI_DRIVER };
|
|
39
|
-
/** The labels of the driver's objects: upstream's, at its version, managed by alasio, and needed by its volumes. */
|
|
40
|
-
const LABELS = {
|
|
41
|
-
"app.kubernetes.io/name": "juicefs-csi-driver",
|
|
42
|
-
"app.kubernetes.io/instance": "juicefs-csi-driver",
|
|
43
|
-
"app.kubernetes.io/version": VERSION,
|
|
44
|
-
"app.kubernetes.io/managed-by": "alasio",
|
|
45
|
-
...VOLUME_DRIVER,
|
|
46
|
-
};
|
|
47
|
-
/** Where the controller and node service keep mount points and the client's configuration, on the node. */
|
|
48
|
-
const MOUNT_PATH = "/var/lib/juicefs/volume";
|
|
49
|
-
const CONFIG_PATH = "/var/lib/juicefs/config";
|
|
50
|
-
/** The controller's socket, which its sidecars reach it by. */
|
|
51
|
-
const CONTROLLER_SOCKET_DIR = "/var/lib/csi/sockets/pluginproxy/";
|
|
52
|
-
/**
|
|
53
|
-
* The driver's configuration, its ConfigMap's config.yaml: two patches. The first, of every
|
|
54
|
-
* pod the driver runs, pins its client and sizes it: mount pods, and the Job that deletes a
|
|
55
|
-
* volume's directory once its claim is gone, which no patch selecting by claim reaches, so
|
|
56
|
-
* that it ran on JuiceFS's defaults, a whole CPU and 1 GiB requested on its default image.
|
|
57
|
-
* The second, of the mount pods of workspace storage's class: their mount options, which
|
|
58
|
-
* take precedence over a volume's and reach mount pods made after a change, and readiness.
|
|
59
|
-
*/
|
|
60
|
-
export function driverConfig({ workspaceStorage }) {
|
|
61
|
-
const { csi, storageClassName, cacheSizeMiB, backupInterval } = workspaceStorage;
|
|
62
|
-
return {
|
|
63
|
-
enableNodeSelector: false,
|
|
64
|
-
mountPodPatch: [{ ceMountImage: imageReference(csi.mountImage), resources: csi.mountPod.resources }, {
|
|
65
|
-
pvcSelector: { matchStorageClassName: storageClassName },
|
|
66
|
-
mountOptions: [
|
|
67
|
-
// The read cache, bounded, and keeping a fifth of the node's disk free.
|
|
68
|
-
`cache-size=${cacheSizeMiB}`,
|
|
69
|
-
"free-space-ratio=0.2",
|
|
70
|
-
`backup-meta=${backupInterval}`,
|
|
71
|
-
],
|
|
72
|
-
// Ready once the mount answers as FUSE's. A mount pod mounts its volume's directory
|
|
73
|
-
// alone (as `subdir`), so that is the mount's root, and nothing is under it by the
|
|
74
|
-
// volume's path; unmounted, the root is the node's own directory.
|
|
75
|
-
readinessProbe: { exec: { command: ["sh", "-c", 'test "$(stat --file-system --format=%T ${MOUNT_POINT})" = fuseblk'] }, initialDelaySeconds: 5, periodSeconds: 10, failureThreshold: 3 },
|
|
76
|
-
}],
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
/** What the controller and node service are told alike: where they are, where mount pods keep their mounts, and the pods' priority. */
|
|
80
|
-
function pluginEnv({ workspaceStorage }) {
|
|
81
|
-
return [
|
|
82
|
-
{ name: "NODE_NAME", valueFrom: { fieldRef: { fieldPath: "spec.nodeName" } } },
|
|
83
|
-
{ name: "JUICEFS_MOUNT_NAMESPACE", valueFrom: { fieldRef: { fieldPath: "metadata.namespace" } } },
|
|
84
|
-
{ name: "POD_NAME", valueFrom: { fieldRef: { fieldPath: "metadata.name" } } },
|
|
85
|
-
{ name: "JUICEFS_MOUNT_PATH", value: MOUNT_PATH },
|
|
86
|
-
{ name: "JUICEFS_CONFIG_PATH", value: CONFIG_PATH },
|
|
87
|
-
{ name: "JUICEFS_MOUNT_PRIORITY_NAME", value: MOUNT_PRIORITY_CLASS },
|
|
88
|
-
{ name: "JUICEFS_MOUNT_PREEMPTION_POLICY", value: "Never" },
|
|
89
|
-
...(workspaceStorage.csi.shareMountPod ? [{ name: "FS_SHARE_MOUNT", value: "true" }] : []),
|
|
90
|
-
];
|
|
91
|
-
}
|
|
92
|
-
/** The plugin's liveness, which its liveness-probe sidecar answers on the plugin's healthz port. */
|
|
93
|
-
const PLUGIN_PROBE = { httpGet: { path: "/healthz", port: "healthz" }, initialDelaySeconds: 10, periodSeconds: 10, timeoutSeconds: 3, failureThreshold: 5 };
|
|
94
|
-
/** The liveness-probe sidecar, for the plugin's socket in `socketVolume`. */
|
|
95
|
-
function livenessProbe({ workspaceStorage }, socketVolume) {
|
|
96
|
-
return {
|
|
97
|
-
name: "liveness-probe",
|
|
98
|
-
image: imageReference(workspaceStorage.csi.livenessProbeImage),
|
|
99
|
-
args: ["--csi-address=/csi/csi.sock", "--health-port=9909"],
|
|
100
|
-
resources: { requests: { cpu: "5m", memory: "16Mi" }, limits: { memory: "64Mi" } },
|
|
101
|
-
volumeMounts: [{ name: socketVolume, mountPath: "/csi" }],
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
/** A rule granting `verbs` on `resources` of `apiGroups`. */
|
|
105
|
-
function rule(apiGroups, resources, verbs) {
|
|
106
|
-
return { apiGroups, resources, verbs };
|
|
107
|
-
}
|
|
108
|
-
/** Who the controller and node service are, and what they may do, as upstream grants it. */
|
|
109
|
-
function identities({ workspaceStorage }) {
|
|
110
|
-
const { namespace } = workspaceStorage.csi;
|
|
111
|
-
const account = (name) => ({ apiVersion: "v1", kind: "ServiceAccount", metadata: { name, namespace, labels: LABELS } });
|
|
112
|
-
const role = (name, rules) => ({
|
|
113
|
-
apiVersion: "rbac.authorization.k8s.io/v1",
|
|
114
|
-
kind: "ClusterRole",
|
|
115
|
-
metadata: { name, labels: LABELS },
|
|
116
|
-
rules,
|
|
117
|
-
});
|
|
118
|
-
const binding = (name, roleName, accountName) => ({
|
|
119
|
-
apiVersion: "rbac.authorization.k8s.io/v1",
|
|
120
|
-
kind: "ClusterRoleBinding",
|
|
121
|
-
metadata: { name, labels: LABELS },
|
|
122
|
-
subjects: [{ kind: "ServiceAccount", name: accountName, namespace }],
|
|
123
|
-
roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "ClusterRole", name: roleName },
|
|
124
|
-
});
|
|
125
|
-
const provisioner = "juicefs-external-provisioner-role";
|
|
126
|
-
const nodeService = "juicefs-csi-external-node-service-role";
|
|
127
|
-
return [
|
|
128
|
-
account(CONTROLLER_ACCOUNT),
|
|
129
|
-
account(NODE_ACCOUNT),
|
|
130
|
-
role(provisioner, [
|
|
131
|
-
rule([""], ["persistentvolumes"], ["get", "list", "watch", "create", "delete", "patch"]),
|
|
132
|
-
rule([""], ["persistentvolumeclaims", "persistentvolumeclaims/status"], ["get", "list", "watch", "update", "patch"]),
|
|
133
|
-
rule(["storage.k8s.io"], ["storageclasses"], ["get", "list", "watch"]),
|
|
134
|
-
rule([""], ["events"], ["list", "watch", "create", "update", "patch"]),
|
|
135
|
-
rule(["storage.k8s.io"], ["csinodes"], ["get", "list", "watch"]),
|
|
136
|
-
rule([""], ["nodes"], ["get", "list", "watch"]),
|
|
137
|
-
rule([""], ["secrets"], ["get", "list", "watch", "create", "update", "patch", "delete"]),
|
|
138
|
-
rule([""], ["pods", "pods/log"], ["get", "list", "watch", "create", "update", "patch", "delete"]),
|
|
139
|
-
rule(["batch"], ["jobs"], ["get", "create", "update", "patch", "delete", "list", "watch"]),
|
|
140
|
-
rule([""], ["endpoints"], ["get", "list", "watch", "create", "update", "patch"]),
|
|
141
|
-
rule(["apps"], ["daemonsets"], ["get", "list"]),
|
|
142
|
-
rule([""], ["configmaps"], ["get", "watch", "list", "delete", "update", "create"]),
|
|
143
|
-
]),
|
|
144
|
-
role(nodeService, [
|
|
145
|
-
rule([""], ["pods"], ["get", "list", "create", "update", "delete", "patch", "watch"]),
|
|
146
|
-
rule([""], ["pods/log"], ["get"]),
|
|
147
|
-
rule([""], ["secrets"], ["get", "create", "update", "delete", "patch"]),
|
|
148
|
-
rule(["batch"], ["jobs"], ["get", "create", "update", "delete", "patch"]),
|
|
149
|
-
rule([""], ["nodes"], ["get", "list"]),
|
|
150
|
-
rule([""], ["nodes/proxy"], ["*"]),
|
|
151
|
-
rule([""], ["persistentvolumes", "persistentvolumeclaims"], ["get", "list"]),
|
|
152
|
-
rule([""], ["pods/exec"], ["create"]),
|
|
153
|
-
rule([""], ["events"], ["create", "get"]),
|
|
154
|
-
rule(["storage.k8s.io"], ["storageclasses"], ["get", "watch"]),
|
|
155
|
-
rule([""], ["configmaps"], ["get", "update"]),
|
|
156
|
-
]),
|
|
157
|
-
binding("juicefs-csi-provisioner-binding", provisioner, CONTROLLER_ACCOUNT),
|
|
158
|
-
binding("juicefs-csi-node-service-binding", nodeService, NODE_ACCOUNT),
|
|
159
|
-
];
|
|
160
|
-
}
|
|
161
|
-
/** The controller: the plugin, provisioning, and the resizer, which grows a volume's quota as its claim grows. */
|
|
162
|
-
function controller(config) {
|
|
163
|
-
const { csi } = config.workspaceStorage;
|
|
164
|
-
return {
|
|
165
|
-
apiVersion: "apps/v1",
|
|
166
|
-
kind: "StatefulSet",
|
|
167
|
-
metadata: { name: CONTROLLER, namespace: csi.namespace, labels: { ...LABELS, "app.kubernetes.io/component": "controller" } },
|
|
168
|
-
spec: {
|
|
169
|
-
serviceName: CONTROLLER,
|
|
170
|
-
// One, and never more: without an election, two would provision alike.
|
|
171
|
-
...replicasOf(ONE),
|
|
172
|
-
selector: { matchLabels: CONTROLLER_POD_LABELS },
|
|
173
|
-
template: {
|
|
174
|
-
metadata: { labels: { ...LABELS, ...CONTROLLER_POD_LABELS } },
|
|
175
|
-
spec: {
|
|
176
|
-
serviceAccountName: CONTROLLER_ACCOUNT,
|
|
177
|
-
priorityClassName: "system-cluster-critical",
|
|
178
|
-
tolerations: [{ key: "CriticalAddonsOnly", operator: "Exists" }],
|
|
179
|
-
containers: [
|
|
180
|
-
{
|
|
181
|
-
name: "juicefs-plugin",
|
|
182
|
-
image: imageReference(csi.image),
|
|
183
|
-
args: ["--endpoint=$(CSI_ENDPOINT)", "--logtostderr", "--nodeid=$(NODE_NAME)", "--provisioner=true", "--config=/etc/config/config.yaml"],
|
|
184
|
-
env: [{ name: "CSI_ENDPOINT", value: `unix://${CONTROLLER_SOCKET_DIR}csi.sock` }, ...pluginEnv(config)],
|
|
185
|
-
ports: [{ name: "healthz", containerPort: 9909, protocol: "TCP" }],
|
|
186
|
-
livenessProbe: PLUGIN_PROBE,
|
|
187
|
-
// It mounts the file system itself, to make and remove volumes' directories.
|
|
188
|
-
securityContext: { privileged: true, capabilities: { add: ["SYS_ADMIN"] } },
|
|
189
|
-
resources: csi.controller.resources,
|
|
190
|
-
volumeMounts: [
|
|
191
|
-
{ name: "socket-dir", mountPath: CONTROLLER_SOCKET_DIR },
|
|
192
|
-
{ name: "jfs-dir", mountPath: "/jfs", mountPropagation: "Bidirectional" },
|
|
193
|
-
{ name: "jfs-root-dir", mountPath: "/root/.juicefs", mountPropagation: "Bidirectional" },
|
|
194
|
-
{ name: "juicefs-config", mountPath: "/etc/config" },
|
|
195
|
-
],
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
name: "csi-resizer",
|
|
199
|
-
image: imageReference(csi.resizerImage),
|
|
200
|
-
args: ["--csi-address=$(ADDRESS)", "--timeout=20s", "--v=2"],
|
|
201
|
-
env: [{ name: "ADDRESS", value: `${CONTROLLER_SOCKET_DIR}csi.sock` }],
|
|
202
|
-
resources: { requests: { cpu: "5m", memory: "24Mi" }, limits: { memory: "128Mi" } },
|
|
203
|
-
volumeMounts: [{ name: "socket-dir", mountPath: CONTROLLER_SOCKET_DIR }],
|
|
204
|
-
},
|
|
205
|
-
livenessProbe(config, "socket-dir"),
|
|
206
|
-
],
|
|
207
|
-
volumes: [
|
|
208
|
-
{ name: "socket-dir", emptyDir: {} },
|
|
209
|
-
{ name: "jfs-dir", hostPath: { path: MOUNT_PATH, type: "DirectoryOrCreate" } },
|
|
210
|
-
{ name: "jfs-root-dir", hostPath: { path: CONFIG_PATH, type: "DirectoryOrCreate" } },
|
|
211
|
-
{ name: "juicefs-config", configMap: { name: CONFIG } },
|
|
212
|
-
],
|
|
213
|
-
},
|
|
214
|
-
},
|
|
215
|
-
},
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
/** The node service: the plugin, which makes mount pods and binds their mounts into pods, and the registrar, which names it to kubelet. */
|
|
219
|
-
function nodeService(config) {
|
|
220
|
-
const { csi } = config.workspaceStorage;
|
|
221
|
-
const pluginDir = `/var/lib/kubelet/csi-plugins/${CSI_DRIVER}/`;
|
|
222
|
-
return {
|
|
223
|
-
apiVersion: "apps/v1",
|
|
224
|
-
kind: "DaemonSet",
|
|
225
|
-
metadata: { name: NODE, namespace: csi.namespace, labels: { ...LABELS, "app.kubernetes.io/component": "node" } },
|
|
226
|
-
spec: {
|
|
227
|
-
selector: { matchLabels: NODE_POD_LABELS },
|
|
228
|
-
template: {
|
|
229
|
-
metadata: { labels: { ...LABELS, ...NODE_POD_LABELS } },
|
|
230
|
-
spec: {
|
|
231
|
-
serviceAccountName: NODE_ACCOUNT,
|
|
232
|
-
priorityClassName: "system-node-critical",
|
|
233
|
-
dnsPolicy: "ClusterFirstWithHostNet",
|
|
234
|
-
tolerations: [{ key: "CriticalAddonsOnly", operator: "Exists" }],
|
|
235
|
-
containers: [
|
|
236
|
-
{
|
|
237
|
-
name: "juicefs-plugin",
|
|
238
|
-
image: imageReference(csi.image),
|
|
239
|
-
args: ["--endpoint=$(CSI_ENDPOINT)", "--logtostderr", "--nodeid=$(NODE_NAME)", "--enable-manager=true", "--config=/etc/config/config.yaml"],
|
|
240
|
-
env: [
|
|
241
|
-
{ name: "CSI_ENDPOINT", value: "unix:/csi/csi.sock" },
|
|
242
|
-
{ name: "HOST_IP", valueFrom: { fieldRef: { fieldPath: "status.hostIP" } } },
|
|
243
|
-
{ name: "KUBELET_PORT", value: "10250" },
|
|
244
|
-
...pluginEnv(config),
|
|
245
|
-
],
|
|
246
|
-
ports: [{ name: "healthz", containerPort: 9909, protocol: "TCP" }],
|
|
247
|
-
livenessProbe: PLUGIN_PROBE,
|
|
248
|
-
securityContext: { privileged: true },
|
|
249
|
-
resources: csi.node.resources,
|
|
250
|
-
volumeMounts: [
|
|
251
|
-
{ name: "kubelet-dir", mountPath: "/var/lib/kubelet", mountPropagation: "Bidirectional" },
|
|
252
|
-
{ name: "plugin-dir", mountPath: "/csi" },
|
|
253
|
-
{ name: "device-dir", mountPath: "/dev" },
|
|
254
|
-
{ name: "jfs-dir", mountPath: "/jfs", mountPropagation: "Bidirectional" },
|
|
255
|
-
{ name: "jfs-root-dir", mountPath: "/root/.juicefs", mountPropagation: "Bidirectional" },
|
|
256
|
-
{ name: "juicefs-config", mountPath: "/etc/config" },
|
|
257
|
-
// Where it keeps each mount's FUSE descriptor, by which a mount pod that
|
|
258
|
-
// crashes comes back under the same mount (guide/configurations.md
|
|
259
|
-
// "Automatic mount point recovery").
|
|
260
|
-
{ name: "jfs-fuse-fd", mountPath: "/tmp" },
|
|
261
|
-
],
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
name: "node-driver-registrar",
|
|
265
|
-
image: imageReference(csi.registrarImage),
|
|
266
|
-
args: ["--csi-address=$(ADDRESS)", "--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)", "--v=5"],
|
|
267
|
-
env: [{ name: "ADDRESS", value: "/csi/csi.sock" }, { name: "DRIVER_REG_SOCK_PATH", value: `${pluginDir}csi.sock` }],
|
|
268
|
-
resources: { requests: { cpu: "5m", memory: "16Mi" }, limits: { memory: "64Mi" } },
|
|
269
|
-
volumeMounts: [{ name: "plugin-dir", mountPath: "/csi" }, { name: "registration-dir", mountPath: "/registration" }],
|
|
270
|
-
},
|
|
271
|
-
livenessProbe(config, "plugin-dir"),
|
|
272
|
-
],
|
|
273
|
-
volumes: [
|
|
274
|
-
{ name: "kubelet-dir", hostPath: { path: "/var/lib/kubelet", type: "Directory" } },
|
|
275
|
-
{ name: "plugin-dir", hostPath: { path: pluginDir, type: "DirectoryOrCreate" } },
|
|
276
|
-
{ name: "registration-dir", hostPath: { path: "/var/lib/kubelet/plugins_registry/", type: "Directory" } },
|
|
277
|
-
{ name: "device-dir", hostPath: { path: "/dev", type: "Directory" } },
|
|
278
|
-
{ name: "jfs-dir", hostPath: { path: MOUNT_PATH, type: "DirectoryOrCreate" } },
|
|
279
|
-
{ name: "jfs-root-dir", hostPath: { path: CONFIG_PATH, type: "DirectoryOrCreate" } },
|
|
280
|
-
{ name: "juicefs-config", configMap: { name: CONFIG } },
|
|
281
|
-
{ name: "jfs-fuse-fd", hostPath: { path: "/var/run/juicefs-csi", type: "DirectoryOrCreate" } },
|
|
282
|
-
],
|
|
283
|
-
},
|
|
284
|
-
},
|
|
285
|
-
},
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
/** The driver's objects, unless the cluster already has the driver: the CSIDriver and the mount pods' PriorityClass among them, which are the cluster's. */
|
|
289
|
-
export function juicefsCsiObjects(config) {
|
|
290
|
-
const { csi } = config.workspaceStorage;
|
|
291
|
-
if (!csi.enabled)
|
|
292
|
-
return [];
|
|
293
|
-
const csiDriver = {
|
|
294
|
-
apiVersion: "storage.k8s.io/v1",
|
|
295
|
-
kind: "CSIDriver",
|
|
296
|
-
metadata: { name: CSI_DRIVER, labels: LABELS },
|
|
297
|
-
spec: { attachRequired: false, podInfoOnMount: true },
|
|
298
|
-
};
|
|
299
|
-
const priorityClass = {
|
|
300
|
-
apiVersion: "scheduling.k8s.io/v1",
|
|
301
|
-
kind: "PriorityClass",
|
|
302
|
-
metadata: { name: MOUNT_PRIORITY_CLASS, labels: LABELS },
|
|
303
|
-
// As high as a pod's may be, so mount pods outlast the workspaces they serve, and
|
|
304
|
-
// never preempting, so a new one evicts nothing.
|
|
305
|
-
value: 1_000_000_000,
|
|
306
|
-
preemptionPolicy: "Never",
|
|
307
|
-
globalDefault: false,
|
|
308
|
-
description: "JuiceFS's mount pods, which serve alasio's workspaces",
|
|
309
|
-
};
|
|
310
|
-
const configMap = {
|
|
311
|
-
apiVersion: "v1",
|
|
312
|
-
kind: "ConfigMap",
|
|
313
|
-
metadata: { name: CONFIG, namespace: csi.namespace, labels: LABELS },
|
|
314
|
-
data: { "config.yaml": goJson(driverConfig(config), " ") },
|
|
315
|
-
};
|
|
316
|
-
// Each serves workspaces' mounts, which its recreation would interrupt.
|
|
317
|
-
const workloads = [controller(config), nodeService(config)];
|
|
318
|
-
return [csiDriver, priorityClass, ...identities(config), configMap, ...workloads.flatMap((workload) => [workload, verticalPodAutoscaler(workload, "Recommended")])];
|
|
319
|
-
}
|
|
320
|
-
//# sourceMappingURL=juicefs-csi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"juicefs-csi.js","sourceRoot":"","sources":["../../../../src/manifests/juicefs-csi.ts"],"names":[],"mappings":"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"}
|