2016-07-12 16:44:03 -07:00
|
|
|
# CPU Feature Discovery for Kubernetes
|
2016-07-12 02:30:49 +02:00
|
|
|
|
2016-07-14 14:17:27 -07:00
|
|
|
[](https://travis-ci.com/intelsdi-x/dbi-iafeature-discovery)
|
|
|
|
|
2016-07-12 16:44:03 -07:00
|
|
|
- [Overview](#overview)
|
|
|
|
- [Getting Started](#getting-started)
|
|
|
|
* [System Requirements](#system-requirements)
|
|
|
|
* [Usage](#usage)
|
|
|
|
- [Building from source](#building-from-source)
|
2016-07-14 16:56:43 +02:00
|
|
|
- [Targeting Nodes with Specific Features](#targeting-nodes-with-specific-features)
|
2016-07-12 16:44:03 -07:00
|
|
|
- [License](#license)
|
|
|
|
|
|
|
|
## Overview
|
|
|
|
|
|
|
|
This software enables Intel Architecture (IA) feature discovery for Kubernetes.
|
|
|
|
It detects CPU features available on each node in a Kubernetes cluster, such as
|
|
|
|
Intel [Resource Director Technology][intel-rdt] and advertises those
|
|
|
|
features using node labels.
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
|
|
|
### Other Features (Partial List)
|
|
|
|
|
|
|
|
| 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)
|
|
|
|
|
|
|
|
The published node labels encode a few pieces of information:
|
|
|
|
|
|
|
|
- A "namespace" to denote vendor-specific information
|
|
|
|
(`node.alpha.intel.com`).
|
2016-07-14 14:17:27 -07:00
|
|
|
- The version of this discovery code that wrote the label, for example
|
|
|
|
`"node.alpha.intel.com/dbi-iafeature-discovery.version": "v0.1.0"`.
|
|
|
|
The value of this label corresponds to the output from
|
|
|
|
`git describe --tags --dirty --always`.
|
2016-07-12 16:44:03 -07:00
|
|
|
- The relevant hardware component each label describes (e.g. `cpu`).
|
|
|
|
- The name of the discovered feature as it appears in the underlying
|
|
|
|
source, mostly `cpuid` (e.g. `AESNI`).
|
|
|
|
|
|
|
|
_Note: only features that are available on a given node are labeled, so the
|
|
|
|
only label value published is the string `"true"`. This feature discovery code
|
2016-07-14 16:56:43 +02:00
|
|
|
will not add a label with the value `"false"` for features that are not
|
2016-07-12 16:44:03 -07:00
|
|
|
present._
|
|
|
|
|
|
|
|
```
|
2016-07-14 20:50:57 +02:00
|
|
|
"node.alpha.intel.com/v0.1.0-cpu-<feature-name>": "true"
|
2016-07-12 16:44:03 -07:00
|
|
|
```
|
2016-07-12 02:30:49 +02:00
|
|
|
|
|
|
|
### System Requirements
|
2016-07-12 16:44:03 -07:00
|
|
|
|
2016-07-12 02:30:49 +02:00
|
|
|
At a minimum, you will need:
|
|
|
|
|
2016-07-12 16:44:03 -07:00
|
|
|
1. Linux (x86_64)
|
|
|
|
1. [kubectl] [kubectl-setup] (properly set up and configured to work with your Kubernetes cluster)
|
|
|
|
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 02:30:49 +02:00
|
|
|
|
|
|
|
```
|
2016-07-12 16:44:03 -07:00
|
|
|
./label-nodes.sh
|
2016-07-12 02:30:49 +02:00
|
|
|
```
|
|
|
|
|
2016-07-12 16:44:03 -07:00
|
|
|
The discovery script will launch a job on each each unlabeled node in the
|
|
|
|
cluster. When the job runs, it contacts the Kubernetes API server to add
|
|
|
|
labels to the node to advertise hardware features (initially, from `cpuid` and
|
|
|
|
RDT).
|
|
|
|
|
|
|
|
## Building from source
|
|
|
|
|
|
|
|
Download the source code.
|
|
|
|
|
2016-07-12 02:30:49 +02:00
|
|
|
```
|
2016-07-12 16:44:03 -07:00
|
|
|
git clone https://github.com/intelsdi-x/dbi-iafeature-discovery
|
2016-07-12 02:30:49 +02:00
|
|
|
```
|
|
|
|
|
2016-07-18 12:35:38 -07:00
|
|
|
**Build the Docker image:**
|
2016-07-12 02:30:49 +02:00
|
|
|
|
|
|
|
```
|
2016-07-12 16:44:03 -07:00
|
|
|
cd <project-root>
|
|
|
|
docker build -t <user-name>/<image-name> .
|
2016-07-12 02:30:49 +02:00
|
|
|
```
|
2016-07-12 16:44:03 -07:00
|
|
|
|
|
|
|
Push the Docker Image (optional)
|
|
|
|
|
2016-07-12 02:30:49 +02:00
|
|
|
```
|
2016-07-12 16:44:03 -07:00
|
|
|
docker push
|
2016-07-12 02:30:49 +02:00
|
|
|
```
|
|
|
|
|
2016-07-18 12:35:38 -07:00
|
|
|
**Change the job spec to use your custom image (optional):**
|
2016-07-12 16:44:03 -07:00
|
|
|
|
|
|
|
To use your published image from the step above instead of the
|
|
|
|
`intelsdi/nodelabels` image, edit line 40 in the file
|
2016-07-18 12:35:38 -07:00
|
|
|
[dbi-iafeature-discovery-job.json.template](dbi-iafeature-discovery-job.json.template)
|
|
|
|
to the new location (`<user>/<image-name>`).
|
2016-07-12 16:44:03 -07:00
|
|
|
|
2016-07-14 16:56:43 +02:00
|
|
|
## Targeting Nodes with Specific Features
|
|
|
|
|
2016-07-18 12:35:38 -07:00
|
|
|
Nodes with specific features can be targeted using the `nodeSelector` field.
|
|
|
|
The following example shows how to target the Intel RDT L3 cache allocation
|
|
|
|
(RDTL3CA) feature.
|
2016-07-14 16:56:43 +02:00
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"apiVersion": "v1",
|
|
|
|
"kind": "Pod",
|
|
|
|
"metadata": {
|
|
|
|
"labels": {
|
|
|
|
"env": "test"
|
|
|
|
},
|
|
|
|
"name": "golang-test"
|
|
|
|
},
|
|
|
|
"spec": {
|
|
|
|
"containers": [
|
|
|
|
{
|
|
|
|
"image": "golang",
|
|
|
|
"name": "go1",
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"nodeSelector": {
|
2016-07-14 20:50:57 +02:00
|
|
|
"node.alpha.intel.com/v0.1.0-cpu-RDTL3CA": "true"
|
2016-07-14 16:56:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
For more details on targeting nodes, see [node selection][node-sel].
|
|
|
|
|
|
|
|
|
2016-07-12 16:44:03 -07:00
|
|
|
## License
|
|
|
|
|
|
|
|
This is open source software released under the [Apache 2.0 License](LICENSE).
|
|
|
|
|
|
|
|
<!-- Links -->
|
2016-07-12 02:30:49 +02:00
|
|
|
[intel-rdt]: http://www.intel.com/content/www/us/en/architecture-and-technology/resource-director-technology.html
|
|
|
|
[docker-down]: https://docs.docker.com/engine/installation/
|
|
|
|
[golang-down]: https://golang.org/dl/
|
|
|
|
[gcc-down]: https://gcc.gnu.org/
|
|
|
|
[kubectl-setup]: https://coreos.com/kubernetes/docs/latest/configure-kubectl.html
|
|
|
|
[balaji-github]: https://github.com/balajismaniam
|
2016-07-14 16:56:43 +02:00
|
|
|
[node-sel]: http://kubernetes.io/docs/user-guide/node-selection/
|