• Stars
    star
    374
  • Rank 114,346 (Top 3 %)
  • Language
    Go
  • License
    BSD 3-Clause "New...
  • Created about 6 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

TelCo grade network management in a Kubernetes cluster

DANM

Build Status Unit Test Coverage

Join our community!

Want to hang-out with us? Join our Slack under https://danmws.slack.com/!

Feel yourself officially invited by clicking on this link!

Want to get more bang for the buck? Check out DANM Utils too!

DANM Utils is the home to independet Operators built on top of the DANM network management platform, providing value added services to your cluster! Interested in adding outage resiliency to your IPAM, or universal network policy support? Look no further and hop over to https://github.com/nokia/danm-utils today!

Table of Contents

Introduction

DANM is Nokia's solution to bring TelCo grade network management into a Kubernetes cluster! DANM has more than 4 years of history inside the company, is currently deployed into production, and it is finally available for everyone, here on GitHub.

The name stands for "Damn, Another Network Manager!", because yes, we know: the last thing the K8s world needed is another TelCo company "revolutionizing" networking in Kubernetes. But still we hope that potential users checking out our project will involuntarily proclaim "DANM, that's some good networking stuff!" :)

Please consider for a moment that there is a whole other world out there, with special requirements, and DANM is the result of those needs! We are certainly not saying DANM is THE network solution, but we think it is a damn good one! Want to learn more about this brave new world? Don't hesitate to contact us, we are always quite happy to share the special requirements we need to satisfy each and every day.

In any case, DANM is more than just a plugin, it is an End-To-End solution to a whole problem domain. It is:

  • a CNI plugin capable of provisioning IPVLAN interfaces with advanced features
  • an in-built IPAM module with the capability of managing multiple, cluster-wide, discontinuous L3 networks with managing up to 8M allocations per network! plus providing dynamic, static, or no IP allocation scheme on-demand for both IPv4, and IPv6
  • a CNI metaplugin capable of attaching multiple network interfaces to a container, either through its own CNI, or through delegating the job to any of the popular CNI solution e.g. SR-IOV, Calico, Flannel etc. in parallel
  • a Kubernetes controller capable of centrally managing both VxLAN and VLAN interfaces of all Kubernetes hosts
  • another Kubernetes controller extending Kubernetes' Service-based service discovery concept to work over all network interfaces of a Pod
  • a standard Kubernetes Validating and Mutating Webhook responsible for making you adhere to the schemas, and also automating network resource management for tenant users in a production-grade environment

Install an Akraino REC and get DANM for free!

Just kidding as DANM is always free, but if you want to install a production grade, open-source Kubernetes-based bare metal CaaS infrastructure by default equipped with DANM and with a single click of a button nonetheless; just head over to Linux Foundation Akraino Radio Edge Cloud (REC) wiki for the Akraino REC Architecture and the Akraino REC Installation Guide Not just for TelCo!

The above functionalities are implemented by the following components:

  • danm is the CNI plugin which can be directly integrated with kubelet. Internally it consists of the CNI metaplugin, the CNI plugin responsible for managing IPVLAN interfaces, and the in-built IPAM plugin. Danm binary is integrated to kubelet as any other CNI plugin.

  • fakeipam is a little program used in natively integrating 3rd party CNI plugins into the DANM ecosystem. It is basically used to echo the result of DANM's in-built IPAM to CNIs DANM delegates operations to. Fakeipam binary should be placed into kubelet's configured CNI plugin directory, next to danm. Fakeipam is a temporary solution, the long-term aim is to separate DANM's IPAM component into a full-fledged, standalone IPAM solution.

  • netwatcher is a Kubernetes Controller watching the Kubernetes API for changes in the DANM related CRD network management APIs. This component is responsible for validating the semantics of network objects, and also for maintaining VxLAN and VLAN host interfaces of all Kubernetes nodes. Netwatcher binary is deployed in Kubernetes as a DaemonSet, running on all nodes.

  • svcwatcher is another Kubernetes Controller monitoring Pod, Service, Endpoint, and DanmEp API paths. This Controller is responsible for extending Kubernetes native Service Discovery to work even for the non-primary networks of the Pod. Svcwatcher binary is deployed in Kubernetes as a DaemonSet, running only on the Kubernetes master nodes in a clustered setup.

  • webhook is a standard Kubernetes Validating and Mutating Webhook. It has multiple, crucial responsibilities:

  • it validates all DANM introduced CRD APIs both syntactically, and semantically both during creation, and modification

  • it automatically mutates parameters only relevant to the internal implementation of DANM into the API objects

  • it automatically assigns physical network resources to the logical networks of tenant users in a production-grade infrastructure

Our philosophy and motivation behind DANM

It is undeniable that TelCo products- even in containerized format- must own physically separated network interfaces, but we have always felt other projects put too much emphasis on this lone fact, and entirely ignored -or were afraid to tackle- the larger issue with Kubernetes. That is: capability to provision multiple network interfaces to Pods is a very limited enhancement if the cloud native feature of Kubernetes cannot be used with those extra interfaces.

