3.1 KiB
Network policy and (later) linkerd policy generator.
Basic idea:
- The kubernetes clusters hosts applications
- Applications communicate to other applications
Allowed communication betwen applications is configured as follows:
communication:
- from: app1
to: app2
ports:
- 80
- linkerd-admin
Ports are optional. When omitted all ports are intended
There are pre-defined applications such as api-server. Beyond that thera are two types of applications:
- cidr: a cidr with possible except clauses following netpol syntax
- app: regular app based on matchLabels, together with namespace name.
Application names must be unique.
There are also standard capablities for an application such as:
- linkerd: addes egress to linkerd-jaeger, egress to linkerd, ingress from linkerd-viz
capablities can also be defined at the namespace level, which means they apply to each pod in the namespace.
networks:
- name: internet
cidr: 0.0.0.0/0
except:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
namespaces:
-
namespace: wamblee-org capabilities:
- linkerd applications:
- name: nexus-server
ports when specified at the application level are used when
not explicitly mentioned when a link is made
ports:- 8081
- 8082 matchLabels: app: nexus-server
-
namespace: exposure applications:
- name: httpd-wamblee-org matchLabels: app: wamblee-org
communications:
- from: # can we support both string and list of strings?
- httpd-wamblee-org to:
- nexus-server
- wamblee-static
- wamblee-safe
or limiting ports further
- from:
- httpd-wamblee-org to:
- nexus-server:8081,8082
Handling of capabilities:
-
capabilities at namespace level apply to each individual pod in the namespace
-
a capability is a list of templates.
Ingress template
from: - linkerd-viz to: - {{ application }}
egress template
from: - {{ application }} to: - linkerd-jaeger - linkerd
The templates are evaluated for an application and then parsed, and added to the allowed communications.
Linkerd extension:
- for each application an optional service account is defined, when not defined, 'default' is assumed.
- together with the communication links this determines the authorization policies.
Technical realization could be in the form of go templates where the input the template is:
- map of app name to definition with for each app also a list of capabilities.
- a single app config with for each app
- all ingresses
- all egresses
Similar and easier technical solution via interface with a network policy implementation and a linkerd implementation.
Then we can have:
- networkpolicy templates
- server, meshtls, networkauthentication, authorization policy
- when linkerd capability for both pods, the tool can generated a meshtlsauthentication, when the target pods does not have linkerd capability, it can be ignored.