Skip to content

Commit bf4f8c2

Browse files
author
Nicolas Takashi
committed
[CHORE] adding ebpf collector
Signed-off-by: Nicolas Takashi <nicolas.takashi@coralogix.com>
1 parent 8eff58c commit bf4f8c2

14 files changed

Lines changed: 1194 additions & 0 deletions
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{{/*
2+
Fully qualified app name for the kernel-collector daemonset.
3+
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
4+
If release name contains chart name it will be used as a full name.
5+
*/}}
6+
{{- define "opentelemetry-collector-kernel-collector.fullname" -}}
7+
{{- $name := default .Chart.Name .Values.nameOverride -}}
8+
{{- if contains $name .Release.Name -}}
9+
{{- printf "%s-kernel-collector" .Release.Name | trunc 63 | trimSuffix "-" -}}
10+
{{- else -}}
11+
{{- printf "%s-%s-kernel-collector" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
12+
{{- end -}}
13+
{{- end -}}
14+
15+
{{/*
16+
Fully qualified app name for the reducer deployment.
17+
*/}}
18+
{{- define "opentelemetry-collector-reducer.fullname" -}}
19+
{{- $name := default .Chart.Name .Values.nameOverride -}}
20+
{{- if contains $name .Release.Name -}}
21+
{{- printf "%s-reducer" .Release.Name | trunc 63 | trimSuffix "-" -}}
22+
{{- else -}}
23+
{{- printf "%s-%s-reducer" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
24+
{{- end -}}
25+
{{- end -}}
26+
27+
{{/*
28+
Fully qualified app name for the k8s-collector deployment.
29+
*/}}
30+
{{- define "opentelemetry-collector-k8s-collector.fullname" -}}
31+
{{- $name := default .Chart.Name .Values.nameOverride -}}
32+
{{- if contains $name .Release.Name -}}
33+
{{- printf "%s-k8s-collector" .Release.Name | trunc 63 | trimSuffix "-" -}}
34+
{{- else -}}
35+
{{- printf "%s-%s-k8s-collector" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
36+
{{- end -}}
37+
{{- end -}}
38+
39+
{{/*
40+
Fully qualified app name for the cloud-collector deployment.
41+
*/}}
42+
{{- define "opentelemetry-collector-cloud-collector.fullname" -}}
43+
{{- $name := default .Chart.Name .Values.nameOverride -}}
44+
{{- if contains $name .Release.Name -}}
45+
{{- printf "%s-cloud-collector" .Release.Name | trunc 63 | trimSuffix "-" -}}
46+
{{- else -}}
47+
{{- printf "%s-%s-cloud-collector" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
48+
{{- end -}}
49+
{{- end -}}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
{{- if and .Values.ebpfCollector.enabled .Values.ebpfCollector.cloudCollector.enabled }}
2+
apiVersion: apps/v1
3+
kind: Deployment
4+
metadata:
5+
name: {{ include "opentelemetry-collector-cloud-collector.fullname" . }}
6+
labels:
7+
{{- include "opentelemetry-collector.labels" . | nindent 4 }}
8+
spec:
9+
progressDeadlineSeconds: 600
10+
replicas: 1
11+
revisionHistoryLimit: 3
12+
selector:
13+
matchLabels:
14+
app.kubernetes.io/name: {{ include "opentelemetry-collector-cloud-collector.fullname" . }}
15+
app.kubernetes.io/instance: {{ .Release.Name }}
16+
strategy:
17+
type: RollingUpdate
18+
template:
19+
metadata:
20+
labels:
21+
app.kubernetes.io/name: {{ include "opentelemetry-collector-cloud-collector.fullname" . }}
22+
app.kubernetes.io/instance: {{ .Release.Name }}
23+
spec:
24+
{{- if .Values.ebpfCollector.imagePullSecrets }}
25+
imagePullSecrets:
26+
{{- range .Values.ebpfCollector.imagePullSecrets }}
27+
- name: {{ . }}
28+
{{- end }}
29+
{{- end }}
30+
containers:
31+
- image: "{{ default .Values.ebpfCollector.images.repository .Values.ebpfCollector.cloudCollector.image.repository }}/{{ .Values.ebpfCollector.cloudCollector.image.name }}:{{ default .Values.ebpfCollector.images.tag .Values.ebpfCollector.cloudCollector.image.tag }}"
32+
imagePullPolicy: {{ .Values.ebpfCollector.images.pullPolicy }}
33+
name: cloud-collector
34+
{{- if hasKey .Values.ebpfCollector.cloudCollector "resources" }}
35+
resources:
36+
{{ toYaml .Values.ebpfCollector.cloudCollector.resources | indent 10 }}
37+
{{- end }}
38+
args:
39+
{{- if .Values.ebpfCollector.log.console }}
40+
- --log-console
41+
{{- end }}
42+
{{- if hasKey .Values.ebpfCollector.log "level" }}
43+
- --{{ .Values.ebpfCollector.log.level }}
44+
{{- end }}
45+
{{- if hasKey .Values.ebpfCollector.cloudCollector "log" -}}
46+
{{- if hasKey .Values.ebpfCollector.cloudCollector.log "whitelist" }}
47+
{{- if hasKey .Values.ebpfCollector.cloudCollector.log.whitelist "channel" }}
48+
- --log-whitelist-channel={{ .Values.ebpfCollector.cloudCollector.log.whitelist.channel }}
49+
{{- end }}
50+
{{- if hasKey .Values.ebpfCollector.cloudCollector.log.whitelist "component" }}
51+
- --log-whitelist-component={{ .Values.ebpfCollector.cloudCollector.log.whitelist.component }}
52+
{{- end }}
53+
{{- if hasKey .Values.ebpfCollector.cloudCollector.log.whitelist "cloudPlatform" }}
54+
- --log-whitelist-cloud-platform={{ .Values.ebpfCollector.cloudCollector.log.whitelist.cloudPlatform }}
55+
{{- end }}
56+
{{- end }}
57+
{{- end }}
58+
{{- if .Values.ebpfCollector.cloudCollector.additionalArgs }}
59+
{{ toYaml .Values.ebpfCollector.cloudCollector.additionalArgs | indent 10 }}
60+
{{- end }}
61+
env:
62+
- name: "EBPF_NET_CLUSTER_NAME"
63+
value: {{ tpl (.Values.ebpfCollector.clusterName | toYaml) . }}
64+
{{- if hasKey .Values "debug" }}
65+
{{- if (default false .Values.ebpfCollector.debug.enabled) }}
66+
- name: "EBPF_NET_DEBUG_MODE"
67+
value: "true"
68+
{{- end }}
69+
{{- end }}
70+
{{- if (default false .Values.ebpfCollector.cloudCollector.runUnderGDB) }}
71+
- name: "EBPF_NET_RUN_UNDER_GDB"
72+
value: "gdb"
73+
{{- end }}
74+
- name: "EBPF_NET_INTAKE_HOST"
75+
value: {{ include "opentelemetry-collector-reducer.fullname" . }}
76+
- name: "EBPF_NET_INTAKE_PORT"
77+
value: "{{ default 7000 .Values.ebpfCollector.reducer.telemetryPort }}"
78+
{{- if hasKey .Values "debug" }}
79+
{{- if (default false .Values.ebpfCollector.debug.storeMinidump) }}
80+
- name: "EBPF_NET_MINIDUMP_DIR"
81+
value: "/hostfs/var/run/network-explorer/minidump"
82+
{{- end }}
83+
{{- end }}
84+
{{- if .Values.ebpfCollector.cloudCollector.env }}
85+
{{ toYaml .Values.ebpfCollector.cloudCollector.env | indent 10 }}
86+
{{- end }}
87+
{{- if hasKey .Values "debug" }}
88+
{{- if (default false .Values.ebpfCollector.debug.storeMinidump) }}
89+
volumeMounts:
90+
- mountPath: /hostfs/var/run/network-explorer
91+
name: host-var-run-network-explorer
92+
readOnly: false
93+
volumes:
94+
- name: host-var-run-network-explorer
95+
hostPath:
96+
path: /var/run/network-explorer
97+
type: DirectoryOrCreate
98+
{{- end }}
99+
{{- end }}
100+
terminationGracePeriodSeconds: 30
101+
securityContext: {}
102+
serviceAccountName: {{ include "opentelemetry-collector.serviceAccountName" . }}
103+
{{- with .Values.ebpfCollector.cloudCollector.nodeSelector }}
104+
nodeSelector:
105+
{{ toYaml . | indent 8}}
106+
{{- end }}
107+
{{- with .Values.ebpfCollector.cloudCollector.affinity }}
108+
affinity:
109+
{{ toYaml . | indent 8 }}
110+
{{- end }}
111+
{{- with .Values.ebpfCollector.cloudCollector.tolerations }}
112+
tolerations:
113+
{{ toYaml . | indent 8 }}
114+
{{- end }}
115+
{{- end }}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{{- if .Values.ebpfCollector.enabled}}
2+
## TODO: Review Cluster Name
3+
apiVersion: v1
4+
kind: ConfigMap
5+
metadata:
6+
name: {{ include "opentelemetry-collector.fullname" . }}-config
7+
labels:
8+
{{- include "opentelemetry-collector.labels" . | nindent 4 }}
9+
data:
10+
config.yaml: |
11+
labels:
12+
environment: "staging"
13+
{{- end }}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{{- if and .Values.ebpfCollector.enabled .Values.ebpfCollector.rbac.create -}}
2+
apiVersion: rbac.authorization.k8s.io/v1
3+
kind: ClusterRole
4+
metadata:
5+
name: {{ include "opentelemetry-collector-k8s-collector.fullname" . }}
6+
labels:
7+
{{- include "opentelemetry-collector.labels" . | nindent 4 }}
8+
rules:
9+
- apiGroups:
10+
- ""
11+
resources:
12+
- pods
13+
verbs:
14+
- get
15+
- list
16+
- watch
17+
- apiGroups:
18+
- apps
19+
resources:
20+
- replicasets
21+
verbs:
22+
- get
23+
- list
24+
- watch
25+
{{- end -}}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{{- if and .Values.ebpfCollector.enabled .Values.ebpfCollector.rbac.create -}}
2+
apiVersion: rbac.authorization.k8s.io/v1
3+
kind: ClusterRoleBinding
4+
metadata:
5+
name: {{ include "opentelemetry-collector-k8s-collector.fullname" . }}
6+
labels:
7+
{{- include "opentelemetry-collector.labels" . | nindent 4 }}
8+
roleRef:
9+
apiGroup: rbac.authorization.k8s.io
10+
kind: ClusterRole
11+
name: {{ include "opentelemetry-collector-k8s-collector.fullname" . }}
12+
subjects:
13+
- kind: ServiceAccount
14+
name: {{ include "opentelemetry-collector.serviceAccountName" . }}
15+
namespace: {{ .Release.Namespace }}
16+
{{- end -}}
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
{{- if and .Values.ebpfCollector.enabled .Values.ebpfCollector.k8sCollector.enabled }}
2+
# The k8s-collector consists of two services:
3+
# 1) k8s-watcher: talks to the Kubernetes API server to determine the current state of
4+
# the cluster; sets up watches to be notified of subsequent changes to pods, services
5+
# and other resources.
6+
# 2) k8s-relay: relays the information collected by k8s-watcher to the reducer.
7+
apiVersion: apps/v1
8+
kind: Deployment
9+
metadata:
10+
name: {{ include "opentelemetry-collector-k8s-collector.fullname" . }}
11+
labels:
12+
{{- include "opentelemetry-collector.labels" . | nindent 4 }}
13+
spec:
14+
progressDeadlineSeconds: 600
15+
replicas: 1
16+
revisionHistoryLimit: 3
17+
selector:
18+
matchLabels:
19+
app.kubernetes.io/name: {{ include "opentelemetry-collector-k8s-collector.fullname" . }}
20+
app.kubernetes.io/instance: {{ .Release.Name }}
21+
strategy:
22+
type: RollingUpdate
23+
template:
24+
metadata:
25+
annotations:
26+
# This is here to allow us to do "zero-downtime" updates without an image change.
27+
rollingUpdateVersion: "1"
28+
charts.flowmill.com/version: {{ .Chart.Version }}
29+
labels:
30+
app.kubernetes.io/name: {{ include "opentelemetry-collector-k8s-collector.fullname" . }}
31+
app.kubernetes.io/instance: {{ .Release.Name }}
32+
spec:
33+
{{- if .Values.ebpfCollector.imagePullSecrets }}
34+
imagePullSecrets:
35+
{{- range .Values.ebpfCollector.imagePullSecrets }}
36+
- name: {{ . }}
37+
{{- end }}
38+
{{- end }}
39+
containers:
40+
- image: "{{ default .Values.ebpfCollector.images.repository .Values.ebpfCollector.k8sCollector.watcher.image.repository }}/{{ .Values.ebpfCollector.k8sCollector.watcher.image.name }}:{{ default .Values.ebpfCollector.images.tag .Values.ebpfCollector.k8sCollector.watcher.image.tag }}"
41+
imagePullPolicy: {{ .Values.ebpfCollector.images.pullPolicy }}
42+
name: k8s-watcher
43+
{{- if hasKey .Values.ebpfCollector.k8sCollector.watcher "resources" }}
44+
resources:
45+
{{ toYaml .Values.ebpfCollector.k8sCollector.watcher.resources | indent 10 }}
46+
{{- end }}
47+
args:
48+
- --log-console
49+
{{- if hasKey .Values.ebpfCollector.log "level" }}
50+
- --log-level={{ .Values.ebpfCollector.log.level }}
51+
{{- end }}
52+
# k8s-relay, which is a service that the k8s-watcher talks to.
53+
# Currently not configurable, has to be reachable on localhost:8172, so must
54+
# share a pod with the k8s-watcher above.
55+
- image: "{{ default .Values.ebpfCollector.images.repository .Values.ebpfCollector.k8sCollector.relay.image.repository }}/{{ .Values.ebpfCollector.k8sCollector.relay.image.name }}:{{ default .Values.ebpfCollector.images.tag .Values.ebpfCollector.k8sCollector.relay.image.tag }}"
56+
imagePullPolicy: {{ .Values.ebpfCollector.images.pullPolicy }}
57+
name: k8s-relay
58+
{{- if hasKey .Values.ebpfCollector.k8sCollector.relay "resources" }}
59+
resources:
60+
{{ toYaml .Values.ebpfCollector.k8sCollector.relay.resources | indent 10 }}
61+
{{- end }}
62+
args:
63+
- --config-file=/etc/network-explorer/config.yaml
64+
{{- if .Values.ebpfCollector.log.console }}
65+
- --log-console
66+
{{- end }}
67+
{{- if hasKey .Values.ebpfCollector.log "level" }}
68+
- --{{ .Values.ebpfCollector.log.level }}
69+
{{- end }}
70+
{{- if hasKey .Values.ebpfCollector.k8sCollector.relay "log" -}}
71+
{{- if hasKey .Values.ebpfCollector.k8sCollector.relay.log "whitelist" }}
72+
{{- if hasKey .Values.ebpfCollector.k8sCollector.relay.log.whitelist "channel" }}
73+
- --log-whitelist-channel={{ .Values.ebpfCollector.k8sCollector.relay.log.whitelist.channel }}
74+
{{- end }}
75+
{{- if hasKey .Values.ebpfCollector.k8sCollector.relay.log.whitelist "component" }}
76+
- --log-whitelist-component={{ .Values.ebpfCollector.k8sCollector.relay.log.whitelist.component }}
77+
{{- end }}
78+
{{- if hasKey .Values.ebpfCollector.k8sCollector.relay.log.whitelist "cloudPlatform" }}
79+
- --log-whitelist-cloud-platform={{ .Values.ebpfCollector.k8sCollector.relay.log.whitelist.cloudPlatform }}
80+
{{- end }}
81+
{{- end }}
82+
{{- end }}
83+
{{- if .Values.ebpfCollector.k8sCollector.relay.additionalArgs }}
84+
{{ toYaml .Values.ebpfCollector.k8sCollector.relay.additionalArgs | indent 10 }}
85+
{{- end }}
86+
env:
87+
- name: "EBPF_NET_CLUSTER_NAME"
88+
value: {{ tpl (.Values.ebpfCollector.clusterName | toYaml) . }}
89+
{{- if hasKey .Values "debug" }}
90+
{{- if (default false .Values.ebpfCollector.debug.enabled) }}
91+
- name: "EBPF_NET_DEBUG_MODE"
92+
value: "true"
93+
{{- end }}
94+
{{- end }}
95+
{{- if (default false .Values.ebpfCollector.k8sCollector.relay.runUnderGDB) }}
96+
- name: "EBPF_NET_RUN_UNDER_GDB"
97+
value: "gdb"
98+
{{- end }}
99+
- name: "EBPF_NET_INTAKE_HOST"
100+
value: {{ include "opentelemetry-collector-reducer.fullname" . }}
101+
- name: "EBPF_NET_INTAKE_PORT"
102+
value: "{{ default 7000 .Values.ebpfCollector.reducer.telemetryPort }}"
103+
{{- if hasKey .Values "debug" }}
104+
{{- if (default false .Values.ebpfCollector.debug.storeMinidump) }}
105+
- name: "EBPF_NET_MINIDUMP_DIR"
106+
value: "/hostfs/var/run/network-explorer/minidump"
107+
{{- end }}
108+
{{- end }}
109+
{{- if .Values.ebpfCollector.debug.sendUnplannedExitMetric }}
110+
## TODO: Needs to be reviewed.
111+
## it requires a collector running as deployment
112+
- name: "EBPF_NET_CRASH_METRIC_HOST"
113+
value: {{quote (include "opentelemetry-collector.fullname" .) }}
114+
- name: "EBPF_NET_CRASH_METRIC_PORT"
115+
value: {{ .Values.ports.otlp.servicePort | quote }}
116+
{{- end }}
117+
{{- if .Values.ebpfCollector.k8sCollector.relay.env }}
118+
{{ toYaml .Values.ebpfCollector.k8sCollector.relay.env | indent 10 }}
119+
{{- end }}
120+
volumeMounts:
121+
- mountPath: /etc/network-explorer
122+
name: k8s-relay-config
123+
{{- if hasKey .Values "debug" }}
124+
{{- if (default false .Values.ebpfCollector.debug.storeMinidump) }}
125+
- mountPath: /hostfs/var/run/network-explorer
126+
name: host-var-run-network-explorer
127+
readOnly: false
128+
{{- end }}
129+
{{- end }}
130+
terminationGracePeriodSeconds: 30
131+
volumes:
132+
{{- if hasKey .Values "debug" }}
133+
{{- if (default false .Values.ebpfCollector.debug.storeMinidump) }}
134+
- name: host-var-run-network-explorer
135+
hostPath:
136+
path: /var/run/network-explorer
137+
type: DirectoryOrCreate
138+
{{- end }}
139+
{{- end }}
140+
- name: k8s-relay-config
141+
projected:
142+
sources:
143+
- configMap:
144+
name: {{ include "opentelemetry-collector.fullname" . }}-config
145+
items:
146+
- key: config.yaml
147+
path: config.yaml
148+
securityContext: {}
149+
serviceAccountName: {{ include "opentelemetry-collector.serviceAccountName" . }}
150+
{{- with .Values.ebpfCollector.k8sCollector.nodeSelector }}
151+
nodeSelector:
152+
{{ toYaml . | indent 8}}
153+
{{- end }}
154+
{{- with .Values.ebpfCollector.k8sCollector.affinity }}
155+
affinity:
156+
{{ toYaml . | indent 8 }}
157+
{{- end }}
158+
{{- with .Values.ebpfCollector.k8sCollector.tolerations }}
159+
tolerations:
160+
{{ toYaml . | indent 8 }}
161+
{{- end }}
162+
{{- end }}

0 commit comments

Comments
 (0)