This is the very big misconception our solution aims to rectify - we strongly believe that all network interfaces shall be natively supported by K8s, and there are no such things as "primary", or "secondary" network interfaces. Why couldn't NetworkPolicies, Services, LoadBalancers, all of these existing and proven Kubernetes constructs work with all network interfaces? Why couldn't network administrators freely decide which physical networks are reachable by a Pod? In our opinion the answer is quite simple: because networks are not first-class citizens in Kubernetes.

This is the historical reason why DANM's CRD based, abstract network management APIs were born, and why is the whole ecosystem built around the concept of promoting networks to first-class Kubernetes API objects.

This approach opens-up a plethora of possibilities, even with today's Kubernetes core code!

The following chapters will guide you through the description of these features, and will show you how you can leverage them in your Kubernetes cluster.

Scope of the project

You will see at the end of this README that we really went above and beyond what "networks" are in vanilla Kubernetes.

But, DANM core project never did, and will break one core concept: DANM is first and foremost a run-time agnostic standard CNI system for Kubernetes, 100% adhering to the Kubernetes life-cycle management principles.

It is important to state this, because the features DANM provides open up a couple of very enticing, but also very dangerous avenues:

  • what if we would monitor the run-time and provide added high-availability feature based on events happening on that level?
  • what if we could change the networks of existing Pods?

We strongly feel that all such scenarios incompatible with the life-cycle of a standard CNI plugin firmly fall outside the responsibility of the core DANM project. That being said, tell us about your Kubernetes breaking ideas! We are open to accept such plugins into the wider umbrella of the existing eco-system: outside of the core project, but still loosely linked to suite as optional, external components. Just because something doesn't fit into core DANM, it does not mean it can't fit into your cloud! Please visit DANM utils repository for more info.

Deployment

See Deployment Guide.

User guide

See User Guide.

Contributing

Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.

Authors

  • Robert Springer (@rospring) - Initial work (V1 Python), IPAM, Netwatcher, Svcwatcher Nokia
  • Levente Kale (@Levovar) - Initial work (V2 Golang), Documentation, Integration, SCM, UTs, Metaplugin, V4 work Nokia

Special thanks to the original author who started the whole project in 2015 by putting a proprietary network management plugin between Kubelet and Docker; and also for coining the DANM acronym: Peter Braun (@peter-braun)

License

This project is licensed under the 3-Clause BSD License - see the LICENSE

More Repositories

1

kong-oidc

OIDC plugin for Kong
Lua
430
star
2

RED

RED - Robot Editor
Java
343
star
3

TPMCourse

Dockerfile
141
star
4

CloudFlow

