2020-09-08 17:16:17 +00:00
---
2021-03-09 11:38:09 +00:00
title: "Developer guide"
2020-09-08 17:16:17 +00:00
layout: default
2022-11-02 12:34:37 +00:00
sort: 5
2020-09-08 17:16:17 +00:00
---
2021-03-09 11:38:09 +00:00
# Developer guide
2021-09-27 12:31:49 +00:00
{: .no_toc}
2020-09-08 17:16:17 +00:00
## Table of contents
2021-09-27 12:31:49 +00:00
{: .no_toc .text-delta}
2020-09-08 17:16:17 +00:00
1. TOC
{:toc}
---
2021-03-09 11:38:09 +00:00
## Building from source
2020-09-08 17:16:17 +00:00
2020-10-20 17:50:46 +00:00
### Download the source code
2020-09-08 17:16:17 +00:00
2020-10-20 17:50:46 +00:00
```bash
2020-09-08 17:16:17 +00:00
git clone https://github.com/kubernetes-sigs/node-feature-discovery
cd node-feature-discovery
```
2021-03-09 11:38:09 +00:00
### Docker build
2020-09-08 17:16:17 +00:00
2020-10-20 17:50:46 +00:00
#### Build the container image
2020-09-08 17:16:17 +00:00
See [customizing the build ](#customizing-the-build ) below for altering the
container image registry, for example.
2020-10-20 17:50:46 +00:00
```bash
2020-09-08 17:16:17 +00:00
make
```
2020-10-20 17:50:46 +00:00
#### Push the container image
2021-02-25 11:49:02 +00:00
2020-09-08 17:16:17 +00:00
Optional, this example with Docker.
2020-10-20 17:50:46 +00:00
```bash
2020-09-08 17:16:17 +00:00
docker push < IMAGE_TAG >
```
2021-12-10 12:18:31 +00:00
### Docker multi-arch builds with buildx
The default set of architectures enabled for mulit-arch builds are `linux/amd64`
and `linux/arm64` . If more architectures are needed one can override the
`IMAGE_ALL_PLATFORMS` variable with a comma separated list of `OS/ARCH` tuples.
#### Build the manifest-list with a container image per arch
```bash
make image-all
```
Currently `docker` does not support loading of manifest-lists meaning the images
are not shown when executing `docker images` , see:
[buildx issue #59 ](https://github.com/docker/buildx/issues/59 ).
#### Push the manifest-list with container image per arch
```bash
make push-all
```
The resulting container image can be used in the same way on each arch by pulling
2022-03-29 06:47:42 +00:00
e.g. `node-feature-discovery:{{ site.release }}` without specifying the
architecture. The manifest-list will take care of providing the right
architecture image.
2021-12-10 12:18:31 +00:00
2020-10-20 17:50:46 +00:00
#### Change the job spec to use your custom image (optional)
2020-09-08 17:16:17 +00:00
To use your published image from the step above instead of the
2022-09-12 08:21:12 +00:00
`registry.k8s.io/nfd/node-feature-discovery` image, edit `image`
2020-09-08 17:16:17 +00:00
attribute in the spec template(s) to the new location
(`< registry-name > /< image-name > [:< version > ]`).
2020-10-01 12:37:34 +00:00
### Deployment
2021-08-13 14:35:22 +00:00
The `yamls` makefile generates a `kustomization.yaml` matching your locally
built image and using the `deploy/overlays/default` deployment. See
[build customization ](#customizing-the-build ) below for configurability, e.g.
changing the deployment namespace.
2020-10-01 12:37:34 +00:00
```bash
K8S_NAMESPACE=my-ns make yamls
2021-08-13 14:35:22 +00:00
kubectl apply -k .
2020-10-01 12:37:34 +00:00
```
2021-08-13 14:35:22 +00:00
You can use alternative deployment methods by modifying the auto-generated
2023-12-08 12:42:31 +00:00
kustomization file.
2020-10-01 12:37:34 +00:00
2021-03-09 11:38:09 +00:00
### Building locally
2020-09-08 17:16:17 +00:00
You can also build the binaries locally
2020-10-20 17:50:46 +00:00
```bash
2020-09-08 17:16:17 +00:00
make build
```
This will compile binaries under `bin/`
2021-03-09 11:38:09 +00:00
### Customizing the build
2020-09-08 17:16:17 +00:00
There are several Makefile variables that control the build process and the
name of the resulting container image. The following are targeted targeted for
build customization and they can be specified via environment variables or
makefile overrides.
2023-10-25 19:12:47 +00:00
| Variable | Description | Default value |
| -------------------------- | ----------------------------------------------------------------- | ------------- |
| HOSTMOUNT_PREFIX | Prefix of system directories for feature discovery (local builds) | / (*local builds*) /host- (*container builds*) |
| IMAGE_BUILD_CMD | Command to build the image | docker build |
| IMAGE_BUILD_EXTRA_OPTS | Extra options to pass to build command | *empty* |
| IMAGE_BUILDX_CMD | Command to build and push multi-arch images with buildx | DOCKER_CLI_EXPERIMENTAL=enabled docker buildx build --platform=${IMAGE_ALL_PLATFORMS} --progress=auto --pull |
| IMAGE_ALL_PLATFORMS | Comma separated list of OS/ARCH tuples for mulit-arch builds | linux/amd64,linux/arm64 |
| IMAGE_PUSH_CMD | Command to push the image to remote registry | docker push |
| IMAGE_REGISTRY | Container image registry to use | registry.k8s.io/nfd |
| IMAGE_TAG_NAME | Container image tag name | < nfd version> |
| IMAGE_EXTRA_TAG_NAMES | Additional container image tag(s) to create when building image | *empty* |
| K8S_NAMESPACE | nfd-master and nfd-worker namespace | node-feature-discovery |
2020-09-08 17:16:17 +00:00
For example, to use a custom registry:
2020-10-20 17:50:46 +00:00
```bash
2020-09-08 17:16:17 +00:00
make IMAGE_REGISTRY=< my custom registry uri >
```
Or to specify a build tool different from Docker, It can be done in 2 ways:
2020-10-20 17:50:46 +00:00
2020-09-08 17:16:17 +00:00
1. via environment
2021-02-25 11:49:02 +00:00
```bash
IMAGE_BUILD_CMD="buildah bud" make
```
2020-10-20 17:50:46 +00:00
1. by overriding the variable value
2021-02-25 11:49:02 +00:00
```bash
make IMAGE_BUILD_CMD="buildah bud"
```
2020-09-08 17:16:17 +00:00
### Testing
Unit tests are automatically run as part of the container image build. You can
2023-11-28 18:27:33 +00:00
also run them manually in the source code tree by running:
2020-10-20 17:50:46 +00:00
```bash
2020-09-08 17:16:17 +00:00
make test
```
End-to-end tests are built on top of the e2e test framework of Kubernetes, and,
they required a cluster to run them on. For running the tests on your test
cluster you need to specify the kubeconfig to be used:
2020-10-20 17:50:46 +00:00
```bash
2020-09-08 17:16:17 +00:00
make e2e-test KUBECONFIG=$HOME/.kube/config
```
2023-12-05 15:45:12 +00:00
There are several environment variables that can be used to customize the
e2e-tests:
| Variable | Description | Default value |
| -------------------------- | ----------------------------------------------------------------- | ------------- |
| KUBECONFIG | Kubeconfig for running e2e-tests | *empty* |
| E2E_TEST_CONFIG | Parameterization file of e2e-tests (see [example][e2e-config-sample]) | *empty* |
| E2E_PULL_IF_NOT_PRESENT | True-ish value makes the image pull policy IfNotPresent (to be used only in e2e tests) | false |
| E2E_TEST_FULL_IMAGE | Run e2e-test also against the Full Image tag | false |
| E2E_GINKGO_LABEL_FILTER | Ginkgo label filter to use for running e2e tests | *empty* |
| OPENSHIFT | Non-empty value enables OpenShift specific support (only affects e2e tests) | *empty* |
2021-03-09 11:38:09 +00:00
## Running locally
2020-09-08 17:16:17 +00:00
Deprecate gRPC API
Now that the NodeFeature API has been set enabled by default, the gRPC
mode will be deprecated and with it all flags and features around it.
For nfd-master, flags
-port, -key-file, -ca-file, -cert-file, -verify-node-name, -enable-nodefeature-api
are now marked as deprecated.
For nfd-worker flags
-enable-nodefeature-api, -ca-file, -cert-file, -key-file, -server, -server-name-override
are now marked as deprecated.
Deprecated flags, as well as gRPC related code will be removed in future
releases.
Signed-off-by: Carlos Eduardo Arango Gutierrez <eduardoa@nvidia.com>
Co-authored-by: Markus Lehtonen <markus.lehtonen@intel.com>
2023-09-06 08:22:13 +00:00
> ****DEPRECATED**: Running NFD locally is deprecated and will be removed in a
> future release. It depends on the gRPC API which is deprecated and will be
2024-03-18 13:51:28 +00:00
> removed in a future release. To run NFD locally, disable the NodeFeature API
> with `-feature-gates NodeFeatureAPI=false` flag.
Deprecate gRPC API
Now that the NodeFeature API has been set enabled by default, the gRPC
mode will be deprecated and with it all flags and features around it.
For nfd-master, flags
-port, -key-file, -ca-file, -cert-file, -verify-node-name, -enable-nodefeature-api
are now marked as deprecated.
For nfd-worker flags
-enable-nodefeature-api, -ca-file, -cert-file, -key-file, -server, -server-name-override
are now marked as deprecated.
Deprecated flags, as well as gRPC related code will be removed in future
releases.
Signed-off-by: Carlos Eduardo Arango Gutierrez <eduardoa@nvidia.com>
Co-authored-by: Markus Lehtonen <markus.lehtonen@intel.com>
2023-09-06 08:22:13 +00:00
2020-09-08 17:16:17 +00:00
You can run NFD locally, either directly on your host OS or in containers for
testing and development purposes. This may be useful e.g. for checking
features-detection.
### NFD-Master
When running as a standalone container labeling is expected to fail because
2021-02-24 12:29:07 +00:00
Kubernetes API is not available. Thus, it is recommended to use `-no-publish`
2024-03-18 13:51:28 +00:00
Also specify `-crd-controller=false` and `-feature-gates NodeFeatureAPI=false`
Deprecate gRPC API
Now that the NodeFeature API has been set enabled by default, the gRPC
mode will be deprecated and with it all flags and features around it.
For nfd-master, flags
-port, -key-file, -ca-file, -cert-file, -verify-node-name, -enable-nodefeature-api
are now marked as deprecated.
For nfd-worker flags
-enable-nodefeature-api, -ca-file, -cert-file, -key-file, -server, -server-name-override
are now marked as deprecated.
Deprecated flags, as well as gRPC related code will be removed in future
releases.
Signed-off-by: Carlos Eduardo Arango Gutierrez <eduardoa@nvidia.com>
Co-authored-by: Markus Lehtonen <markus.lehtonen@intel.com>
2023-09-06 08:22:13 +00:00
command line flags to disable CRD controller and enable gRPC. E.g.
2020-10-20 17:50:46 +00:00
```bash
2020-11-20 14:48:57 +00:00
$ export NFD_CONTAINER_IMAGE={{ site.container_image }}
2024-03-18 13:51:28 +00:00
$ docker run --rm --name=nfd-test ${NFD_CONTAINER_IMAGE} nfd-master -no-publish -crd-controller=false -feature-gates NodeFeatureAPI=false
2020-09-08 17:16:17 +00:00
2019/02/01 14:48:21 Node Feature Discovery Master < NFD_VERSION >
2019/02/01 14:48:21 gRPC server serving on port: 8080
```
### NFD-Worker
2023-12-01 13:55:45 +00:00
To run nfd-worker as a "stand-alone" container you need to run it in the same
network namespace as the nfd-master container:
2020-10-20 17:50:46 +00:00
```bash
2024-03-18 13:51:28 +00:00
$ docker run --rm --network=container:nfd-test ${NFD_CONTAINER_IMAGE} nfd-worker -feature-gates NodeFeatureAPI=false
2020-09-08 17:16:17 +00:00
2019/02/01 14:48:56 Node Feature Discovery Worker < NFD_VERSION >
...
```
2020-10-20 17:50:46 +00:00
2020-09-08 17:16:17 +00:00
If you just want to try out feature discovery without connecting to nfd-master,
2021-02-24 12:29:07 +00:00
pass the `-no-publish` flag to nfd-worker.
2020-09-08 17:16:17 +00:00
2023-08-03 10:38:07 +00:00
> **NOTE:** Some feature sources need certain directories and/or files from the
> host mounted inside the NFD container. Thus, you need to provide Docker with
2023-12-01 13:55:45 +00:00
> the correct `--volume` options for them to work correctly when run
2023-08-03 10:38:07 +00:00
> stand-alone directly with `docker run`. See
> the [default deployment](https://github.com/kubernetes-sigs/node-feature-discovery/blob/{{site.release}}/deployment/components/common/worker-mounts.yaml)
> for up-to-date information about the required volume mounts.
2020-09-08 17:16:17 +00:00
2021-01-20 21:49:41 +00:00
### NFD-Topology-Updater
2023-12-01 13:55:45 +00:00
To run nfd-topology-updater as a "stand-alone" container
Deprecate gRPC API
Now that the NodeFeature API has been set enabled by default, the gRPC
mode will be deprecated and with it all flags and features around it.
For nfd-master, flags
-port, -key-file, -ca-file, -cert-file, -verify-node-name, -enable-nodefeature-api
are now marked as deprecated.
For nfd-worker flags
-enable-nodefeature-api, -ca-file, -cert-file, -key-file, -server, -server-name-override
are now marked as deprecated.
Deprecated flags, as well as gRPC related code will be removed in future
releases.
Signed-off-by: Carlos Eduardo Arango Gutierrez <eduardoa@nvidia.com>
Co-authored-by: Markus Lehtonen <markus.lehtonen@intel.com>
2023-09-06 08:22:13 +00:00
you need to run it in with the `-no-publish` flag to disable communication to
the Kubernetes apiserver.
2021-01-20 21:49:41 +00:00
```bash
Deprecate gRPC API
Now that the NodeFeature API has been set enabled by default, the gRPC
mode will be deprecated and with it all flags and features around it.
For nfd-master, flags
-port, -key-file, -ca-file, -cert-file, -verify-node-name, -enable-nodefeature-api
are now marked as deprecated.
For nfd-worker flags
-enable-nodefeature-api, -ca-file, -cert-file, -key-file, -server, -server-name-override
are now marked as deprecated.
Deprecated flags, as well as gRPC related code will be removed in future
releases.
Signed-off-by: Carlos Eduardo Arango Gutierrez <eduardoa@nvidia.com>
Co-authored-by: Markus Lehtonen <markus.lehtonen@intel.com>
2023-09-06 08:22:13 +00:00
$ docker run --rm ${NFD_CONTAINER_IMAGE} nfd-topology-updater -no-publish
2021-01-20 21:49:41 +00:00
2019/02/01 14:48:56 Node Feature Discovery Topology Updater < NFD_VERSION >
...
```
2023-11-28 18:00:40 +00:00
If you just want to try out resource topology discovery without connecting to
the Kubernetes API, pass the `-no-publish` flag to nfd-topology-updater.
2021-01-20 21:49:41 +00:00
2023-08-03 10:38:07 +00:00
> **NOTE:** NFD topology updater needs certain directories and/or files from
> the host mounted inside the NFD container. Thus, you need to provide Docker
2023-12-01 13:55:45 +00:00
> with the correct `--volume` options for them to work correctly when
2023-08-03 10:38:07 +00:00
> run stand-alone directly with `docker run`. See
> the [template spec](https://github.com/kubernetes-sigs/node-feature-discovery/blob/{{site.release}}/deployment/components/topology-updater/topologyupdater-mounts.yaml)
> for up-to-date information about the required volume mounts.
2021-01-20 21:49:41 +00:00
2022-08-30 08:24:08 +00:00
## Running with Tilt
Another option for building NFD locally is via Tilt tool, which can build container
images, push them to a local registry and reload your Kubernetes pods automatically.
When using Tilt, you don't have to build container images and re-deploy your pods
manually but instead let the Tilt take care of it. Tiltfile is a configuration file
2023-02-16 14:08:00 +00:00
for the Tilt and is located at the root directory. To develop NFD with Tilt, follow
2022-08-30 08:24:08 +00:00
the steps below.
### Prerequisites
1. Install [Docker ](https://docs.docker.com/engine/install/ )
1. Setup Docker as a non-root user.
1. Install [kubectl ](https://kubernetes.io/docs/tasks/tools/ )
1. Install [kustomize ](https://github.com/kubernetes-sigs/kustomize )
1. Install [tilt ](https://docs.tilt.dev/install.html )
1. Create a local Kubernetes cluster
2023-11-28 18:27:33 +00:00
To start up your Tilt development environment, run
2022-08-30 08:24:08 +00:00
```shell
tilt up
```
at the root of your local NFD codebase. Tilt will start a web interface in the
localhost and port 10350. From the web interface, you are able to see how NFD worker
and master are progressing, watch their build and runtime logs. Once your code changes
are saved locally, Tilt will notice it and re-build the container image from the
current code, push the image to the registry and re-deploy NFD pods with the latest
container image.
### Environment variables
To override environment variables used in the Tiltfile during image build,
export them in your current terminal before starting Tilt.
```shell
export IMAGE_TAG_NAME="v1"
tilt up
```
This will override the default value(`master`) of `IMAGE_TAG_NAME` variable defined
in the Tiltfile.
2020-09-08 17:16:17 +00:00
## Documentation
2020-11-02 08:48:17 +00:00
All documentation resides under the
2021-02-25 11:49:02 +00:00
[docs ](https://github.com/kubernetes-sigs/node-feature-discovery/tree/{{site.release}}/docs )
2020-11-02 08:48:17 +00:00
directory in the source tree. It is designed to be served as a html site by
[GitHub Pages ](https://pages.github.com/ ).
2020-10-01 06:25:52 +00:00
2023-12-01 13:55:45 +00:00
Building the documentation is containerized to fix the build
2020-10-01 06:25:52 +00:00
environment. The recommended way for developing documentation is to run:
```bash
make site-serve
```
This will build the documentation in a container and serve it under
[localhost:4000/ ](http://localhost:4000/ ) making it easy to verify the results.
Any changes made to the `docs/` will automatically re-trigger a rebuild and are
2023-11-28 18:27:33 +00:00
reflected in the served content and can be inspected with a browser refresh.
2020-10-01 06:25:52 +00:00
2023-12-01 13:55:45 +00:00
To just build the html documentation run:
2020-10-01 06:25:52 +00:00
```bash
make site-build
```
This will generate html documentation under `docs/_site/` .
2020-11-02 08:48:17 +00:00
<!-- Links -->
2021-01-20 21:49:41 +00:00
[e2e-config-sample]: https://github.com/kubernetes-sigs/node-feature-discovery/blob/{{site.release}}/test/e2e/e2e-test-config.exapmle.yaml
[podresource-api]: https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#monitoring-device-plugin-resources
[feature-gate]: https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates