You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -17,7 +15,7 @@ particular `NnfDataMovementProfile` (or the default). The second is done per the
17
15
which allows for some configuration on a per-case basis, but is limited in scope. Both methods are
18
16
meant to work in tandem.
19
17
20
-
###Data Movement Profiles
18
+
## Data Movement Profiles
21
19
22
20
The server side configuration is controlled by creating `NnfDataMovementProfiles` resources in
23
21
Kubernetes. These work similar to `NnfStorageProfiles`. See [here](../storage-profiles/readme.md)
@@ -26,11 +24,11 @@ for understanding how to use profiles, set a default, etc.
26
24
For an in-depth understanding of the capabilities offered by Data Movement profiles, we recommend
27
25
referring to the following resources:
28
26
29
-
-[Type definition](https://github.com/NearNodeFlash/nnf-sos/blob/master/api/v1alpha1/nnfdatamovementprofile_types.go#L27) for `NnfDataMovementProfile`
30
-
-[Sample](https://github.com/NearNodeFlash/nnf-sos/blob/master/config/samples/nnf_v1alpha1_nnfdatamovementprofile.yaml) for `NnfDataMovementProfile`
31
-
-[Online Examples](https://github.com/NearNodeFlash/nnf-sos/blob/master/config/examples/nnf_v1alpha1_nnfdatamovementprofile.yaml) for `NnfDataMovementProfile`
27
+
-[Type definition](https://github.com/NearNodeFlash/nnf-sos/blob/master/api/v1alpha6/nnfdatamovementprofile_types.go#L27) for `NnfDataMovementProfile`
28
+
-[Sample](https://github.com/NearNodeFlash/nnf-sos/blob/master/config/samples/nnf_v1alpha6_nnfdatamovementprofile.yaml) for `NnfDataMovementProfile`
29
+
-[Online Examples](https://github.com/NearNodeFlash/nnf-sos/blob/master/config/examples/nnf_nnfdatamovementprofile.yaml) for `NnfDataMovementProfile`
32
30
33
-
###Copy Offload API Daemon
31
+
## Copy Offload API Daemon
34
32
35
33
The `CreateRequest` API call that is used to create Data Movement with the Copy Offload API has some
36
34
options to allow a user to specify some options for that particular Data Movement operation. These
@@ -40,14 +38,14 @@ settings are on a per-request basis. These supplement the configuration in the
40
38
The Copy Offload API requires the `nnf-dm` daemon to be running on the compute node. This daemon may
41
39
be configured to run full-time, or it may be left in a disabled state if the WLM is expected to run
42
40
it only when a user requests it. See [Compute Daemons](../compute-daemons/readme.md) for the systemd
43
-
service configuration of the daemon. See `RequiredDaemons` in [Directive
41
+
service configuration of the daemon. See `Requires` in [Directive
44
42
Breakdown](../directive-breakdown/readme.md) for a description of how the user may request the
45
43
daemon in the case where the WLM will run it only on demand.
46
44
47
45
See the [DataMovementCreateRequest API](copy-offload-api.html#datamovement.DataMovementCreateRequest)
48
46
definition for what can be configured.
49
47
50
-
###SELinux and Data Movement
48
+
## SELinux and Data Movement
51
49
52
50
Careful consideration must be taken when enabling SELinux on compute nodes. Doing so will result in
53
51
SELinux Extended File Attributes (xattrs) being placed on files created by applications running on
@@ -62,7 +60,7 @@ option.
62
60
See the [`dcp` documentation](https://mpifileutils.readthedocs.io/en/latest/dcp.1.html) for more
63
61
information.
64
62
65
-
###`sshd` Configuration for Data Movement Workers
63
+
## `sshd` Configuration for Data Movement Workers
66
64
67
65
The `nnf-dm-worker-*` pods run `sshd` in order to listen for `mpirun` jobs to perform data movement.
68
66
The number of simultaneous connections is limited via the sshd configuration (i.e. `MaxStartups`).
@@ -72,3 +70,82 @@ start rejecting connections once the limit is reached.
72
70
73
71
The `sshd_config` is stored in the `nnf-dm-worker-config``ConfigMap` so that it can be changed on
74
72
a running system without needing to roll new images. This also enables site-specific configuration.
73
+
74
+
## Enabling Core Dumps
75
+
76
+
### Mounting core dump Volumes
77
+
78
+
First, you must determine how your nodes handle core dumps. For example, if `systemd-coredump` is
79
+
used, then core dumps inside containers will be moved to the host node automatically. If that is
80
+
not the case, then a directory on the host nodes will need to be mounted into the Data Movement
81
+
containers. This directory will contain any core dumps collected by data movement operations, mainly
82
+
`mpirun` or `dcp`.
83
+
84
+
For Data Movement, the pods are running on two types of Kubernetes nodes:
85
+
86
+
-`nnf-dm-worker` pods on Rabbit nodes
87
+
-`nnf-dm-controller` pods on Kubernetes worker nodes
88
+
89
+
For all of these nodes, a core dump directory will need to be present and consistent across the
90
+
nodes. Once in place, we can then edit the Kubernetes configuration to mount this directory from
91
+
the host node to the containers using a [`hostPath`
then applies these patches to the correct resources.
107
+
108
+
### Editing the Data Movement Command
109
+
110
+
Once the volume is in place, the Data Movement command must be updated to first `cd` into this
111
+
directory. This ensures that the core dump is placed in that directory, making it accessible on the
112
+
host node.
113
+
114
+
To achieve this, update the Data Movement profiles in your gitops repository to include a preceding
115
+
`cd /localdisk/dumps && ...` in the `command` before the Data Movement command. For example, the default profile in `environments/<system>/nnf-sos/default-nnfdatamovementprofile.yaml` would look like the following:
Note that core patterns for containers are inherited from the host and that Linux containers do not
128
+
support a container-only core pattern without also affecting the host node. This is why we must use
129
+
a preceding `cd <dir>` in the Data Movement command.
130
+
131
+
### Data Movement Debug Images
132
+
133
+
To help with debugging symbols, it is a good idea to use the `debug` version of the two images used by the Data Movement containers:
134
+
135
+
- `nnf-mfu-debug`
136
+
- `nnf-dm-debug`
137
+
138
+
Both of these images include debugging symbols for [Open MPI](https://www.open-mpi.org/) and [mpiFileUtils](https://mpifileutils.readthedocs.io/en/v0.11.1/).
139
+
140
+
To use these images, edit the `environments/<system>/nnf-dm/kustomization.yaml` in your gitops repository and add the following:
141
+
142
+
```yaml
143
+
# Use images with mpifileutils/mpirun debug symbols
144
+
images:
145
+
- name: ghcr.io/nearnodeflash/nnf-dm
146
+
newName: ghcr.io/nearnodeflash/nnf-dm-debug
147
+
- name: ghcr.io/nearnodeflash/nnf-mfu
148
+
newName: ghcr.io/nearnodeflash/nnf-mfu-debug
149
+
```
150
+
151
+
This will override the default images and use the debug symbols instead.
Copy file name to clipboardExpand all lines: docs/guides/directive-breakdown/readme.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -150,14 +150,14 @@ A location constraint consists of an `access` list and a `reference`.
150
150
* `status.compute.constraints.location.access.type` specifies the connection type for the storage. This can be `network` or `physical`
151
151
* `status.compute.constraints.location.access.priority` specifies how necessary the connection type is. This can be `mandatory` or `bestEffort`
152
152
153
-
## RequiredDaemons
153
+
## Requires
154
154
155
-
The `status.requiredDaemons` section of the `DirectiveBreakdown` tells the WLM about any driver-specific daemons it must enable for the job; it is assumed that the WLM knows about the driver-specific daemons and that if the users are specifying these then the WLM knows how to start them. The `status.requiredDaemons` section will exist only for `jobdw` and `persistentdw` directives. An example of the `status.requiredDaemons` section is included below.
155
+
The `status.requires` section of the `DirectiveBreakdown` tells the WLM about any driver-specific daemons it must enable for the job; it is assumed that the WLM knows about the driver-specific daemons and that if the users are specifying these then the WLM knows how to start them. The `status.requires` section will exist only for `jobdw` and `persistentdw` directives. An example of the `status.requires` section is included below.
Set deploy/dws-webhook to 1 replica. **This must be done via the gitops repo.** Edit `environments/$ENV/dws/kustomization.yaml`, and add this, then wait for argocd to put it into effect. Or, force argocd to sync it with `argocd app sync 1-dws`.
17
+
18
+
```bash
19
+
patches:
20
+
- target:
21
+
kind: Deployment
22
+
name: dws-webhook
23
+
patch: |-
24
+
apiVersion: apps/v1
25
+
kind: Deployment
26
+
metadata:
27
+
name: dws-webhook
28
+
spec:
29
+
replicas: 1
30
+
```
31
+
32
+
Taint the nodes we're going to remove, to BUMP EXISTING PODS off them (this is different from the taint we used earlier). This will bump any DWS, NNF, ArgoCD, cert-manager, mpi-operator, luster-fs-operator pods. This leaves any lustre-csi-driver pods in place to assist with any Lustre unmounts that k8s may
> If you are running the node controller or using the Kubernetes API datastore in policy-only mode, you do not need to manually decommission nodes.
42
+
43
+
Tell k8s to drain the nodes.
44
+
45
+
Use the cray.nnf.node taints above before running 'kubectl drain'. Those taints allow Workflows to be terminated cleanly, even when they have Lustre filesystems mounted in the pods on that node. It's important that the lustre-csi-driver pod on that node lives long enough to assist with those unmounts to allow K8s to finish pod cleanup.
46
+
47
+
```console
48
+
kubectl drain --ignore-daemonsets $NODE
49
+
```
50
+
51
+
Delete the worker nodes:
52
+
53
+
```console
54
+
kubectl delete node $NODE
55
+
```
56
+
57
+
Verify that the node is deleted from calico and k8s:
58
+
59
+
```console
60
+
kubectl calico get nodes (requires the calico plugin for kubectl)
61
+
kubectl get nodes
62
+
```
63
+
64
+
Remove etcd, if it was a master:
65
+
66
+
```console
67
+
(on $NODE) kubeadm reset remove-etcd-member
68
+
```
69
+
70
+
It takes a while for all the containers on the deleted node to stop, so be patient.
71
+
72
+
```console
73
+
(on $NODE) crictl ps
74
+
```
75
+
76
+
Reset everything that "kubeadm join" did to that node:
77
+
78
+
```console
79
+
(on $NODE) kubeadm reset cleanup-node
80
+
```
81
+
82
+
## Join a node as a master
83
+
84
+
Check for expired "kubeadm init" or "kubeadm-certs" tokens, or expired certs:
85
+
86
+
The certificate-key from 'kubeadm init' is deleted after two hours. Use "kubeadm init phase upload-certs --upload-certs" to reload the certs later. This is explained in the output of the 'kubeadm init' command.
87
+
88
+
```console
89
+
kubeadm token list
90
+
```
91
+
92
+
The one labeled for "kubeadm init" is used as the token in "kubeadm join" commands. The one labeled for "managing TTL" controls the lifetime of the "kubeadm-certs" secret and the "bootstrap-token-XXX" secret. These secrets and this token, are deleted after the "managing TTL" token expires. A worker can still join after that expires; a master cannot.
93
+
94
+
```console
95
+
kubeadm certs check-expiration
96
+
```
97
+
98
+
Re-join that node as a master. When you ran "kubeadm init" to create the initial master node, you should have saved the output. It contains the "join" command that you need to create new masters. You want the commandline that includes the "--control-plane" option:
99
+
100
+
```console
101
+
(on $NODE) kubeadm join ... --control-plane ...
102
+
```
103
+
104
+
If that fails, it may tell you to generate new certs. Run the 'kubeadm init phase' command it specifies, and note the certificate key in the output. Replace the certificate key from your original join command with this new key and run the new join command.
Copy file name to clipboardExpand all lines: docs/guides/storage-profiles/readme.md
+26-5Lines changed: 26 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -288,21 +288,29 @@ In general, `scale` gives a simple way for users to get a filesystem that has pe
288
288
289
289
## Command Line Variables
290
290
291
-
### pvcreate
291
+
### global
292
+
- `$JOBID`- expands to the Job ID from the Workflow
293
+
- `$USERID`- expands to the User ID of the user who submitted the job
294
+
- `$GROUPID`- expands to the Group ID of the user who submitted the job
295
+
296
+
### LVM PV commands
292
297
293
298
- `$DEVICE`- expands to the `/dev/<path>` value for one device that has been allocated
294
299
295
-
### vgcreate
300
+
### LVM VG commands
296
301
297
302
- `$VG_NAME`- expands to a volume group name that is controlled by Rabbit software.
298
303
- `$DEVICE_LIST`- expands to a list of space-separated `/dev/<path>` devices. This list will contain the devices that were iterated over for the pvcreate step.
304
+
- `$DEVICE_NUM`- expands to the count of devices in `$DEVICE_LIST`
299
305
300
-
### lvcreate
306
+
### LVM LV Commands
301
307
302
308
- `$VG_NAME`- see vgcreate above.
303
309
- `$LV_NAME`- expands to a logical volume name that is controlled by Rabbit software.
304
310
- `$DEVICE_NUM`- expands to a number indicating the number of devices allocated for the volume group.
305
311
- `$DEVICE1, $DEVICE2, ..., $DEVICEn`- each expands to one of the devices from the `$DEVICE_LIST` above.
312
+
- `$PERCENT_VG`- expands to the size that each LV should be based on a percentage of the total VG size
313
+
- `$LV_SIZE`- expands to the size of the LV in kB in the format expected by `lvcreate`
306
314
307
315
### XFS mkfs
308
316
@@ -326,9 +334,15 @@ In general, `scale` gives a simple way for users to get a filesystem that has pe
326
334
327
335
- `$FS_NAME`- expands to the filesystem name that was passed to Rabbit software from the workflow's #DW line.
328
336
- `$MGS_NID`- expands to the NID of the MGS. If the MGS was orchestrated by nnf-sos then an appropriate internal value will be used.
329
-
- `$POOL_NAME`- see zpool create above.
330
-
- `$VOL_NAME`- expands to the volume name that will be created. This value will be `<pool_name>/<dataset>`, and is controlled by Rabbit software.
337
+
- `$ZVOL_NAME`- expands to the volume name that will be created. This value will be `<pool_name>/<dataset>`, and is controlled by Rabbit software.
331
338
- `$INDEX`- expands to the index value of the target and is controlled by Rabbit software.
339
+
- `$TARGET_NAME`- expands to the name of the lustre target of the form `[fsname]-[target-type][index]` (e.g., `mylus-OST0003`)
340
+
- `$BACKFS`- expands to the type of file system backing the Lustre target
341
+
342
+
### Mount/Unmount
343
+
344
+
- `$DEVICE`- expands to the device path to mount
345
+
- `$MOUNT_PATH`- expands to the path to mount on
332
346
333
347
### PostMount/PreUnmount and PostActivate/PreDeactivate
334
348
@@ -343,3 +357,10 @@ These variables are for lustre only and can be used to perform PostMount activit
343
357
- `$NUM_MGTMDTS`- expands to the number of combined MGTMDTs for the lustre filesystem
344
358
- `$NUM_OSTS`- expands to the number of OSTs for the lustre filesystem
345
359
- `$NUM_NNFNODES`- expands to the number of NNF Nodes for the lustre filesystem
360
+
361
+
### NnfSystemStorage specific
362
+
363
+
- `$COMPUTE_HOSTNAME`- Expands to the hostname of the compute node that will use the allocation. This can be used to add a tag during the lvcreate
364
+
```
365
+
lvCreate --zero n --activate n --extents $PERCENT_VG --addtag $COMPUTE_HOSTNAME ...
Copy file name to clipboardExpand all lines: docs/guides/user-containers/readme.md
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -52,9 +52,9 @@ The next few subsections provide an overview of the primary components comprisin
52
52
aspects, they don't encompass every single detail. For an in-depth understanding of the capabilities
53
53
offered by container profiles, we recommend referring to the following resources:
54
54
55
-
-[Type definition](https://github.com/NearNodeFlash/nnf-sos/blob/master/api/v1alpha1/nnfcontainerprofile_types.go#L35) for `NnfContainerProfile`
56
-
-[Sample](https://github.com/NearNodeFlash/nnf-sos/blob/master/config/samples/nnf_v1alpha1_nnfcontainerprofile.yaml) for `NnfContainerProfile`
57
-
-[Online Examples](https://github.com/NearNodeFlash/nnf-sos/blob/master/config/examples/nnf_v1alpha1_nnfcontainerprofiles.yaml) for `NnfContainerProfile` (same as `kubectl get` above)
55
+
-[Type definition](https://github.com/NearNodeFlash/nnf-sos/blob/master/api/v1alpha6/nnfcontainerprofile_types.go#L35) for `NnfContainerProfile`
56
+
-[Sample](https://github.com/NearNodeFlash/nnf-sos/blob/master/config/samples/nnf_v1alpha6_nnfcontainerprofile.yaml) for `NnfContainerProfile`
57
+
-[Online Examples](https://github.com/NearNodeFlash/nnf-sos/blob/master/config/examples/nnf_nnfcontainerprofiles.yaml) for `NnfContainerProfile` (same as `kubectl get` above)
58
58
59
59
#### Container Storages
60
60
@@ -597,7 +597,7 @@ The following profile shows the placement of the `readonly-red-rock-slushy` secr
597
597
in the previous step, and points to the user's `dean/red-rock-slushy:v1.0` container.
598
598
599
599
```yaml
600
-
apiVersion: nnf.cray.hpe.com/v1alpha1
600
+
apiVersion: nnf.cray.hpe.com/v1alpha6
601
601
kind: NnfContainerProfile
602
602
metadata:
603
603
name: red-rock-slushy
@@ -635,7 +635,7 @@ insert two `imagePullSecrets` lists into the `mpiSpec` of the NnfContainerProfil
0 commit comments