A workflow visualization tool for OpenStack Mistral (https://github.com/openstack/mistral)
TypeScript
94
star
5

CPU-Pooler

A Device Plugin for Kubernetes, which exposes the CPU cores as consumable Devices to the Kubernetes scheduler.
Go
92
star
6

awkcc

C
81
star
7

ntt

Modern tools for TTCN-3
Go
68
star
8

srlinux-container-image

Freely distributed official SR Linux container image
Shell
61
star
9

twampy

Python tools for TWAMP and TWAMP light (STAMP)
Python
59
star
10

moler

Moler – library to help build automated tests
Python
58
star
11

7x50_YangModels

49
star
12

ts-serialize-closures

TypeScript Serialization module
TypeScript
44
star
13

wireless-suite

Python
40
star
14

akka-typed-persistence

Event sourcing for Akka Typed
Scala
40
star
15

pysros

Python
40
star
16

ansible-networking-collections

Python
39
star
17

adcs-issuer

Go
39
star
18

code-compass

a contextual search engine for software packages built on import2vec embeddings (https://www.code-compass.com)
Jupyter Notebook
38
star
19

SReXperts

Python
38
star
20

Avro-Schema-Generator

Tool which generates Avro schemas and Java bindings from XML schemas.
Java
37
star
21

robotframework-autoitlibrary

Python
33
star
22

codesearch

Models and datasets for annotated code search.
Jupyter Notebook
33
star
23

ClickNF

C++
30
star
24

consumer-rate-limiting

A consumer rate limiting plugin for Kong (https://getkong.org/)
Lua
30
star
25

pygnmi

Python tools for gNMI
Python
26
star
26

SROS-grpc-services

SROS grpc services
Python
23
star
27

atom-netconf

NETCONF package for the ATOM Editor
CoffeeScript
22
star
28

5g-network-emulator

C++
22
star
29

intel-nuc-router

Scripts to configure an Intel NUC to act as a router
Shell
22
star
30

AttestationEngine

An experimental (but fully functional) Remote Attestation Engine and Applications for TPM2.0 based systems (cloud, edge, IoT etc)
Go
21
star
31

mesos-scala-api

Scala API for Mesos
Scala
21
star
32

etcd-cpp-api

C++ API for etcd
C++
21
star
33

skilltree

A tool to build and share visualised skill-trees
JavaScript
19
star
34

vscode-netconf

TypeScript
18
star
35

LogGPT

Python
18
star
36

jspy

Tool which displays the component properties of any java Swing application.
Java
17
star
37

k8s-ipam

Go
17
star
38

vault_keystone_plugin

A Keystone secret plugin for Vault (https://www.vaultproject.io/)
Go
16
star
39

PyVenvManage

PyVenvManage is a plugin for managing the Python interpreter of Pycharm Projects
Java
16
star
40

minifold

Minifold is a Python module able to interact with various data sources (e.g. CSV, LDAP, SQL, twitter, etc.) and to query/combine/aggregate them with database-like operators.
Python
16
star
41

restful

A powerful RESTful framework for Go.
Go
15
star
42

cppJNI

A C++-Java communication framework, which aim to simplify usage of Java code in C++ code.
C++
15
star
43

git-changelog-generator

Git Changelog Generator
Python
14
star
44

nsp-workflow

Jinja
14
star
45

srlinux-yang-models

Shell
13
star
46

gitcache-ssh

Simple SSH based Git cache
Go
12
star
47

time-series-data-collector

Time series data collector / exporter
Java
12
star
48

vscode-ttcn3

An extension for VS Code which provides support for the TTCN-3 language.
TypeScript
12
star
49

nokia-deployer

Python
11
star
50

web-assembly-self-certifying-compilation-framework

OCaml
10
star
51

OSSMediator

Go
10
star
52

BYONND

Build Your Own Neural Network Design
TypeScript
10
star
53

wiredis

A C++ client for Redis (https://redis.io/)
C++
10
star
54

ncm-issuer

cert-manager extension for integration with Nokia NetGuard Certificate Manager
Go
10
star
55

koredump

REST API for accessing coredumps in Kubernetes cluster.
Python
9
star
56

NCBounds

Python
8
star
57

saltstack-formulas

Saltstack states for various components
SaltStack
8
star
58

PyBGL

PyBGL is a python module allowing to manipulate graphs and common algorithms.
Python
8
star
59

rcm-bluez

Remote Connection Manager (RCM) for Bluetooth
C
8
star
60

unixgame-challenges

Python
8
star
61

7x50_protobufs

8
star
62

sros-ansible

8
star
63

ONAP-VESPA

VESPA: VES-Prometheus Adapter for ONAP
Go
7
star
64

YangModels

7
star
65

samtools

Python tools for the SAM-O interface (NBI for Nokia NSP)
Python
7
star
66

srlinux-ansible-collection

Jinja
7
star
67

causal-digital-twin

Jupyter Notebook
7
star
68

containerd-bench-security

Shell
7
star
69

corteca-cli

Go
7
star
70

regexp-learner

A python module allowing to learn patterns by issuing queries and learning from counter examples.
Python
7
star
71

danm-utils

Go
6
star
72

nlc2cmd-submission-hubris

Jupyter Notebook
6
star
73

networkexposure

6
star
74

netconf-examples

6
star
75

vscode-workflow-manager

TypeScript
6
star
76

pandas-extras

Extension package for the popular Pandas library
Python
5
star
77

radish-bdd-extensions

Python
5
star
78

dynamic-local-pv-provisioner

Go
5
star
79

LearningStore

An application to manage trainings
JavaScript
5
star
80

industrial-application-framework

Go
5
star
81

subcarrier-power-allocation-noma-solver

Python
5
star
82

armadillo-with-fixed-point-support

C++
5
star
83

argocd-krm-plugin-examples

Smarty
5
star
84

Augustus

C
5
star
85

SliM

SliM is a system for efficient NFV state transfers using a statelet interface that we have implemented as an add-on to the Data Plane Development Kit (DPDK), a high-performance packet I/O library. We have evaluated SliM in a testbed and present results that show its benefits in terms of lower delays and lower packet-loss rates.
C
5
star
86

corteca-toolchain

Dockerfile
5
star
87

integratedimputation

Python
4
star
88

ue-nib-library

A library that works together with Nokia’s UEEC xApp
Go
4
star
89

domino-library

Reuse-lib of C++
C++
4
star
90

protobufs

4
star
91

genIndustrialNetTraffic

Python
4
star
92

sonic-platform

Python
4
star
93

crl-remotescript

Library for remote shell commands, SCP, SFTP and Telnet.
Python
4
star
94

clocktick_jumps

A program that detects sudden jumps in different clocks to detect platform latencies
C
4
star
95

ldap-tgen

An LDAP (Lightweight Directory Access Protocol) traffic generator. It can be used for ldap server load testing.
C
4
star
96

NSP-Integration-Bootstrap

Nokia Network Service Platform (NSP) APIs are now exposed and public on nsp.developer.nokia.com . This project gives users, customers and partners a place to start. It provides them with starting sample code and client libraries that they can use to quickly start calling NSP APIs.
Python
4
star
97

vscode-intent-manager

JavaScript
4
star
98

srlinux-ndk-go

Shell
3
star
99

crl-interactivesessions

This project contains collection of pexpect based Robot Framework test libraries.
Python
3
star
100

ECG-PPG-integrated-electronic-stethoscope

C
3
star