2016-07-23 05:13:48 +00:00
# Node feature discovery for [Kubernetes](https://kubernetes.io)
2016-09-23 21:08:03 +00:00
[![Build Status ](https://api.travis-ci.org/kubernetes-incubator/node-feature-discovery.svg?branch=master )](https://travis-ci.com/kubernetes-incubator/node-feature-discovery)
2017-08-14 13:11:23 +00:00
[![Go Report Card ](https://goreportcard.com/badge/github.com/kubernetes-incubator/node-feature-discovery )](https://goreportcard.com/report/github.com/kubernetes-incubator/node-feature-discovery)
2016-09-23 21:08:03 +00:00
2016-07-26 05:44:45 +00:00
- [Overview ](#overview )
2016-08-31 00:04:43 +00:00
- [Command line interface ](#command-line-interface )
- [Feature discovery ](#feature-discovery )
- [Feature sources ](#feature-sources )
- [Feature labels ](#feature-labels )
- [Getting started ](#getting-started )
- [System requirements ](#system-requirements )
- [Usage ](#usage )
2016-07-12 23:44:03 +00:00
- [Building from source ](#building-from-source )
2016-08-31 00:04:43 +00:00
- [Targeting nodes with specific features ](#targeting-nodes-with-specific-features )
- [References ](#references )
2016-07-26 05:44:45 +00:00
- [License ](#license )
2016-09-23 18:08:40 +00:00
- [Demo ](#demo )
2016-07-26 05:44:45 +00:00
2016-09-20 00:12:54 +00:00
_**NOTE:** We are gathering evidence in order to graduate from the Kubernetes incubator. If you are a user of the project, please add yourself to [this list ](https://github.com/kubernetes-incubator/node-feature-discovery/wiki/Users ) with as much detail as you are comfortable providing (name and email optional)._
2016-07-26 05:44:45 +00:00
## Overview
This software enables node feature discovery for Kubernetes. It detects
hardware features available on each node in a Kubernetes cluster, and advertises
those features using node labels.
2016-12-08 22:21:53 +00:00
This project uses GitHub [milestones ](https://github.com/kubernetes-incubator/node-feature-discovery/milestones ) for release planning.
2016-08-31 00:04:43 +00:00
## Command line interface
2016-10-26 00:05:55 +00:00
```
node-feature-discovery.
Usage:
node-feature-discovery [--no-publish --sources=< sources > --label-whitelist=< pattern > ]
node-feature-discovery -h | --help
node-feature-discovery --version
Options:
-h --help Show this screen.
--version Output version and exit.
--sources=< sources > Comma separated list of feature sources.
[Default: cpuid,rdt,pstate]
--no-publish Do not publish discovered features to the
cluster-local Kubernetes API server.
--label-whitelist=< pattern > Regular expression to filter label names to
publish to the Kubernetes API server. [Default: ]
```
2016-08-31 00:04:43 +00:00
## Feature discovery
2016-07-26 05:44:45 +00:00
### Feature sources
2016-07-19 22:35:42 +00:00
The current set of feature sources are the following:
2016-07-26 05:44:45 +00:00
- [CPUID][cpuid] for x86 CPU details
- [Intel Resource Director Technology][intel-rdt]
- [Intel P-State driver][intel-pstate]
### Feature labels
The published node labels encode a few pieces of information:
2016-10-26 22:36:12 +00:00
- A "namespace" (e.g. `node.alpha.kubernetes-incubator.io/nfd` ).
2016-07-26 05:44:45 +00:00
- The version of this discovery code that wrote the label, according to
`git describe --tags --dirty --always` .
- The source for each label (e.g. `cpuid` ).
- The name of the discovered feature as it appears in the underlying
source, (e.g. `AESNI` from cpuid).
_Note: only features that are available on a given node are labeled, so
the only label value published for features is the string `"true"` ._
```json
{
2016-10-26 22:36:12 +00:00
"node.alpha.kubernetes-incubator.io/node-feature-discovery.version": "v0.1.0",
"node.alpha.kubernetes-incubator.io/nfd-cpuid-< feature-name > ": "true",
"node.alpha.kubernetes-incubator.io/nfd-rdt-< feature-name > ": "true",
"node.alpha.kubernetes-incubator.io/nfd-pstate-< feature-name > ": "true"
2016-07-26 05:44:45 +00:00
}
```
2016-08-31 00:04:43 +00:00
The `--sources` flag controls which sources to use for discovery.
2016-10-28 21:40:22 +00:00
_Note: Consecutive runs of node-feature-discovery will update the labels on a
given node. If features are not discovered on a consecutive run, the corresponding
label will be removed. This includes any restrictions placed on the consecutive run,
such as restricting discovered features with the --label-whitelist option._
2016-07-12 23:44:03 +00:00
### Intel Resource Director Technology (RDT) Features
| Feature name | Description |
| :------------: | :---------------------------------------------------------------------------------: |
| RDTMON | Intel Cache Monitoring Technology (CMT) and Intel Memory Bandwidth Monitoring (MBM)
| RDTL3CA | Intel L3 Cache Allocation Technology
| RDTL2CA | Intel L2 Cache Allocation Technology
2016-08-31 00:04:43 +00:00
### CPUID Features (Partial List)
2016-07-12 23:44:03 +00:00
| Feature name | Description |
| :------------: | :----------------------------------------------------------: |
| ADX | Multi-Precision Add-Carry Instruction Extensions (ADX)
| AESNI | Advanced Encryption Standard (AES) New Instructions (AES-NI)
| AVX | Advanced Vector Extensions (AVX)
| AVX2 | Advanced Vector Extensions 2 (AVX2)
| BMI1 | Bit Manipulation Instruction Set 1 (BMI)
| BMI2 | Bit Manipulation Instruction Set 2 (BMI2)
| SSE4.1 | Streaming SIMD Extensions 4.1 (SSE4.1)
| SSE4.2 | Streaming SIMD Extensions 4.2 (SSE4.2)
| SGX | Software Guard Extensions (SGX)
2016-11-14 23:05:45 +00:00
## Getting started
### System requirements
2016-07-12 23:44:03 +00:00
1. Linux (x86_64)
2016-07-19 22:35:42 +00:00
1. [kubectl] [kubectl-setup] (properly set up and configured to work with your
Kubernetes cluster)
2016-07-12 23:44:03 +00:00
1. [Docker] [docker-down] (only required to build and push docker images)
### Usage
Feature discovery is done as a one-shot job. There is an example script in this
repo that demonstrates how to deploy the job to unlabeled nodes.
2016-07-12 00:30:49 +00:00
```
2016-07-12 23:44:03 +00:00
./label-nodes.sh
2016-07-12 00:30:49 +00:00
```
2017-08-13 19:16:45 +00:00
The discovery script will launch a job on each unlabeled node in the
2016-07-19 22:35:42 +00:00
cluster. When the job runs, it contacts the Kubernetes API server to add labels
2016-09-23 18:08:40 +00:00
to the node to advertise hardware features (initially, from `cpuid` , RDT and p-state).
[![asciicast ](https://asciinema.org/a/11wir751y89617oemwnsgli4a.png )](https://asciinema.org/a/11wir751y89617oemwnsgli4a)
2016-07-12 23:44:03 +00:00
## Building from source
Download the source code.
2016-07-12 00:30:49 +00:00
```
2016-08-31 00:04:43 +00:00
git clone https://github.com/kubernetes-incubator/node-feature-discovery
2016-07-12 00:30:49 +00:00
```
2016-07-18 19:35:38 +00:00
**Build the Docker image:**
2016-07-12 00:30:49 +00:00
```
2016-07-12 23:44:03 +00:00
cd < project-root >
2016-07-19 22:35:42 +00:00
make
2016-07-12 00:30:49 +00:00
```
2016-07-12 23:44:03 +00:00
2016-09-02 17:56:56 +00:00
**NOTE: Our default docker image is hosted in quay.io. To override the
`QUAY_REGISTRY_USER` use the `-e` option as follows:
`QUAY_REGISTRY_USER=<my-username> make docker -e` **
2016-07-19 22:35:42 +00:00
2016-07-12 23:44:03 +00:00
Push the Docker Image (optional)
2016-07-12 00:30:49 +00:00
```
2016-09-02 17:56:56 +00:00
docker push < quay-domain-name > /< registry-user > /< image-name > :< version >
2016-07-12 00:30:49 +00:00
```
2016-07-18 19:35:38 +00:00
**Change the job spec to use your custom image (optional):**
2016-07-12 23:44:03 +00:00
To use your published image from the step above instead of the
2016-09-02 17:56:56 +00:00
`quay.io/kubernetes_incubator/node-feature-discovery` image, edit line 40 in the file
2016-08-31 00:04:43 +00:00
[node-feature-discovery-job.json.template ](node-feature-discovery-job.json.template )
2016-09-02 17:56:56 +00:00
to the new location (`< quay-domain-name > /< registry-user > /< image-name > [:< version > ]`).
2016-07-12 23:44:03 +00:00
2016-07-14 14:56:43 +00:00
## Targeting Nodes with Specific Features
2016-07-19 22:35:42 +00:00
Nodes with specific features can be targeted using the `nodeSelector` field. The
following example shows how to target nodes with Intel TurboBoost enabled.
2016-07-14 14:56:43 +00:00
```json
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"labels": {
"env": "test"
},
"name": "golang-test"
},
"spec": {
"containers": [
{
"image": "golang",
"name": "go1",
}
],
"nodeSelector": {
2016-10-26 22:36:12 +00:00
"node.alpha.kubernetes-incubator.io/nfd-pstate-turbo": "true"
2016-07-14 14:56:43 +00:00
}
}
}
```
For more details on targeting nodes, see [node selection][node-sel].
2016-08-31 00:04:43 +00:00
## References
2016-08-01 04:35:52 +00:00
Github issues
- [#28310 ](https://github.com/kubernetes/kubernetes/issues/28310 )
- [#28311 ](https://github.com/kubernetes/kubernetes/issues/28311 )
- [#28312 ](https://github.com/kubernetes/kubernetes/issues/28312 )
[Design proposal ](https://docs.google.com/document/d/1uulT2AjqXjc_pLtDu0Kw9WyvvXm-WAZZaSiUziKsr68/edit )
2016-08-31 20:19:42 +00:00
## Kubernetes Incubator
This is a [Kubernetes Incubator project ](https://github.com/kubernetes/community/blob/master/incubator.md ). The project was established 2016-08-29. The incubator team for the project is:
- Sponsor: Dawn Chen (@dchen1107)
- Champion: David Oppenheimer (@davidopp)
- SIG: sig-node
2016-07-14 14:56:43 +00:00
2016-07-23 05:13:48 +00:00
## License
This is open source software released under the [Apache 2.0 License ](LICENSE ).
2016-07-26 05:44:45 +00:00
2016-09-23 18:08:40 +00:00
## Demo
A demo on the benefits of using node feature discovery can be found in [demo ](demo/ ).
2016-07-26 05:44:45 +00:00
<!-- Links -->
[cpuid]: http://man7.org/linux/man-pages/man4/cpuid.4.html
[intel-rdt]: http://www.intel.com/content/www/us/en/architecture-and-technology/resource-director-technology.html
[intel-pstate]: https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt
2016-07-19 22:35:42 +00:00
[docker-down]: https://docs.docker.com/engine/installation
[golang-down]: https://golang.org/dl
[gcc-down]: https://gcc.gnu.org
2016-07-12 00:30:49 +00:00
[kubectl-setup]: https://coreos.com/kubernetes/docs/latest/configure-kubectl.html
2016-07-19 22:35:42 +00:00
[node-sel]: http://kubernetes.io/docs/user-guide/node-selection