From f0c0bf786b971e78fd5fa8e9fb3c89fa61dfb186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Austerm=C3=BChle?= Date: Mon, 22 Nov 2021 10:40:10 +0100 Subject: [PATCH 1/3] Add Helm chart MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stephan Austermühle --- deploy/helm/time-exporter/.helmignore | 23 +++ deploy/helm/time-exporter/Chart.yaml | 6 + deploy/helm/time-exporter/README.md | 48 ++++++ deploy/helm/time-exporter/index.yaml | 14 ++ .../helm/time-exporter/templates/_helpers.tpl | 62 +++++++ .../time-exporter/templates/daemonset.yaml | 114 +++++++++++++ .../helm/time-exporter/templates/service.yaml | 20 +++ .../templates/serviceaccount.yaml | 12 ++ .../templates/tests/test-connection.yaml | 15 ++ .../time-exporter/time-exporter-0.1.1.tgz | Bin 0 -> 4344 bytes deploy/helm/time-exporter/values.yaml | 151 ++++++++++++++++++ 11 files changed, 465 insertions(+) create mode 100644 deploy/helm/time-exporter/.helmignore create mode 100644 deploy/helm/time-exporter/Chart.yaml create mode 100644 deploy/helm/time-exporter/README.md create mode 100644 deploy/helm/time-exporter/index.yaml create mode 100644 deploy/helm/time-exporter/templates/_helpers.tpl create mode 100644 deploy/helm/time-exporter/templates/daemonset.yaml create mode 100644 deploy/helm/time-exporter/templates/service.yaml create mode 100644 deploy/helm/time-exporter/templates/serviceaccount.yaml create mode 100644 deploy/helm/time-exporter/templates/tests/test-connection.yaml create mode 100644 deploy/helm/time-exporter/time-exporter-0.1.1.tgz create mode 100644 deploy/helm/time-exporter/values.yaml diff --git a/deploy/helm/time-exporter/.helmignore b/deploy/helm/time-exporter/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/deploy/helm/time-exporter/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deploy/helm/time-exporter/Chart.yaml b/deploy/helm/time-exporter/Chart.yaml new file mode 100644 index 0000000..5c9b1cb --- /dev/null +++ b/deploy/helm/time-exporter/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: time-exporter +description: Time Exporter +type: application +version: 0.1.1 +appVersion: "0.0.3" diff --git a/deploy/helm/time-exporter/README.md b/deploy/helm/time-exporter/README.md new file mode 100644 index 0000000..34c3810 --- /dev/null +++ b/deploy/helm/time-exporter/README.md @@ -0,0 +1,48 @@ +# Helm Chart for the Time Exporter + +This [Helm](https://helm.sh/) chart deploys the Time Exporter to a +Kubernetes cluster as a +[DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/). + +## Chrony Monitoring Considerations + +Chrony by defaults provides its command channel through a Unix socket. +There is also an additional UDP socket that listens to the loopback +interface only by default (127.0.0.1:323). + +Before actually deploying the Time Exporter to monitor Chrony, check +your access options: + +- When passing the Unix socket (`/var/run/chrony/chronyd.sock`), + ensure that the `time_exporter` process has write access to it. + +- The container cannot access the host’s loopback interface unless the + Pods runs with host network access (`hostNetwork=true`). Consider + securing the endpoint via + [`--web.config`](https://github.com/prometheus/node_exporter#tls-endpoint). + +- Another option is to bind `chronyd` to an accessible IP address and + configure authentication. However, the latter seems to be + unsupported by `time_exporter` currently. + +## Scraping + +Typically, annotating the Kubernetes Service should be sufficient to +make the [Prometheus Service +Discovery](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config) +aware of the Time Exporter and scrape the metrics. + +Example: + +```yaml +service: + annotations: + prometheus.io/scrape: "true" +``` + +## Deployment Configuration (Helm Values) + +See the file `values.yaml` for all available configuration options. + +Do not forget to enable the desired collector. The Helm chart disables +all collectors by default except for the exporter metrics. diff --git a/deploy/helm/time-exporter/index.yaml b/deploy/helm/time-exporter/index.yaml new file mode 100644 index 0000000..36678a9 --- /dev/null +++ b/deploy/helm/time-exporter/index.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +entries: + time-exporter: + - apiVersion: v2 + appVersion: 0.0.3 + created: "2021-11-22T10:38:13.950181758+01:00" + description: Time Exporter + digest: 6df64198080229a804046b4a320e11af57d52208359fd39727b734bea58b1e93 + name: time-exporter + type: application + urls: + - time-exporter-0.1.1.tgz + version: 0.1.1 +generated: "2021-11-22T10:38:13.949249278+01:00" diff --git a/deploy/helm/time-exporter/templates/_helpers.tpl b/deploy/helm/time-exporter/templates/_helpers.tpl new file mode 100644 index 0000000..c80bf2f --- /dev/null +++ b/deploy/helm/time-exporter/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "time-exporter.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "time-exporter.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "time-exporter.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "time-exporter.labels" -}} +helm.sh/chart: {{ include "time-exporter.chart" . }} +{{ include "time-exporter.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "time-exporter.selectorLabels" -}} +app.kubernetes.io/name: {{ include "time-exporter.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "time-exporter.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "time-exporter.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/deploy/helm/time-exporter/templates/daemonset.yaml b/deploy/helm/time-exporter/templates/daemonset.yaml new file mode 100644 index 0000000..0425c27 --- /dev/null +++ b/deploy/helm/time-exporter/templates/daemonset.yaml @@ -0,0 +1,114 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "time-exporter.fullname" . }} + labels: + {{- include "time-exporter.labels" . | nindent 4 }} +spec: + selector: + matchLabels: + {{- include "time-exporter.selectorLabels" . | nindent 6 }} +{{- with .Values.updateStrategy }} + updateStrategy: + {{ . | toYaml | nindent 4 }} +{{- end }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "time-exporter.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "time-exporter.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} +{{- if .Values.priorityClassName }} + priorityClassName: {{ .Values.priorityClassName }} +{{- end }} + hostNetwork: {{ .Values.hostNetwork }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + args: + - --log.level={{ .Values.logging.level }} + - --log.format={{ .Values.logging.format }} + - --collector.disable-defaults +{{- if not .Values.collectors.exporterMetrics }} + - --web.disable-exporter-metrics +{{- end }} +{{- if .Values.collectors.chrony.enabled }} + - --collector.chrony + - --collector.chrony.address={{ .Values.collectors.chrony.address }} +{{- end }} +{{- if .Values.collectors.ntp.enabled }} + - --collector.ntp +{{- end }} +{{- if .Values.collectors.time.enabled }} + - --collector.time +{{- end }} +{{- if .Values.collectors.timex.enabled }} + - --collector.timex +{{- end }} +{{- range $key, $value := .Values.extraArgs }} + - --{{ $key }}={{ $value }} +{{- end }} + ports: + - name: http + containerPort: 9818 + protocol: TCP +{{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: / + port: http + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} +{{- end }} +{{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: / + port: http + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} +{{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} +{{- if and .Values.collectors.chrony.enabled (eq "/" (substr 0 1 .Values.collectors.chrony.address)) }} + volumeMounts: + - name: chrony-socket + mountPath: {{ .Values.collectors.chrony.address }} + readOnly: true +{{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- if and .Values.collectors.chrony.enabled (eq "/" (substr 0 1 .Values.collectors.chrony.address)) }} + volumes: + - name: chrony-socket + hostPath: + path: {{ .Values.collectors.chrony.hostPath }} + type: Socket +{{- end }} diff --git a/deploy/helm/time-exporter/templates/service.yaml b/deploy/helm/time-exporter/templates/service.yaml new file mode 100644 index 0000000..07ab1ee --- /dev/null +++ b/deploy/helm/time-exporter/templates/service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "time-exporter.fullname" . }} + labels: + {{- include "time-exporter.labels" . | nindent 4 }} +{{- with .Values.service.annotations }} + annotations: + {{ . |toYaml |indent 4 }} +{{- end }} +spec: + type: {{ .Values.service.type }} + clusterIP: None + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "time-exporter.selectorLabels" . | nindent 4 }} diff --git a/deploy/helm/time-exporter/templates/serviceaccount.yaml b/deploy/helm/time-exporter/templates/serviceaccount.yaml new file mode 100644 index 0000000..ea9e6db --- /dev/null +++ b/deploy/helm/time-exporter/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "time-exporter.serviceAccountName" . }} + labels: + {{- include "time-exporter.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/deploy/helm/time-exporter/templates/tests/test-connection.yaml b/deploy/helm/time-exporter/templates/tests/test-connection.yaml new file mode 100644 index 0000000..0434e0e --- /dev/null +++ b/deploy/helm/time-exporter/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "time-exporter.fullname" . }}-test-connection" + labels: + {{- include "time-exporter.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "time-exporter.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/deploy/helm/time-exporter/time-exporter-0.1.1.tgz b/deploy/helm/time-exporter/time-exporter-0.1.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..a9049cce6ff16622cc3b87254d7e003fb6946891 GIT binary patch literal 4344 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 Date: Mon, 22 Nov 2021 11:34:59 +0100 Subject: [PATCH 2/3] Add chrony log response logging switch --- deploy/helm/time-exporter/Chart.yaml | 2 +- deploy/helm/time-exporter/templates/daemonset.yaml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/deploy/helm/time-exporter/Chart.yaml b/deploy/helm/time-exporter/Chart.yaml index 5c9b1cb..d317454 100644 --- a/deploy/helm/time-exporter/Chart.yaml +++ b/deploy/helm/time-exporter/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: time-exporter description: Time Exporter type: application -version: 0.1.1 +version: 0.1.2 appVersion: "0.0.3" diff --git a/deploy/helm/time-exporter/templates/daemonset.yaml b/deploy/helm/time-exporter/templates/daemonset.yaml index 0425c27..ac84197 100644 --- a/deploy/helm/time-exporter/templates/daemonset.yaml +++ b/deploy/helm/time-exporter/templates/daemonset.yaml @@ -48,6 +48,9 @@ spec: {{- if .Values.collectors.chrony.enabled }} - --collector.chrony - --collector.chrony.address={{ .Values.collectors.chrony.address }} +{{- if .Values.collectors.chrony.logResponse }} + - --collector.chrony.log-response-json +{{- end }} {{- end }} {{- if .Values.collectors.ntp.enabled }} - --collector.ntp From c6a2de3effd5bf40ca2337a316edfd744d442e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Austerm=C3=BChle?= Date: Mon, 22 Nov 2021 11:35:52 +0100 Subject: [PATCH 3/3] Update index --- deploy/helm/time-exporter/index.yaml | 14 ++++++++++++-- .../helm/time-exporter/time-exporter-0.1.1.tgz | Bin 4344 -> 0 bytes .../helm/time-exporter/time-exporter-0.1.2.tgz | Bin 0 -> 9415 bytes 3 files changed, 12 insertions(+), 2 deletions(-) delete mode 100644 deploy/helm/time-exporter/time-exporter-0.1.1.tgz create mode 100644 deploy/helm/time-exporter/time-exporter-0.1.2.tgz diff --git a/deploy/helm/time-exporter/index.yaml b/deploy/helm/time-exporter/index.yaml index 36678a9..55e0e85 100644 --- a/deploy/helm/time-exporter/index.yaml +++ b/deploy/helm/time-exporter/index.yaml @@ -3,7 +3,17 @@ entries: time-exporter: - apiVersion: v2 appVersion: 0.0.3 - created: "2021-11-22T10:38:13.950181758+01:00" + created: "2021-11-22T11:35:17.606647408+01:00" + description: Time Exporter + digest: 2da94972515e527852708f3ebaa5615af083d48d1cff9b24628b492fdf611edb + name: time-exporter + type: application + urls: + - time-exporter-0.1.2.tgz + version: 0.1.2 + - apiVersion: v2 + appVersion: 0.0.3 + created: "2021-11-22T11:35:17.604661748+01:00" description: Time Exporter digest: 6df64198080229a804046b4a320e11af57d52208359fd39727b734bea58b1e93 name: time-exporter @@ -11,4 +21,4 @@ entries: urls: - time-exporter-0.1.1.tgz version: 0.1.1 -generated: "2021-11-22T10:38:13.949249278+01:00" +generated: "2021-11-22T11:35:17.598863969+01:00" diff --git a/deploy/helm/time-exporter/time-exporter-0.1.1.tgz b/deploy/helm/time-exporter/time-exporter-0.1.1.tgz deleted file mode 100644 index a9049cce6ff16622cc3b87254d7e003fb6946891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4344 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 N|Nku)(hdM*004vhny3H( literal 0 HcmV?d00001