congress
congress is a k8s Namespace watcher designed to utilize NetworkPolicy objects to create namespace isolation within a cluster.
First, this is built to satisfy an Apigee use-case, but can easily be repurposed if you are in a similar situation.
When to use
congress is ideal for the cluster manager that has a dedicated pod router, such as the k8s-router, but also wants to control the internal pod-to-pod traffic.
Such a situation is commmon in multi-tenant Kubernetes clusters where it is undesirable to have ClientA pods capable of communication with ClientB pods.
Design
congress primarily uses the Kubernetes Namespace Watch API.
The main functionality can be broken into two parts: Namespace annotation/labelling and NetworkPolicy creation.
For the first piece of functionality, all namespace creation events will be evaluated by congress and isolated if not specifically excluded in either the configurable exclusion list or label. A namespace evaluated by congress needs to have an annotation that locks down all inter/intra-namespace pod traffic. It will be given a label that it's NetworkPolicy objects will use to identify the namespace's pod traffic. An example is below.
kind: Namespace
apiVersion: v1
metadata:
name: test
labels:
name: test # added by congress
annotations:
net.beta.kubernetes.io/network-policy: | # necessary for NetworkPolicies to work
{
"ingress": {
"isolation": "DefaultDeny"
}
}
The idiomatic approach to this would be using an AdmissionController. These are cumbersome to develop and maintain at the moment, so a dedicated Watcher pod is the next best approach.
For the second piece of functionality, upon creation the namespace is given two NetworkPolicy objects that behave as follows:
allow-intra-namespace: this policy allows all pod traffic within the namespace (a.k.a "intra-namespace" traffic)
allow-routing: this policy allows pod traffic from the namespace containing the pod router (a.k.a an "routing bridge").
##Environment
There are a few configurable (some required) environment variables:
CONGRESS_EXCLUDES: a comma separated list of namespaces to exclude from network isolation (default: "kube-system"). Example: "kube-system,default,myImportantNamespace,anotherImportantNamspace"
CONGRESS_SELECTOR: the label selector used by the watcher to filter Namespace events by (default: "" i.e. all namespaces).
Example: "company=apigee,env=test"
CONGRESS_IGNORE_SELECTOR: a label selector used to suplement the excludes list in picking namespaces to ignore (default "" i.e. ignore none)
- required
CONGRESS_ROUTING_NAMESPACE: the namespace containing the pod router that forwards traffic
- required
CONGRESS_ROUTING_LABEL: the key of the label used to identify pod traffic at the namespace level
- required
CONGRESS_ROUTING_POLICY_NAME: the name of the NetworkPolicy that bridges the routing namespace to a tenant namespace