diff --git a/assets/charts/components/node-problem-detector/Chart.yaml b/assets/charts/components/node-problem-detector/Chart.yaml new file mode 100644 index 000000000..5323b063d --- /dev/null +++ b/assets/charts/components/node-problem-detector/Chart.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +name: node-problem-detector +version: "1.8.6" +appVersion: v0.8.5 +home: https://github.com/kubernetes/node-problem-detector +description: | + This chart installs a [node-problem-detector](https://github.com/kubernetes/node-problem-detector) daemonset. This tool aims to make various node problems visible to the upstream layers in cluster management stack. It is a daemon which runs on each node, detects node problems and reports them to apiserver. +icon: https://github.com/kubernetes/kubernetes/raw/master/logo/logo.png +keywords: +- node +- problem +- detector +- monitoring +sources: +- https://github.com/kubernetes/node-problem-detector +- https://kubernetes.io/docs/concepts/architecture/nodes/#condition +maintainers: +- name: max-rocket-internet + email: no-reply@deliveryhero.com +engine: gotpl diff --git a/assets/charts/components/node-problem-detector/README.md b/assets/charts/components/node-problem-detector/README.md new file mode 100644 index 000000000..df061232a --- /dev/null +++ b/assets/charts/components/node-problem-detector/README.md @@ -0,0 +1,90 @@ +# node-problem-detector + +![Version: 1.8.6](https://img.shields.io/badge/Version-1.8.6-informational?style=flat-square) ![AppVersion: v0.8.5](https://img.shields.io/badge/AppVersion-v0.8.5-informational?style=flat-square) + +This chart installs a [node-problem-detector](https://github.com/kubernetes/node-problem-detector) daemonset. This tool aims to make various node problems visible to the upstream layers in cluster management stack. It is a daemon which runs on each node, detects node problems and reports them to apiserver. + +**Homepage:** + +## How to install this chart + +Add Delivery Hero public chart repo: + +```console +helm repo add deliveryhero https://charts.deliveryhero.io/ +``` + +A simple install with default values: + +```console +helm install deliveryhero/node-problem-detector +``` + +To install the chart with the release name `my-release`: + +```console +helm install my-release deliveryhero/node-problem-detector +``` + +To install with some set values: + +```console +helm install my-release deliveryhero/node-problem-detector --set values_key1=value1 --set values_key2=value2 +``` + +To install with custom values file: + +```console +helm install my-release deliveryhero/node-problem-detector -f values.yaml +``` + +## Source Code + +* +* + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| annotations | object | `{}` | | +| env | string | `nil` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| fullnameOverride | string | `""` | | +| hostNetwork | bool | `false` | Run pod on host network Flag to run Node Problem Detector on the host's network. This is typically not recommended, but may be useful for certain use cases. | +| hostPID | bool | `false` | | +| hostpath.logdir | string | `"/var/log/"` | Log directory path on K8s host | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"k8s.gcr.io/node-problem-detector/node-problem-detector"` | | +| image.tag | string | `"v0.8.5"` | | +| imagePullSecrets | list | `[]` | | +| labels | object | `{}` | | +| maxUnavailable | int | `1` | The max pods unavailable during an update | +| metrics.serviceMonitor.additionalLabels | object | `{}` | | +| metrics.serviceMonitor.enabled | bool | `false` | | +| nameOverride | string | `""` | | +| nodeSelector | object | `{}` | | +| priorityClassName | string | `""` | | +| rbac.create | bool | `true` | | +| rbac.pspEnabled | bool | `false` | | +| resources | object | `{}` | | +| securityContext.privileged | bool | `true` | | +| serviceAccount.create | bool | `true` | | +| serviceAccount.name | string | `nil` | | +| settings.custom_monitor_definitions | object | `{}` | Custom plugin monitor config files | +| settings.custom_plugin_monitors | list | `[]` | | +| settings.heartBeatPeriod | string | `"5m0s"` | Syncing interval with API server | +| settings.log_monitors | list | `["/config/kernel-monitor.json","/config/docker-monitor.json"]` | User-specified custom monitor definitions | +| settings.prometheus_address | string | `"0.0.0.0"` | Prometheus exporter address | +| settings.prometheus_port | int | `20257` | Prometheus exporter port | +| tolerations[0].effect | string | `"NoSchedule"` | | +| tolerations[0].operator | string | `"Exists"` | | +| updateStrategy | string | `"RollingUpdate"` | Manage the daemonset update strategy | + +## Maintainers + +| Name | Email | Url | +| ---- | ------ | --- | +| max-rocket-internet | no-reply@deliveryhero.com | | diff --git a/assets/charts/components/node-problem-detector/templates/NOTES.txt b/assets/charts/components/node-problem-detector/templates/NOTES.txt new file mode 100644 index 000000000..4079ae720 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/NOTES.txt @@ -0,0 +1,3 @@ +To verify that the node-problem-detector pods have started, run: + + kubectl --namespace={{ .Release.Namespace }} get pods -l "app.kubernetes.io/name={{ template "node-problem-detector.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" diff --git a/assets/charts/components/node-problem-detector/templates/_helpers.tpl b/assets/charts/components/node-problem-detector/templates/_helpers.tpl new file mode 100644 index 000000000..d3d377646 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/_helpers.tpl @@ -0,0 +1,61 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Expand the name of the chart. +*/}} +{{- define "node-problem-detector.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 "node-problem-detector.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 "node-problem-detector.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* Create the name of the service account to use */}} +{{- define "node-problem-detector.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} +{{ default (include "node-problem-detector.fullname" .) .Values.serviceAccount.name }} +{{- else -}} +{{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the configmap for storing custom monitor definitions +*/}} +{{- define "node-problem-detector.customConfig" -}} +{{- $fullname := include "node-problem-detector.fullname" . -}} +{{- printf "%s-custom-config" $fullname | replace "+" "_" | trunc 63 -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for podSecurityPolicy. +*/}} +{{- define "podSecurityPolicy.apiVersion" -}} +{{- if semverCompare ">=1.10-0" .Capabilities.KubeVersion.GitVersion -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "extensions/v1beta1" -}} +{{- end -}} +{{- end -}} diff --git a/assets/charts/components/node-problem-detector/templates/clusterrole.yaml b/assets/charts/components/node-problem-detector/templates/clusterrole.yaml new file mode 100644 index 000000000..a2b0d4d07 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/clusterrole.yaml @@ -0,0 +1,32 @@ +{{- if .Values.rbac.create -}} +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ template "node-problem-detector.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +rules: +- apiGroups: + - "" + resources: + - nodes + verbs: + - get +- apiGroups: + - "" + resources: + - nodes/status + verbs: + - patch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - update +{{- end -}} diff --git a/assets/charts/components/node-problem-detector/templates/clusterrolebinding.yaml b/assets/charts/components/node-problem-detector/templates/clusterrolebinding.yaml new file mode 100644 index 000000000..725b05ee3 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/clusterrolebinding.yaml @@ -0,0 +1,19 @@ +{{- if .Values.rbac.create -}} +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ template "node-problem-detector.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +subjects: +- kind: ServiceAccount + name: {{ template "node-problem-detector.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ template "node-problem-detector.fullname" . }} + apiGroup: rbac.authorization.k8s.io +{{- end -}} diff --git a/assets/charts/components/node-problem-detector/templates/custom-config-configmap.yaml b/assets/charts/components/node-problem-detector/templates/custom-config-configmap.yaml new file mode 100644 index 000000000..edf754c94 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/custom-config-configmap.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +data: +{{ .Values.settings.custom_monitor_definitions | toYaml | indent 2 }} +kind: ConfigMap +metadata: + name: {{ include "node-problem-detector.customConfig" . }} + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} diff --git a/assets/charts/components/node-problem-detector/templates/daemonset.yaml b/assets/charts/components/node-problem-detector/templates/daemonset.yaml new file mode 100644 index 000000000..094ff1d57 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/daemonset.yaml @@ -0,0 +1,113 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "node-problem-detector.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + {{- range $key, $val := .Values.labels }} + {{ $key }}: {{ $val | quote }} + {{- end}} +spec: + updateStrategy: + type: {{ .Values.updateStrategy }} +{{- if eq .Values.updateStrategy "RollingUpdate"}} + rollingUpdate: + maxUnavailable: {{ .Values.maxUnavailable }} +{{- end}} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app: {{ include "node-problem-detector.name" . }} + template: + metadata: + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app: {{ include "node-problem-detector.name" . }} + {{- range $key, $val := .Values.labels }} + {{ $key }}: {{ $val | quote }} + {{- end}} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/custom-config-configmap.yaml") . | sha256sum }} + scheduler.alpha.kubernetes.io/critical-pod: '' +{{- if .Values.annotations }} +{{ toYaml .Values.annotations | indent 8 }} +{{- end }} + spec: + serviceAccountName: {{ template "node-problem-detector.serviceAccountName" . }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + hostNetwork: {{ .Values.hostNetwork }} + hostPID: {{ .Values.hostPID }} + terminationGracePeriodSeconds: 30 + {{- if .Values.priorityClassName }} + priorityClassName: {{ .Values.priorityClassName | quote }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy | default "IfNotPresent" | quote }} + command: + - "/bin/sh" + - "-c" + - "exec /node-problem-detector --logtostderr --config.system-log-monitor={{- range $index, $monitor := .Values.settings.log_monitors }}{{if ne $index 0}},{{end}}{{ $monitor }}{{- end }} {{- if .Values.settings.custom_plugin_monitors }} --custom-plugin-monitors={{- range $index, $monitor := .Values.settings.custom_plugin_monitors }}{{if ne $index 0}},{{end}}{{ $monitor }}{{- end }} {{- end }} --prometheus-address={{ .Values.settings.prometheus_address }} --prometheus-port={{ .Values.settings.prometheus_port }} --k8s-exporter-heartbeat-period={{ .Values.settings.heartBeatPeriod }}" +{{- if .Values.securityContext }} + securityContext: +{{ toYaml .Values.securityContext | indent 12 }} +{{- end }} + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName +{{- if .Values.env }} +{{ toYaml .Values.env | indent 12 }} +{{- end }} + volumeMounts: + - name: log + mountPath: {{ .Values.hostpath.logdir }} + - name: localtime + mountPath: /etc/localtime + readOnly: true + - name: custom-config + mountPath: /custom-config + readOnly: true +{{- if .Values.extraVolumeMounts }} +{{ toYaml .Values.extraVolumeMounts | indent 12 }} +{{- end }} + ports: + - containerPort: {{ .Values.settings.prometheus_port }} + name: exporter + resources: +{{ toYaml .Values.resources | indent 12 }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} +{{- if .Values.nodeSelector }} + nodeSelector: +{{ toYaml .Values.nodeSelector | indent 8 }} +{{- end }} + volumes: + - name: log + hostPath: + path: {{ .Values.hostpath.logdir }} + - name: localtime + hostPath: + path: /etc/localtime + type: "FileOrCreate" + - name: custom-config + configMap: + name: {{ include "node-problem-detector.customConfig" . }} +{{- if .Values.extraVolumes }} +{{ toYaml .Values.extraVolumes | indent 8 }} +{{- end }} diff --git a/assets/charts/components/node-problem-detector/templates/psp-clusterrole.yaml b/assets/charts/components/node-problem-detector/templates/psp-clusterrole.yaml new file mode 100644 index 000000000..de868177d --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/psp-clusterrole.yaml @@ -0,0 +1,17 @@ +{{- if .Values.rbac.pspEnabled }} +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ template "node-problem-detector.fullname" . }}-psp + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +rules: +- apiGroups: ['extensions'] + resources: ['podsecuritypolicies'] + verbs: ['use'] + resourceNames: + - {{ template "node-problem-detector.fullname" . }} +{{- end }} diff --git a/assets/charts/components/node-problem-detector/templates/psp-clusterrolebinding.yaml b/assets/charts/components/node-problem-detector/templates/psp-clusterrolebinding.yaml new file mode 100644 index 000000000..80cd87789 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/psp-clusterrolebinding.yaml @@ -0,0 +1,19 @@ +{{- if .Values.rbac.pspEnabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ template "node-problem-detector.fullname" . }}-psp + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ template "node-problem-detector.fullname" . }}-psp +subjects: +- kind: ServiceAccount + name: {{ template "node-problem-detector.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +{{- end }} diff --git a/assets/charts/components/node-problem-detector/templates/psp.yaml b/assets/charts/components/node-problem-detector/templates/psp.yaml new file mode 100644 index 000000000..e7d01579a --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/psp.yaml @@ -0,0 +1,40 @@ +{{- if .Values.rbac.pspEnabled }} +apiVersion: {{ template "podSecurityPolicy.apiVersion" . }} +kind: PodSecurityPolicy +metadata: + name: {{ template "node-problem-detector.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +spec: + privileged: true + allowPrivilegeEscalation: true + allowedCapabilities: + - '*' + volumes: + - 'configMap' + - 'emptyDir' + - 'projected' + - 'secret' + - 'downwardAPI' + - 'persistentVolumeClaim' + - 'hostPath' + hostNetwork: {{ .Values.hostNetwork }} + hostIPC: false + hostPID: {{ .Values.hostPID }} + {{- if .Values.hostNetwork }} + hostPorts: + - min: {{ .Values.settings.prometheus_port }} + max: {{ .Values.settings.prometheus_port }} + {{- end }} + runAsUser: + rule: 'RunAsAny' + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'RunAsAny' + fsGroup: + rule: 'RunAsAny' +{{- end }} diff --git a/assets/charts/components/node-problem-detector/templates/service.yaml b/assets/charts/components/node-problem-detector/templates/service.yaml new file mode 100644 index 000000000..f4ebb9b57 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/service.yaml @@ -0,0 +1,22 @@ +{{- if .Values.metrics.serviceMonitor.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "node-problem-detector.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app: {{ include "node-problem-detector.name" . }} + namespace: {{ .Release.Namespace }} +spec: + type: ClusterIP + clusterIP: None + ports: + - name: exporter + port: {{ .Values.settings.prometheus_port }} + protocol: TCP + selector: + app: {{ include "node-problem-detector.name" . }} +{{- end }} diff --git a/assets/charts/components/node-problem-detector/templates/serviceaccount.yaml b/assets/charts/components/node-problem-detector/templates/serviceaccount.yaml new file mode 100644 index 000000000..b656ebc9e --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/serviceaccount.yaml @@ -0,0 +1,11 @@ +{{ if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ template "node-problem-detector.serviceAccountName" . }} + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} diff --git a/assets/charts/components/node-problem-detector/templates/servicemonitor.yaml b/assets/charts/components/node-problem-detector/templates/servicemonitor.yaml new file mode 100644 index 000000000..6487c75a4 --- /dev/null +++ b/assets/charts/components/node-problem-detector/templates/servicemonitor.yaml @@ -0,0 +1,35 @@ +{{- if .Values.metrics.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ template "node-problem-detector.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "node-problem-detector.name" . }} + helm.sh/chart: {{ include "node-problem-detector.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + {{- if .Values.metrics.serviceMonitor.additionalLabels }} +{{ toYaml .Values.metrics.serviceMonitor.additionalLabels | indent 4 }} + {{- end }} + namespace: {{ .Release.Namespace }} +spec: + selector: + matchLabels: + app: {{ include "node-problem-detector.name" . }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + endpoints: + - port: exporter + path: /metrics + interval: 60s + relabelings: + - action: replace + targetLabel: node + sourceLabels: + - __meta_kubernetes_pod_node_name + - action: replace + targetLabel: host_ip + sourceLabels: + - __meta_kubernetes_pod_host_ip +{{- end }} diff --git a/assets/charts/components/node-problem-detector/values.yaml b/assets/charts/components/node-problem-detector/values.yaml new file mode 100644 index 000000000..8a6453965 --- /dev/null +++ b/assets/charts/components/node-problem-detector/values.yaml @@ -0,0 +1,98 @@ +settings: + # Custom monitor definitions to add to Node Problem Detector - to be + # mounted at /custom-config. These are in addition to pre-packaged monitor + # definitions provided within the default docker image available at /config: + # https://github.com/kubernetes/node-problem-detector/tree/master/config + # settings.custom_monitor_definitions -- Custom plugin monitor config files + custom_monitor_definitions: {} + # settings.log_monitors -- User-specified custom monitor definitions + log_monitors: + - /config/kernel-monitor.json + - /config/docker-monitor.json + # - /custom-config/kernel-monitor.json + # - /custom-config/docker-monitor-filelog.json + # An example of activating a custom log monitor definition in + # Node Problem Detector + # - /custom-config/docker-monitor-filelog.json + custom_plugin_monitors: [] + + # settings.prometheus_address -- Prometheus exporter address + prometheus_address: 0.0.0.0 + # settings.prometheus_port -- Prometheus exporter port + prometheus_port: 20257 + + # The period at which k8s-exporter does forcibly sync with apiserver + # settings.heartBeatPeriod -- Syncing interval with API server + heartBeatPeriod: 5m0s + +hostpath: + # hostpath.logdir -- Log directory path on K8s host + logdir: /var/log/ + +image: + repository: k8s.gcr.io/node-problem-detector/node-problem-detector + tag: v0.8.5 + pullPolicy: IfNotPresent + +imagePullSecrets: [] + +nameOverride: "" +fullnameOverride: "" + +rbac: + create: true + pspEnabled: false + +# hostNetwork -- Run pod on host network +# Flag to run Node Problem Detector on the host's network. This is typically +# not recommended, but may be useful for certain use cases. +hostNetwork: false +hostPID: false + +priorityClassName: "" + +securityContext: + privileged: true + +resources: {} + +annotations: {} + +labels: {} + +tolerations: + - effect: NoSchedule + operator: Exists + +serviceAccount: + # Specifies whether a ServiceAccount should be created + create: true + # The name of the ServiceAccount to use. + # If not set and create is true, a name is generated using the fullname template + name: + +affinity: {} + +nodeSelector: {} + +metrics: + serviceMonitor: + enabled: false + additionalLabels: {} + +env: +# - name: FOO +# value: BAR +# - name: POD_NAME +# valueFrom: +# fieldRef: +# fieldPath: metadata.name + +extraVolumes: [] + +extraVolumeMounts: [] + +# updateStrategy -- Manage the daemonset update strategy +updateStrategy: RollingUpdate +# maxUnavailable -- The max pods unavailable during an update +maxUnavailable: 1 diff --git a/ci/aks/aks-cluster.lokocfg.envsubst b/ci/aks/aks-cluster.lokocfg.envsubst index f381aebf9..600cb69f6 100644 --- a/ci/aks/aks-cluster.lokocfg.envsubst +++ b/ci/aks/aks-cluster.lokocfg.envsubst @@ -127,3 +127,7 @@ component "web-ui" { } component "inspektor-gadget" {} + +component "node-problem-detector" { + service_monitor = true +} diff --git a/ci/aws/aws-cluster.lokocfg.envsubst b/ci/aws/aws-cluster.lokocfg.envsubst index bf0428c30..1b7ad4663 100644 --- a/ci/aws/aws-cluster.lokocfg.envsubst +++ b/ci/aws/aws-cluster.lokocfg.envsubst @@ -294,3 +294,7 @@ component "web-ui" { } component "inspektor-gadget" {} + +component "node-problem-detector" { + service_monitor = true +} diff --git a/ci/baremetal/baremetal-cluster.lokocfg.envsubst b/ci/baremetal/baremetal-cluster.lokocfg.envsubst index 3125cbe13..d62ba0040 100644 --- a/ci/baremetal/baremetal-cluster.lokocfg.envsubst +++ b/ci/baremetal/baremetal-cluster.lokocfg.envsubst @@ -59,3 +59,5 @@ cluster "bare-metal" { } component "inspektor-gadget" {} + +component "node-problem-detector" {} diff --git a/ci/packet/packet-cluster.lokocfg.envsubst b/ci/packet/packet-cluster.lokocfg.envsubst index 06eb69ebd..a608b35a5 100644 --- a/ci/packet/packet-cluster.lokocfg.envsubst +++ b/ci/packet/packet-cluster.lokocfg.envsubst @@ -250,3 +250,7 @@ EOF service_monitor = true } } + +component "node-problem-detector" { + service_monitor = true +} diff --git a/cli/cmd/cluster/component.go b/cli/cmd/cluster/component.go index 215957b86..410d53e66 100644 --- a/cli/cmd/cluster/component.go +++ b/cli/cmd/cluster/component.go @@ -32,6 +32,7 @@ import ( "github.com/kinvolk/lokomotive/pkg/components/linkerd" "github.com/kinvolk/lokomotive/pkg/components/metallb" metricsserver "github.com/kinvolk/lokomotive/pkg/components/metrics-server" + nodeproblemdetector "github.com/kinvolk/lokomotive/pkg/components/node-problem-detector" openebsoperator "github.com/kinvolk/lokomotive/pkg/components/openebs-operator" openebsstorageclass "github.com/kinvolk/lokomotive/pkg/components/openebs-storage-class" "github.com/kinvolk/lokomotive/pkg/components/prometheus-operator" @@ -64,6 +65,7 @@ func componentsConfigs() map[string]components.Component { rookceph.Name: rookceph.NewConfig(), velero.Name: velero.NewConfig(), webui.Name: webui.NewConfig(), + nodeproblemdetector.Name: nodeproblemdetector.NewConfig(), } } diff --git a/docs/concepts/components.md b/docs/concepts/components.md index 49bd53984..2ef887f42 100644 --- a/docs/concepts/components.md +++ b/docs/concepts/components.md @@ -92,6 +92,7 @@ Available components: inspektor-gadget metallb metrics-server + node-problem-detector openebs-operator openebs-storage-class prometheus-operator diff --git a/docs/configuration-reference/components/node-problem-detector.md b/docs/configuration-reference/components/node-problem-detector.md new file mode 100644 index 000000000..962e5ff33 --- /dev/null +++ b/docs/configuration-reference/components/node-problem-detector.md @@ -0,0 +1,57 @@ +# node-problem-detector configuration reference for Lokomotive + +## Contents + +* [Introduction](#introduction) +* [Prerequisites](#prerequisites) +* [Configuration](#configuration) +* [Attribute reference](#attribute-reference) +* [Applying](#applying) +* [Deleting](#deleting) + +## Introduction + +[node-problem-detector](https://github.com/kubernetes/node-problem-detector) aims to make various node problems visible to the upstream layers in the cluster management stack. + +It is a daemon that runs on each node, detects node problems and reports them to apiserver. + +## Prerequisites + +* A Lokomotive cluster accessible via `kubectl`. + +## Configuration + +```tf +# node-problem-detector.lokocfg +component "node-problem-detector" { + custom_monitors = [file("system-stats-monitor.json")] +} +``` + +## Attribute reference + +Table of all the arguments accepted by the component. + +Example: + +| Argument | Description | Default | Type | Required | +|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|--------|----------| +| `custom_monitors` | List of paths to system log monitor configuration files. [See](https://github.com/kubernetes/node-problem-detector/tree/master/config) for more custom monitors. | list(string) | string | false | +| `service_monitor` | Specifies how metrics can be retrieved from a set of services. | false | bool | false | + + +## Applying + +To apply the node-problem-detector component: + +```bash +lokoctl component apply node-problem-detector +``` + +## Deleting + +To destroy the component: + +```bash +lokoctl component delete node-problem-detector +``` diff --git a/pkg/assets/generated_assets.go b/pkg/assets/generated_assets.go index b54e09432..383e49b03 100644 --- a/pkg/assets/generated_assets.go +++ b/pkg/assets/generated_assets.go @@ -2044,6 +2044,119 @@ var vfsgenAssets = func() http.FileSystem { compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x56\x41\x6f\x1c\xbb\x0d\xbe\xcf\xaf\x60\xed\x43\x2e\x99\x5d\xbb\x09\x82\x62\x6e\x1b\x27\x4d\x8d\x36\xee\x22\x4e\x5a\x14\x41\x80\x70\x25\xee\x8c\x60\x8d\x38\x95\xa8\xb5\x37\x41\xfe\x7b\x41\xcd\x8c\xd7\x6b\xa7\x79\xef\xf4\x4e\xb6\xb4\xd4\x47\xf2\xe3\x47\x72\xe2\x06\x4d\x53\x01\x9c\xc2\xf5\x40\xc6\x6d\x1d\x25\xb8\xed\x48\x3a\x8a\xf0\xe1\xf5\xea\x02\x22\x25\xce\xd1\x50\x82\xd4\x71\xf6\x16\x36\x04\x26\x12\x0a\xd9\x0a\xa6\xff\x1a\x90\x98\xa9\x02\x18\xd2\xf0\x36\xe0\xc6\x93\x6d\x60\x8b\x3e\x51\x55\x25\x8a\x3b\x67\x68\x65\x0c\xe7\x20\xff\xcf\x15\xc2\xf5\x91\xdd\xef\x71\x76\x0a\x1f\x3b\x82\x80\x3d\x01\x6f\x41\x3a\x7a\x8c\x21\x0c\x39\xd1\xa2\x98\x5e\x6e\x21\xb0\x40\x22\x01\x0c\x76\x82\x02\x97\x0a\xd8\x73\xc0\x11\xc7\x25\x68\x29\x50\x54\x87\x90\x93\x0b\x6d\xc1\xdd\x66\xef\xcb\xef\x42\xfd\xe0\x51\xd4\xbb\x9e\x9b\xaa\xc2\xc1\x4d\x5e\x1f\xa7\xe6\xc6\x98\x76\xe7\x1b\x12\x3c\x5f\xf4\x24\xd1\x99\xb4\xb8\xf9\x4b\x5a\x38\x86\xd5\xfa\x12\x26\x6a\x9e\xe6\x5a\x42\x2e\x70\xff\xe1\x0c\xb2\x1f\x9c\x41\xef\xf7\x70\x8b\x9a\x55\xe7\x12\xd0\xc8\xf2\x9f\x34\xaf\x3d\x67\xb0\x2e\xe9\xc5\x11\x6c\x01\x73\x1c\x8a\x41\x87\x3b\x02\xe1\x02\xda\x63\xc0\x96\xc0\x09\x70\x96\xe4\xec\xc4\x9f\x4b\x60\x3a\x8c\x02\x5b\x8e\x40\x8b\x16\x3a\x8e\xee\x1b\x07\x41\x0f\x03\x5b\xc0\x2c\x9c\x0c\xfa\xc2\xca\x88\x74\xcb\xf1\x06\x6e\x9d\x74\xe3\xf3\x48\x9e\x70\x64\xfc\xa8\x56\x55\xc7\x49\xae\x48\xd4\xfc\x27\x34\x4d\xd4\xd4\x1a\x38\xc5\x07\x74\x24\xc1\xa8\x95\x70\x01\x1e\x20\x40\xcf\x96\x8e\x29\xba\x2d\x2f\x22\xfd\x37\xbb\x48\x47\x0c\x29\xbe\xe6\x9f\x13\x01\x7a\xa1\x18\xb4\xee\xbc\xa3\xe8\x71\x0f\x61\x44\xd4\x8c\x34\xe9\x81\x6d\x52\x79\x14\xdc\x99\x4a\x8a\x90\x0b\x96\xea\xc9\x70\xdf\xe7\xe0\x8c\x82\x94\xbc\x8f\x63\x5f\xc0\x4a\x01\x80\xee\xb0\x1f\x3c\x3d\x1f\x43\x29\xcc\x94\xd0\x46\xe4\x07\x21\xfd\x9b\xb4\x2e\x53\x18\xc0\x01\xde\xfe\xfd\xba\x82\x39\xf8\xfb\x26\x72\x3d\xb6\x45\x60\x91\x06\x4e\x4e\x38\xee\x1b\x50\x25\xb5\x26\x2e\x1c\x2f\x8f\xa3\xa8\xb1\xb7\xaf\x5e\x56\x00\x82\x6d\x03\xbb\xb3\xc5\x8b\xc5\x2b\x6d\xce\xec\xfd\x9a\xbd\x33\xfb\x06\x2e\xb7\x57\x2c\xeb\x48\x89\x82\x4c\xf0\xeb\xec\xfd\x35\x99\x48\x92\x1a\xf8\xfc\xa5\x3a\x85\x1a\x22\xb5\x2e\x49\xdc\x8f\xf7\x57\xd8\x53\x55\x61\x6c\x67\x03\x9a\x78\x29\x49\x6e\x0f\x3a\x4b\xe4\xb7\x75\x72\x6d\x20\x0b\x86\xa2\xb8\x6d\x61\x2c\x3d\x87\x44\xd4\x40\x27\x32\xa4\x66\xb9\x6c\x9d\x74\x79\xb3\x30\xdc\x2f\x6f\xf2\x86\x62\x20\xa1\x54\xbb\x60\xf2\x06\x85\xe3\xa3\xac\xaa\x53\x80\x1a\xea\x5a\x4d\x3d\x49\xed\x42\x22\x93\x23\xd5\xe2\x53\x55\xdd\x8f\xa9\x06\xbe\xff\xa8\xaa\xc0\x96\xae\xc9\x93\x11\x8e\xe3\x8d\xb0\xd7\xbe\x76\x1c\xc6\xe8\x2b\xdc\x6e\x5d\x70\xb2\x1f\x7f\x8e\x34\x78\x67\x30\x35\x70\x5e\x55\x74\x27\x11\x2f\x54\xf9\x2e\x50\x9c\xec\x07\xb6\xff\xc0\x0d\xf9\xc9\xc3\xc0\x76\x15\x02\xcb\x0c\xf9\xfd\x87\x06\xa8\x13\x69\xcb\xde\xf3\xad\x6a\x0a\x0f\x06\xd0\x66\x8c\x18\x84\x08\x92\xe9\xc8\x66\x3f\x8b\xce\x44\x27\xda\xdf\x80\xd6\xd6\x1c\x8a\x08\x17\x8a\x05\x70\x4d\x04\x3d\x47\x02\x94\x03\x6b\x07\xaa\xb4\xf2\x96\x4d\x5a\x0a\xa6\x9b\xb4\x44\xdb\xbb\xe0\x92\x50\xac\x8d\xcf\xfa\x77\x79\xef\xd4\xd6\x07\xaf\xf5\xec\xb1\x46\x6b\x39\xd4\xea\x70\xa9\x0e\x27\x13\x8a\x0b\xf4\x43\x87\x8b\x63\x4f\xf7\xaf\x06\xb6\x0d\x3c\x7b\x56\x55\xa7\xa7\x70\xad\xf3\xb4\x4c\x87\x21\x3a\x8e\x4e\xf6\x17\x1e\x53\x2a\x4a\x39\x7d\x7a\xd7\x40\xda\x27\xa1\xbe\xd6\xfa\xdc\xc7\x31\x11\xfe\x2f\xf6\xb9\xa7\xf7\x3a\xba\x67\x81\x41\x3d\xce\x59\x48\xa3\x30\x47\x5a\x7a\x35\x59\xa3\x74\x0d\x2c\x49\xcc\x03\x46\x96\x47\x76\x91\xd0\xfe\x33\xf8\xfd\x3c\x85\x1e\x78\xf9\xb5\x83\xf1\xd0\x8c\x87\xf9\x38\xc6\xaf\xbe\x6a\x1c\xdc\xa4\xc9\xca\xbb\x1d\x05\x4a\x69\x1d\x79\x53\x3a\x54\xcb\xf4\x8e\xca\xa2\x03\x18\xc6\x20\x3b\x42\x2f\xdd\xb7\xf1\x8a\xe3\x5c\xcc\x72\x56\xd2\x15\xf8\x6f\x1f\x3f\xae\xb5\xf5\x55\x93\x0e\xfd\x1b\xf2\xa8\x6d\xc7\xc1\xa6\x06\xfe\x7c\xa6\x0a\x45\xeb\xfe\x18\x57\xa5\xb1\xb4\x6e\x1c\x84\xee\x8a\x03\x54\x4d\xaf\xa3\xdb\x39\x4f\x2d\xbd\xd5\x3d\x50\x84\x3d\x8f\x28\x00\x83\x03\x6e\x9c\x77\xe2\x28\x8d\x21\xd9\xc8\x43\x03\x9f\x4f\xd0\xfb\x93\x2f\xd5\xa1\x1e\x1f\x98\xe5\xaf\xce\xd3\xa8\x85\xfb\x7d\x1e\x73\x58\xa5\x77\x91\xf3\xd0\xc0\xf9\xd9\xd9\xd9\xf9\x7c\x77\xc5\x41\x9f\x1c\x1b\x7e\x4a\x14\x67\xbb\xf9\x23\xa3\x04\xfa\xa8\x29\x01\xfc\xa1\x6b\x75\xfa\xc2\xca\x5a\xdd\xcc\x89\xa6\x5f\x74\xae\x97\xb1\xf5\x74\x0f\xdd\x42\x1e\x74\xfb\x7c\xd5\xb2\x1b\xf1\x30\x35\x56\xed\xc2\x96\xbf\x8e\x70\x8f\xba\x64\x32\x98\x23\x82\x13\x0d\xfa\xe4\x67\xa6\xa3\xf0\x4e\xde\x1f\x79\x55\xcb\xb1\x6e\x2f\x5f\xbe\xd0\x11\xbe\x1f\xa8\x81\x8b\x11\xf5\x72\x5d\xe6\xce\x1b\x97\x62\x1e\x34\xc5\xd7\xd9\xb6\x34\x7d\x54\xfd\xe6\x7c\x88\x39\xd4\x38\x94\x31\xa7\x6f\x97\x86\xc3\xd6\xb5\x3a\x41\x07\xbb\x59\x3e\xdd\x3a\x00\xbd\x0b\xab\x1d\x3a\xaf\xd7\xea\xa4\xc7\xbb\x4f\x01\x0f\x37\x95\x50\x92\xcb\x9f\xed\xa6\x4d\x4e\xfb\x0d\xdf\xcd\x3b\x48\xbf\x99\x92\xfc\x6a\x07\xfd\x2f\x00\x00\xff\xff\x69\x62\xf4\x46\x88\x0a\x00\x00"), }, + "/charts/components/node-problem-detector": &vfsgen۰DirInfo{ + name: "node-problem-detector", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + }, + "/charts/components/node-problem-detector/Chart.yaml": &vfsgen۰CompressedFileInfo{ + name: "Chart.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 806, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x92\x31\x8f\xd4\x4e\x0c\xc5\xfb\xf9\x14\xd6\xfd\x9b\x3f\x12\x49\xb8\x02\x74\xda\x8a\x96\x1e\xd1\x20\x0a\xef\xc4\x4a\xac\x9d\xb1\x47\xb6\x93\x63\x25\x3e\x3c\x9a\x2c\xc7\x21\x74\xa2\xb8\x66\xe4\xc2\xef\xbd\xdf\xd8\xc6\xc6\x5f\xc8\x9c\x55\x4e\xb0\xdf\x27\xc1\x4a\x27\x10\x9d\x69\x68\xa6\xe7\x42\x75\x98\x29\x28\x87\x5a\xda\x9f\xfa\xee\xee\xc7\x87\xf1\xc3\x5d\xc2\xd6\x9e\xb5\xef\xc6\x87\xf1\x7d\x5a\xb5\xeb\xd7\x88\xe6\xa7\x69\x5a\x38\xd6\xed\x3c\x66\xad\xd3\x65\x3b\x93\x09\x05\xf9\xf4\xb2\xfb\x4c\x9e\x8d\x5b\x1c\x6e\x3f\x12\xc0\xe7\x95\x1d\xf2\x8a\x16\xc0\xe2\x81\xa5\x38\x20\x7c\x7d\x51\xfd\xed\xff\x57\x44\xbe\x81\x19\xa9\xaa\x38\xc5\x78\x4b\x0b\xd5\x02\xc8\xb5\x57\x50\xf1\x42\xb0\xa3\xb1\x6e\x7e\x4c\x04\x7e\x19\x38\xec\xec\x7c\x2e\xd4\xbb\x62\x25\xd8\x9a\x87\x11\x56\x28\x78\x25\x73\x60\x81\x5c\x36\x0f\x32\xa8\x28\xb8\x50\x25\x09\xf0\xc0\x7c\x19\xe1\x53\x00\xf7\x8f\xdc\xb2\xe1\x71\xe5\xbc\x82\x6d\xe2\xa0\x02\x84\x79\x3d\xb2\xde\xc2\x8d\xf2\xef\x64\x94\x19\x8c\x9a\x5a\x78\x8f\xae\x1d\x01\x1b\x3b\xd9\x4e\x36\x26\xce\x7d\x7a\xff\x9e\xc5\x1f\xa5\xe1\xe3\x54\xb1\x83\x4e\x45\x17\x3d\x9e\xb1\xc9\x92\x2e\x74\x7d\x54\x9b\xfd\x94\x86\x03\x20\x0d\x4f\x08\x69\x80\xdf\x2b\x1b\xa0\xaa\x70\xa8\xb1\x2c\xc9\x75\xb3\x4c\x87\xe2\x35\xeb\x7f\x56\x3d\xb7\x8e\xac\xd3\xac\xd9\xa7\xac\x92\xa9\x85\x4f\x68\x79\xe5\xae\xd8\x8c\x0e\x23\x9f\xfe\xcb\x2a\x33\xf7\xb3\x49\x15\x59\x02\x59\xc8\x6e\xe0\xc7\x2d\x57\xfc\x3e\x98\xe6\x0b\xc5\xc0\x12\x87\x73\x02\xa0\x8a\x5c\xfa\xa1\x0f\x46\xad\x5c\x3f\xce\x54\x78\x27\xbb\xae\x64\xda\x81\x13\xc9\xc2\x42\x27\x58\x34\x5a\x49\x3f\x03\x00\x00\xff\xff\xde\x88\x83\xd0\x26\x03\x00\x00"), + }, + "/charts/components/node-problem-detector/README.md": &vfsgen۰CompressedFileInfo{ + name: "README.md", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 3657, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x6d\x6f\xdb\x36\x10\xfe\xae\x5f\x71\x4d\x3e\x6c\x0d\x6a\x39\x09\xd0\x2d\x08\xd6\x6d\x59\xd3\xa1\x41\x9b\xcc\x68\x92\x7e\x09\x8a\x98\x26\x4f\x12\x6b\xbe\x68\x3c\xd2\x89\x30\xef\xbf\x0f\xa4\xe4\x17\x79\x76\xd3\x15\x6b\x81\x58\x16\x9f\x7b\x9e\xbb\xe3\xf1\x8e\xde\x07\x63\x05\x0e\x6a\x67\x27\x0a\xf5\x40\xa0\x47\xee\xad\xcb\xb2\x67\x77\x1f\xd1\x91\xb4\xe6\x14\x8e\xf2\x93\xfc\x87\x4f\xdf\x57\xde\xd7\x74\x3a\x1c\x4a\x5d\xe6\x54\x49\x54\x82\x72\x69\x87\x13\x26\x4a\x1c\x76\xe0\x41\xc2\x0e\xa4\x29\xac\xd3\xcc\x4b\x6b\x98\xfa\x85\x7c\xa3\xf0\x55\xa1\x98\x1f\xd0\x9f\x81\x39\x7c\x0e\xcf\xee\xce\xea\x7a\x29\x30\x3b\xcc\x4f\xf2\x97\x4f\x28\xac\x0c\x06\x2d\xfe\x49\x95\x2c\xbb\xa9\x24\x01\xaf\x98\xf3\x20\x0d\x79\xa6\x14\x01\x83\xbb\xad\x21\xaf\xe4\x4b\xe9\xab\x30\xc9\xb9\xd5\xc3\x69\x98\xa0\x33\xe8\x91\x86\x5b\x8d\x9e\x83\x60\xa8\xad\x21\xf4\x39\x24\x35\x6f\xad\x02\x26\x75\x7c\x02\xcd\xa6\x08\x33\xe6\xa4\x0d\x94\x12\x0d\x1d\x01\xc1\x4c\x92\x9c\x28\x8c\x28\x5f\x21\x84\x9a\xbc\x43\xa6\x41\xb1\x06\x1d\x81\x34\xc0\x55\x20\x8f\x0e\x34\x33\xac\x44\x8d\xc6\x03\x79\xc6\xa7\x39\x5c\x78\x90\x31\x90\x56\x1b\x1e\x2a\xc9\x2b\x70\xc1\x10\x58\x03\xc8\x78\x95\xb4\x5e\x40\xeb\xe5\xa6\x32\x33\x02\x1c\xd6\xd6\x79\x8a\xd2\x3a\xba\xc0\x6a\x49\xe8\x66\xe8\xf2\x2c\x3b\x38\x78\x6b\x35\xd6\xac\xc4\xd3\x83\x03\xf8\xe9\x1b\xb2\xf2\x73\x96\xed\xef\xc3\x5b\xfb\x10\xa9\xbb\xc4\x83\x5f\xee\x45\x96\x9d\x09\x01\xe7\xa8\xe4\x0c\x5d\x03\x6f\xd1\x59\xa8\xc3\x44\x49\xde\xed\x55\xf4\xee\x34\xcb\xc6\xe3\x31\xb7\x86\xac\xc2\xac\x42\xa5\xd3\x6b\x60\x42\x80\xe8\x4c\xab\x68\xb9\xf0\x2f\x99\x52\xbe\xbe\x16\x8b\x27\xb2\x64\xd9\x19\x90\xd4\xb5\xc2\xa5\x37\x0f\xd2\x57\x20\xb0\x60\x41\x79\x98\x31\x15\x90\xb6\x28\x2e\xd0\xeb\xa4\xdb\x43\x6e\x65\x6e\xd6\xc3\xc5\x2e\x9a\x24\x15\xbf\x3a\x54\xc8\x08\xc1\x30\x8d\x30\xd6\xcd\xa0\x7b\x31\xfe\x82\xf2\x0a\xf5\x2d\x4e\x24\x69\xb2\x1a\x81\xf0\x2b\xc2\xfc\x4f\x62\x30\x18\xac\x48\xef\xa7\xd8\x1c\xbd\x4a\xcf\x47\xff\x5a\x38\x6e\x17\x8e\xb7\xbb\xc7\x03\x79\xab\x3b\x38\x14\x52\xe1\xff\xe7\x61\xd1\xd1\xe6\x0d\xd3\xaa\x95\xdf\xdf\x87\x6b\x1b\x1c\x47\x78\x6d\x05\x66\xd9\xb7\x56\xf8\x9a\xdd\x0a\x1c\x0b\x4e\x58\x4e\x43\x6e\x0d\xc7\xda\xd3\x90\x39\x5e\xc9\x68\x13\x1c\x26\x2a\x1a\xee\x73\x6b\x84\x8c\x5d\xab\x3d\x27\x1f\x93\x8b\x59\x36\x87\x77\xd8\xc0\x1c\x6e\x9a\x1a\x61\x0e\xe7\x5d\x71\xc6\x27\xe2\x4e\xd6\xd1\x02\xe6\xd9\x7c\x10\xff\xb5\x7f\x17\x1f\xbd\xa7\xf4\x2d\x9b\x03\x2b\x0a\x69\xa4\x8f\x94\x76\xf2\x19\x79\xa4\x1a\xff\xf5\xf7\x18\xe6\x00\x69\xdd\x18\xeb\x53\xf7\xa4\x5d\x10\x34\x33\x98\x03\x79\x27\x4d\x19\x97\x8c\x54\xab\xb5\x47\xef\xd8\x47\xab\x82\xc6\x4b\x1b\x8c\x8f\x24\x4a\x52\xa2\xb8\xfb\xb4\x0d\xb6\x03\x51\x04\xa5\xe2\x91\xf8\x63\x86\xce\x49\x81\x3d\xc5\xbd\xbd\x25\xae\xb2\xe4\xaf\xd0\x3f\x58\x37\x85\x39\x4c\x62\x9f\x9d\xc3\xb8\x60\x8a\x30\x62\x3e\x04\x03\xb5\x15\xb1\x05\x46\x24\x98\x0e\xfa\xbb\x62\x65\xec\x43\x2e\x18\xb8\x8a\x8d\x70\xd4\xee\x25\x9c\x2f\xca\xc4\x9a\x74\x3c\xa3\xd5\x77\xb4\xb0\xeb\xda\x79\xec\xe8\x4d\x2d\x39\x53\xaa\x01\x63\x63\x6f\xe2\x56\x6b\x34\x02\xc5\x0b\x98\x04\x0f\x9a\x35\x30\x41\x08\x84\x45\x50\x50\x58\x07\x1c\x9d\x67\xd2\xc4\x57\xc0\x19\x21\xe5\x4b\xff\x47\x17\xe7\xdb\x7c\x5f\xae\xd7\xcc\x57\xb9\xb2\xa5\x90\xae\x9f\x86\xe1\x8c\xb9\xa1\xb2\xe5\x30\xe5\xe3\xbd\x2d\x41\x48\x97\xdc\x6f\x20\x1a\xc5\x20\xde\x9d\x50\x1b\x7a\x64\x93\x9a\x95\x98\xd7\x41\xa9\x91\x55\x92\x37\x7d\xba\x8b\xe2\xca\xfa\x91\x43\x42\xe3\x57\x19\x6e\x6d\x62\x9b\x25\x99\x98\x7b\x36\xd3\x13\xca\x4b\xee\x62\x8d\x6f\x3d\x13\xdb\xdf\x6e\xb2\x7b\x56\xf6\x69\xdb\x61\xbe\x01\x1b\x05\xa5\xae\x91\x3b\xdc\x55\x56\x8a\x4d\x50\xed\xac\x5b\xcd\x1e\x6f\x0d\x9b\x31\xa9\x58\x9c\xb1\x73\x90\x26\x41\x8e\x22\xe2\xa6\xc2\x08\x88\xc5\x42\x10\xd6\x60\x22\x24\xa7\x98\x81\x50\x0b\xe6\xb1\xa5\x42\xef\x24\xa7\x3c\x8e\x47\xc9\xf1\xd2\x9a\x98\x9a\x9c\x89\xf6\x08\x33\xf5\xfe\xcb\x9e\x6c\x37\x47\x13\x15\xc5\xce\x5a\xf8\x9a\xf3\x10\xd3\x7d\x8d\xaa\xad\xe1\x1d\xf2\xb5\x93\xd6\x49\xdf\xbc\x56\x8c\xe8\x2a\xce\x9d\x1d\x64\x6e\xc2\x78\xce\x1d\xa6\xb0\x97\x4e\x79\x17\xb0\x0f\xa9\xa9\x7e\xf3\x84\xef\x0e\x29\x35\xd8\x9d\x39\x21\xe4\x21\x39\x65\x8d\xc7\x47\x9f\xd7\x4e\xce\xa4\xc2\xb2\xc7\xd9\x93\xee\xb2\x77\xc6\x79\xec\x34\x4f\xf8\xb9\x01\x36\x9b\x51\xaf\x37\x31\x42\xef\xa5\x29\x29\x6f\xa7\xd0\xbd\x6e\xf7\xe7\x5e\x60\xea\x9d\x3b\x7a\xe3\xeb\x76\x64\xd5\x2a\x94\xd2\x40\x67\x03\xdc\x9a\x42\x96\x69\x82\xd1\x56\xf2\x16\xbf\xd0\xd8\x51\xd8\x4b\xa3\x0a\x99\xf3\xbf\x21\xf3\x23\x74\xd2\x8a\xfe\xc6\xbd\xd4\x87\x94\x36\xef\xba\x31\x3c\xbe\x94\xc6\xa3\x9b\xb1\x6e\xa6\x9e\x8d\x2e\xa0\xbd\xcf\xf5\x39\x95\x2d\xb7\xca\xef\x0d\x5b\xe7\x87\xd3\x38\xc8\xd4\xa0\xc3\xe4\x9f\xc9\x9a\xbd\x17\xcb\x55\x61\xf9\x14\x5d\x7f\x35\x79\x7e\x4b\xe8\x06\x54\x23\x97\x85\x44\xb1\x18\xe9\x8b\xc4\xf4\x92\xb9\xee\x4e\xed\xac\x46\x5f\x61\xa0\x7b\x26\x84\x43\xa2\x7e\x94\x87\x79\xfa\x9f\x02\x1d\x2d\xb1\x80\x8f\xf1\xf2\x8a\x0e\x96\x46\x3b\x48\x23\x6c\x75\xf8\x8f\x0f\x8f\x5f\xfe\xb8\x8b\xaa\x85\x66\x73\xf0\x56\xa1\x6b\xa7\xe2\xdd\xe1\xa7\x1c\x8b\xa2\xdd\xfa\x35\xb7\xae\xec\x35\xaf\x50\x04\x85\xab\xf3\xb3\x61\x66\xeb\xf8\xcd\x6e\x34\xf1\x37\x8f\x92\x3c\xad\x8c\xda\x36\x73\xed\x1d\xf3\x58\x6e\x74\xdb\x0f\x56\x29\x69\xca\xdb\x04\x49\x26\x97\xe9\x77\x40\x1a\x55\xcb\x1f\x1d\x8b\x4e\x45\x4b\x8e\x74\xa5\xb8\x64\xd2\xc4\x11\x84\x2e\xdd\x2b\xba\x83\xff\x46\x33\x19\x8f\xcb\xad\x53\x49\x3e\x5e\x14\xa0\xfd\x58\x3c\x2c\xba\xe7\xc0\xc5\xad\xf6\x83\x54\x56\x06\x63\x02\x8c\x1d\x38\xac\x55\xf3\x6b\xef\x86\xcd\xad\x6e\xa3\xf9\x27\x00\x00\xff\xff\x07\xe4\xdd\xee\x49\x0e\x00\x00"), + }, + "/charts/components/node-problem-detector/templates": &vfsgen۰DirInfo{ + name: "templates", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + }, + "/charts/components/node-problem-detector/templates/NOTES.txt": &vfsgen۰CompressedFileInfo{ + name: "NOTES.txt", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 243, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8e\x31\x6a\xc4\x30\x14\x44\x7b\x9f\x62\x50\x6d\x29\x7d\x20\x57\x48\x11\x72\x81\x6f\x6b\x12\x9b\x95\x25\x21\x7d\x1b\x16\xa3\xbb\x2f\x62\xd9\x6a\xdd\x0e\xf3\x1e\xef\x37\xe1\x60\x59\xff\xee\xd0\x45\x14\xba\x10\x31\x79\xda\x5c\xd2\x14\xb8\x59\x4f\xe5\xac\xa9\x20\x27\x5f\xb1\xc8\x41\x54\x95\xa2\xf4\x23\xca\x1e\x3f\x87\x01\xb8\xed\x13\x67\x0d\xb0\x36\xca\xc6\x9a\x65\xe6\xd7\x79\xc2\xfd\x30\x50\x2a\xdd\xf7\x6b\x45\x6b\xf8\xa7\x3e\x5d\x36\xc0\x48\xce\xae\xd3\x25\x52\x59\xdd\x9a\x3e\xba\xa1\xc3\xca\x2d\x07\x51\xc2\x5c\xe6\xb8\xfe\x33\x70\x68\x6d\x7c\x97\xac\xb1\xaa\xc4\x8b\x0a\xb4\x66\x86\x47\x00\x00\x00\xff\xff\x4c\x52\xf4\x3a\xf3\x00\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/_helpers.tpl": &vfsgen۰CompressedFileInfo{ + name: "_helpers.tpl", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 1994, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\xd1\x6a\x1b\x3b\x10\x7d\xf7\x57\x0c\x22\x81\x24\x97\xdd\xc4\x5c\xb8\x0f\x81\x5c\x28\x6e\x29\xa5\x90\x96\x04\xd2\xc7\xa2\xd5\xce\xc6\x03\x5a\x49\x95\x46\x6e\x8c\x93\x7f\x2f\x92\xd6\x76\x9c\xd8\xe9\xe6\x4d\xac\xcf\x9c\x99\x39\x73\x66\xbc\x5a\x9d\x9f\xc1\x82\xfa\x4b\x08\xc8\xd0\x91\x46\x5e\x3a\xbc\xea\x63\x60\xa9\xe6\x78\x09\x67\xe7\x4f\x4f\x93\x49\x82\x4d\x3e\x3d\x38\x69\x5a\xe0\x39\x82\x91\x3d\x82\xed\xf2\x5b\xcd\xa5\xe7\x7a\x92\x81\xab\x55\x05\x2d\x76\x64\x10\x84\xb1\x2d\x56\xce\xdb\x46\x63\x5f\xb5\xc8\xa8\xd8\xfa\x3a\x45\x0a\xa8\xb6\x58\x19\x35\x43\x3d\xcb\x24\xd7\x89\xb6\xbe\x93\x3a\x62\xc8\xc8\x6f\x0b\xf4\x9e\x5a\x84\x47\x60\x1f\x8d\x82\xff\xfe\xcd\x4f\xea\x6f\x63\xd7\xd1\x03\x88\x6a\x4b\x86\xa6\xcd\xef\x52\xed\xcc\xa3\x64\x04\xb9\xc9\xd1\x45\xad\x97\xf0\x2b\x4a\x4d\x1d\x61\x0b\xd2\xb9\xdc\x47\x3d\xf9\x81\x85\x3d\xe3\x39\xe5\x48\x3d\x05\x68\x50\xc9\x18\x10\x82\xed\x11\xbe\xc6\x06\xbd\x41\xc6\x50\xba\xef\x08\x75\x1b\x40\x7a\x04\x4d\x3d\x31\xb6\xc0\x16\x78\x4e\x01\x4e\x9a\x65\x56\xe6\xe3\xf5\x6d\xc2\x92\xb9\x87\xe0\x50\x9d\xd6\x93\x2f\x1d\x78\xd4\x28\xc3\x20\xa1\xb2\x86\x25\x99\x50\x44\x2c\xdf\x88\xe1\x37\x69\x0d\x0d\x42\x0c\xa9\xce\x00\x32\x17\x3f\x54\x3b\x52\xe8\x14\xb1\x2b\x36\x75\x1b\x6d\xd7\x3f\x6e\xf4\x5d\x63\x0e\x02\x46\x0d\x40\x87\x2d\xd3\x51\x6e\xe6\xf2\x6a\xfc\x8c\x9f\xd5\xb9\xd1\xa5\xb0\xd4\x37\x45\xb4\x12\xbc\xa9\x75\xe7\xeb\xbb\x0b\x74\x9e\x0c\x77\x20\x8e\x43\x75\x1c\xc4\x0b\xb6\x92\xf7\x3d\xae\x3b\xf4\xde\x71\xe3\xb3\x31\xa7\x55\x5a\xa0\x0f\x64\x4d\x1a\x71\x1e\xf5\xe0\x9b\x82\xd2\xb2\x41\x3d\x7a\xdc\x39\x46\x1c\x6c\xee\xb9\xf6\xe5\x7d\x37\xe4\x7e\x04\x8f\x4e\x4b\x85\x20\xfe\x11\x20\x7e\x8a\xf7\xef\x1a\x0c\xdd\xbd\xbc\x0c\x01\xfd\x82\x14\x82\x54\xca\x46\xc3\x69\x3f\xd2\x3a\x8d\xec\x68\x88\xfe\x50\x82\xaf\x0f\x59\x79\x17\x56\xab\x52\x4a\x01\x6e\xbc\x77\x42\x46\xe9\xd8\x8e\x58\x96\xfa\xf4\x10\x73\xee\xec\xb5\x91\x36\x39\xc4\xf0\x10\xa3\x08\xfe\xe6\x94\x57\x57\xd6\x9a\x8e\xee\x7b\xe9\xa0\xb3\x1e\x02\x5b\x9f\xce\x8a\x8a\x81\x6d\x0f\xbd\x35\xc4\xd6\x17\x41\x89\xc9\x9a\x30\xda\x37\x99\x61\x96\xd9\xb7\xfa\x1e\xad\x05\x49\x0b\x3c\x5e\xbb\x7d\xf6\x2b\x09\x2a\x35\x64\xd8\x32\xbf\x69\xbc\xfd\xda\xdc\x20\x47\x6f\xb2\x1e\xd2\x39\x6f\x9d\xa7\x7c\xb3\x1d\xad\xdd\x9c\xc4\x71\xb6\xbd\x45\x15\x3d\xf1\xf2\xbb\xd5\xa4\x96\x7b\x96\xe8\x35\x66\x4b\xb2\x63\xb3\x80\xfd\x02\xfd\xcc\xf6\x2e\x5d\x7a\xf1\xff\xd5\xb4\x9e\x5e\x54\x17\x69\xa5\xa4\x93\x0d\x69\x62\xc2\x50\xa7\x7f\x87\x21\xbc\xfe\x4c\xbc\x2e\x67\x47\x8f\x94\x35\xa5\x3a\x5f\x4c\x1b\x64\x39\x7d\xeb\x2e\x81\xc0\x07\x46\x93\x48\xc2\x1e\xfc\x1e\xf7\xfc\x09\x00\x00\xff\xff\x0f\xdc\xf6\x7c\xca\x07\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/clusterrole.yaml": &vfsgen۰CompressedFileInfo{ + name: "clusterrole.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 648, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x92\x31\x6b\xeb\x30\x14\x85\x77\xfd\x8a\x8b\x77\x2b\xbc\xed\xe1\xf5\x0d\x6f\xeb\x90\x42\xf6\x6b\xe9\x24\x16\x91\x25\x21\x5d\x19\x5a\xe3\xff\x5e\xec\x84\x92\xa4\x04\xd2\xcd\x5c\xce\xf7\xf9\x20\xce\x3c\xb7\xe4\x8e\xa4\x0f\xec\x2b\x8a\xce\x3d\x1b\x6d\x32\x58\x40\xed\xb2\xa8\xb3\x0b\xb6\xa3\x7f\xbe\x16\x41\xde\x47\x0f\xc5\xc9\x1d\x90\x8b\x8b\xa1\xa3\x2d\xcd\x55\x86\x98\xdd\x27\x8b\x8b\x41\x9f\xff\x16\xed\xe2\x6e\xfa\xa3\x46\x08\x5b\x16\xee\x14\x51\xe0\x11\x1d\xcd\x33\x09\xc6\xe4\x57\x79\x13\xa2\x45\x9b\x72\xec\x3d\xc6\xd6\x42\x60\x24\x66\x7d\xac\xde\xaf\xe1\x86\x34\x2d\x8b\x22\xf2\xdc\xc3\x97\xd5\x41\xc4\x29\xe9\x73\xed\x91\x03\x04\xdb\x6f\xbe\xbd\x2e\x18\x5f\xed\x53\xed\x9d\x92\x68\x80\x1f\x75\x19\x76\x66\xe0\x2c\xaf\xf0\x5b\xf0\x46\xf0\xb3\x89\x0b\x45\x38\x98\x4b\x1b\xbd\x87\x07\x17\xe8\x37\x1e\xf1\x9c\x19\x39\xf0\x09\xb6\xed\x3f\xee\xa9\x77\xe4\xc9\x99\x0d\xcc\xd5\xa3\x74\xaa\x25\x4e\xee\x7f\x8e\x35\x6d\x4f\xd1\x52\xd3\x28\xa2\x8c\x12\x6b\x36\xb8\xde\xd6\xea\x45\x11\x4d\xc8\xfd\xf5\x74\x82\xfc\x82\xdd\x15\x61\xa9\x0f\x8a\xc4\x62\x86\xd7\x24\x98\x10\xe4\x01\xbf\x6c\xe9\xc6\xb4\x7e\xd5\x64\xd7\xe3\xba\x3d\x04\xbb\x0d\xed\x2b\x00\x00\xff\xff\x7c\x68\xe9\x44\x88\x02\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/clusterrolebinding.yaml": &vfsgen۰CompressedFileInfo{ + name: "clusterrolebinding.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 698, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x92\xb1\x6e\xe3\x30\x0c\x86\x77\x3f\x05\x91\xdd\x0a\x6e\x3b\x78\xbb\xeb\xd0\x2d\x43\x0a\x64\xa7\xa5\x3f\xb1\x1a\x59\x12\x24\x2a\x40\x6b\xf8\xdd\x0b\x39\x45\x91\x20\x4d\xd1\xa2\xab\xc4\xef\x23\x41\xfe\xd3\xd4\x92\xdd\x93\xda\xb1\x2b\xc8\x2a\xf5\xac\x95\x4e\x60\x01\xb5\xf3\xdc\x1c\xad\x37\x1d\x3d\xb8\x92\x05\x69\x1b\x1c\xfe\x5b\x6f\xac\x3f\x34\x1c\xed\x0e\x29\xdb\xe0\x3b\x5a\x20\x2e\x32\x84\x64\x5f\x59\x6c\xf0\xea\xf8\x37\x2b\x1b\xd6\xa7\x3f\xcd\x08\x61\xc3\xc2\x5d\x43\xe4\x79\x44\x47\xd3\x44\x82\x31\xba\xda\x63\xe5\x83\x41\x1b\x53\xe8\x1d\xc6\xd6\x40\xa0\x25\x24\xb5\x2f\xce\xd5\xe2\x15\x29\x9a\xe7\x86\xc8\x71\x0f\x97\xab\x83\x88\x63\x54\xc7\xd2\x23\x79\x08\x96\x36\x1f\x5e\xeb\xb5\x2b\xe6\xae\xf6\x4a\x49\x34\xc0\x8d\x2a\x0f\x6b\x3d\x70\x92\xef\xf0\x4b\xe1\x85\xe0\x76\x12\xeb\xb3\xb0\xd7\xe7\x69\xd4\x16\x0e\x9c\xa1\x36\x3c\xe2\x3e\x33\xb2\xe7\x03\x4c\xdb\xbf\x5c\x53\x4f\x48\x27\xab\x17\x30\x97\xfe\x19\x5a\x72\xd7\xb4\x74\x3e\xc9\xfb\xe7\x3f\xad\x43\xf1\xf2\x93\xdd\xe6\x2b\x72\x73\xb9\x92\xea\xc8\x91\x3f\x1b\x7f\x79\xae\x55\x29\x38\x6c\xb1\xaf\xa7\xb8\x09\xc7\xaf\x4e\xcc\xd1\x3e\xa6\x50\xe2\x17\x79\x6a\x6a\x5a\xe1\xcd\x12\xcd\xb7\x00\x00\x00\xff\xff\x3b\xc8\x67\x7e\xba\x02\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/custom-config-configmap.yaml": &vfsgen۰CompressedFileInfo{ + name: "custom-config-configmap.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 435, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xce\x31\x6b\xf3\x30\x10\xc6\xf1\xdd\x9f\xe2\xc8\x6e\x85\xf7\x1d\xbd\x76\x6e\x87\x16\x02\x9d\xc2\x59\x7a\x62\x1f\x91\x4e\x46\x3a\x07\x8a\x93\xef\x5e\x5c\x97\xd2\x52\x0a\xd9\xef\xf9\xdd\x9f\x27\x39\xa0\x54\xc9\xda\xd1\xe5\x5f\x13\xd8\xb8\x6b\x96\x85\xdc\x81\xe3\x8c\xea\x2a\xcc\x44\x87\xea\xfc\x5c\x2d\xa7\x63\xca\x2a\x96\xcb\x31\xe0\x24\x2a\x26\x59\x2b\x5d\xc9\xf2\x2b\xa7\x48\x57\x12\x0d\x50\xa3\xff\x74\xbb\x35\x67\xd1\xd0\xd1\x43\xd6\x93\x0c\x8f\x3c\x35\x09\xc6\x9b\x4f\xa4\x9c\xd0\xd1\xb2\x90\xa8\x8f\x73\x00\xed\x34\x07\xb4\x53\xc9\x7d\x44\x6a\x03\x0c\xde\x72\xf9\xfc\xba\x19\x3b\x72\x2b\x4b\x14\xb9\x47\xac\x2b\x43\xc4\xd3\xe4\xce\x73\x8f\xa2\x30\x54\x27\x79\x7f\x2f\xbd\xde\x7d\x91\x44\x23\x62\x72\x75\xdc\xfb\x91\x8b\xdd\x95\xb6\x1e\x7e\x03\x7e\x97\x88\x56\x63\xf5\x5b\x8d\x7b\x46\x04\x57\xb8\x27\x4e\xf8\x7b\x93\x58\x79\x40\x68\xfb\xb7\x9f\xab\x17\x94\x8b\xf8\x8f\xe1\x7b\x00\x00\x00\xff\xff\xa3\xc1\x01\x92\xb3\x01\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/daemonset.yaml": &vfsgen۰CompressedFileInfo{ + name: "daemonset.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 4454, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x5b\x6b\xdb\x48\x14\x7e\xcf\xaf\x38\x88\x40\x77\xa1\x92\xdb\x2e\xbb\x14\x41\x1f\xda\xa4\x5d\x0a\xdb\xd4\x34\xdb\xc2\x3e\x85\xc9\xe8\xd8\x1a\x32\x17\x75\xe6\xc8\x8d\x71\xfc\xdf\x97\xd1\x48\xb6\x46\x92\x5d\x27\x54\x2f\xb6\xce\xfd\xf6\x9d\x19\xb1\x4a\x7c\x43\xeb\x84\xd1\x39\xb0\xaa\x72\xb3\xd5\xcb\xb3\x3b\xa1\x8b\x1c\x2e\x19\x2a\xa3\xaf\x91\xce\x14\x12\x2b\x18\xb1\xfc\x0c\x40\x33\x85\x39\x6c\x36\x20\x34\x97\x75\x81\x90\x68\x53\x60\x5a\x59\x73\x2b\x51\xa5\x05\x12\x72\x32\x36\x5b\xd4\x52\x7a\xd9\x04\x32\xd8\x6e\xcf\x00\x24\xbb\x45\xe9\xbc\x09\xf0\x8e\xb2\xbb\xfa\x16\xad\x46\x42\x97\x09\x33\x3b\xd5\x6c\x64\x12\xa0\x44\xa9\x32\x57\xce\x78\xc9\x2c\x9d\xa2\xdf\x08\xf6\x0c\x8c\x23\x11\xda\x11\xd3\x3c\x44\x93\x7d\x41\x89\xcc\x61\x76\xc5\x14\x1e\xd6\x51\x4c\xb3\x25\x16\xe9\xed\x3a\xd6\xba\x46\xbb\x12\x7c\xa7\xb8\xd9\xa4\x60\x99\x5e\x22\x9c\xdf\xe1\xfa\x39\x9c\xaf\x98\x84\xfc\x0d\x64\xdf\x98\xac\xd1\x65\xa1\x44\x7b\xe9\x46\x0c\xb6\xdb\xc6\x68\x23\xfc\x00\xdf\x6b\x43\x91\x41\xd4\xc5\x76\x7b\xe6\x2a\xe4\xbe\xb6\x75\x55\x30\xc2\x6b\xb2\x8c\x70\xb9\x0e\xd5\xa6\x75\xd5\x66\xd3\xfa\x89\x85\xbc\x31\x6f\x48\x2c\x00\xbf\x1f\x92\x49\xbe\x18\x29\x85\x5e\x7e\x6d\xc8\x49\xeb\xdf\xf6\x89\xc1\x19\x80\x62\xf7\x5f\x35\x5b\x31\x21\xd9\xad\x8c\x1d\xc7\xac\xce\x71\xc8\x00\xc0\xa1\x6c\x9a\x14\x0c\x29\x46\xbc\xfc\xa7\x37\x34\xbf\x70\x6c\x9e\xd6\xf7\x46\xeb\xd1\xde\x08\x55\x25\x77\xe5\xe9\x43\xc9\x3f\x32\x4a\xf0\x97\xa6\xf8\xd4\x24\x9f\x96\x66\x78\x1e\x37\xe1\x27\x4e\x79\x3c\xe9\x6d\x88\x5a\x1b\x62\x24\x8c\xee\x15\x8f\x97\xc8\xef\x5c\xad\x66\xdc\xe8\x85\x58\x46\x39\xfc\x56\x59\xa1\x09\xce\xb3\x7f\xdb\x7e\x64\xef\x98\xc3\x39\xa3\x12\x92\x19\xaf\x1d\x19\x95\x06\xb5\xf6\x47\xb1\x2a\x5b\x33\x25\x93\xdf\x21\x83\x07\x70\x25\x7b\xf5\xe7\x5f\xae\x56\xfd\xa8\x1c\x2f\xb1\xa8\x25\xda\x8c\xc9\xaa\x64\x83\x62\x73\x2b\x48\x70\x26\xd3\xca\x14\x39\x3c\x7b\xd6\xa1\xac\x2b\x46\x2f\x87\x00\x05\x20\xf3\x1f\x53\x72\x52\xe0\x01\x84\x2e\x50\x13\xbc\xee\xc1\xa6\x8b\xa5\x43\x7f\xf3\x3f\xec\x9c\xb7\x9c\x9b\x5a\xd3\x55\x37\x3d\xdd\x18\x1e\x6a\xe6\x58\x2d\x6a\xed\x20\x74\xa1\xd8\x12\xe7\xb5\x94\xd7\xc8\x2d\x52\xaf\xa3\x43\x4e\x70\x1e\xe7\x35\xd2\x7e\x00\xdd\xcf\x2e\x6a\xf9\x9e\x50\x1a\x47\x57\x48\x3f\x8c\xbd\x8b\xb6\x4a\x8f\x1e\x0b\xcf\x3f\x5e\x8e\x04\xe7\x1f\x2f\xf7\x42\x84\x56\x09\xdd\x54\xf8\x6f\xcb\x38\xce\xd1\x0a\x53\x5c\x23\x37\xba\x70\x39\xfc\xf1\x62\x3a\xfb\xca\x0a\x63\x05\xad\x2f\x24\x73\x2e\x06\xcf\x88\x15\x05\x30\x56\x1c\x8d\xfa\x28\x6b\x6e\x34\x31\xa1\xd1\xf6\x06\x3d\xdd\x1f\xc3\xd9\x85\x3f\xd1\x46\x10\x6e\x1b\x91\x03\x24\x3d\xff\x0d\x2d\xb3\x58\x19\x27\xc8\xd8\x06\x75\x23\x36\xb1\x25\x6c\xb7\xc9\xd0\x94\xef\xd7\xdc\x48\xc1\xd7\x51\x4a\x41\xa7\xda\x31\xe1\x01\x0a\x5c\xb0\x5a\x12\x24\x1f\x17\x57\x86\xe6\x16\x1d\x6a\x4a\xa6\x50\xed\xb3\x53\x8a\xe9\x22\xef\x91\x7c\x7a\xc9\xec\x56\xe8\x99\x2b\x93\x21\x3d\xe5\x23\x12\xde\x23\x87\xd9\xe4\x54\x43\x9a\x4a\xb3\x24\xe3\xa8\x40\xeb\xdf\x02\xb4\x33\xb7\x76\x84\xca\xf3\x52\x65\xb4\x2f\xc5\x9b\xde\xe6\xf2\xa3\x78\xff\x1c\xce\x5b\x56\x7f\x7f\x39\x24\x12\x7a\xe9\x32\x69\x96\x37\x2d\xdf\x0f\xff\x66\x23\x16\xa0\x3b\x5d\x78\xb1\xdd\x3e\xdf\x6c\x9a\x7d\xe5\x77\x5a\x67\xc8\xbf\x75\xdd\x1d\xce\xd4\xce\x72\xd8\x45\x37\x95\xac\x97\x42\xf7\x7d\xf8\xf0\xc3\x9e\x0a\xbc\x2e\x74\xf7\xd8\xd8\x0f\x7a\x78\x62\x16\xed\xdf\xd4\x97\x5f\x21\x95\x58\xbb\x94\x15\x85\x45\xe7\x43\x1b\xfb\xdf\x8b\xdd\xb4\x62\x23\xf5\xca\x58\xfa\x99\xae\x97\x09\x8a\x77\xaf\x5d\x8a\xf7\xfe\x1d\x6d\x5a\x22\xb3\x74\x8b\x8c\xd2\xaa\x41\xf3\xa4\x99\x46\xe8\x1d\x32\x0a\x88\x6f\xe6\x7d\xd4\x10\x5e\x37\x58\x35\x9a\xf0\x9e\xe2\xb1\x1d\x30\xf3\x89\xe5\x3d\xd4\xdf\x2d\xf0\x97\xaf\x26\x36\x78\x78\x50\xaf\x86\x48\x08\x40\xbf\xfa\x7c\xf9\xfe\xe6\xea\xed\xa7\xf7\x11\x17\x60\xe5\x7d\x7d\xb0\x46\xe5\x03\x06\xc0\x42\xa0\x2c\xbe\xe0\x62\xcc\x69\x79\xfe\xec\xcb\x9b\xa3\x23\xf3\xe0\xf1\x1b\x64\x58\x03\xd4\xab\xe9\x93\xc9\x33\x4e\x49\x68\x65\x64\xad\xf0\x93\x3f\x52\xdc\x74\x66\xd2\x2c\x07\x01\x2a\x2f\x1d\x82\x1b\xec\xee\x8a\x51\xe9\x91\x57\x08\x1b\xbb\xe9\x9b\xe3\x4c\x92\x50\x78\xd8\xe8\x0c\x89\xcf\x0e\xc9\x59\x64\xc5\x67\x2d\xd7\x39\x90\xad\x71\xd2\x45\x74\x59\x38\xe2\xe6\x98\xdc\xc0\xcd\xb0\xec\xf7\x64\xd9\xb7\x5e\xe9\x0e\x34\x61\x24\x76\x4a\x4b\x3c\x4c\x46\xbd\xd8\x1d\x32\x73\xd3\x7e\x47\x9d\x80\xbc\x41\x4e\xa1\x3a\x1d\x0e\xcf\xfa\xc9\x3a\x53\x5b\x8e\x6e\x0a\x26\x3b\xe6\x30\x78\x68\x0f\xc3\x1f\x82\xca\xfd\x8d\x68\xb1\x10\x5a\xd0\xba\x77\x25\x6f\x29\x91\xed\xc1\x6d\x09\xc6\xe7\xea\xc8\x32\x19\x89\x76\x7f\x19\x0b\xc6\x7b\xc4\x47\xd8\x1f\x74\xd3\x83\xeb\xba\xfd\xb4\xd9\x9b\xee\x53\xa7\xea\x12\x69\x1d\xbd\xfc\x75\x28\x9b\xb8\x1f\xc4\xe0\x6a\xae\x3f\x7e\x36\xa3\xc6\x55\x8f\x40\xda\x31\x94\x1d\xb3\x7e\x04\x72\xe1\xe3\x34\xf9\x20\x24\x7e\xb6\x17\x16\xfd\xd7\xe5\xc8\xdf\x21\x28\x05\xc2\x27\x56\xc5\x4e\x4f\xfd\x64\x0a\x66\x2f\x1a\x23\xed\x6d\xf7\x30\x12\x7f\x0e\xc2\x23\x97\xf4\xff\x03\x00\x00\xff\xff\xf9\x5e\x99\x99\x66\x11\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/psp-clusterrole.yaml": &vfsgen۰CompressedFileInfo{ + name: "psp-clusterrole.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 597, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x92\x31\x6b\x23\x31\x10\x85\x7b\xfd\x8a\xc1\x8d\xab\x95\xb9\xee\xd8\xf6\x38\xae\xbb\xc2\x07\x6e\xcc\x15\xb3\xd2\x73\x56\x58\x2b\x09\x8d\x64\xe2\x2c\xfb\xdf\xc3\xca\x90\xc4\x04\x43\x52\xeb\x7d\x9f\x1e\x33\x33\xcf\x1d\xb9\x13\xe9\x03\xfb\x0a\xd1\x79\x60\xa3\x93\xa4\xdf\x81\x07\x0f\x4b\xcb\xa2\xce\x2e\xd8\x9e\x7e\xf9\x2a\x05\x79\x1f\x3d\x14\x27\x77\x40\x16\x17\x43\x4f\x0d\xe0\x5a\xc6\x98\xdd\x0b\x17\x17\x83\x3e\xff\x14\xed\xe2\xee\xf2\x43\x4d\x28\x6c\xb9\x70\xaf\x88\x02\x4f\xe8\x69\x9e\xa9\x60\x4a\x9e\x0b\x68\x13\xa2\x45\x97\x72\x1c\x3c\xa6\xce\xa2\xc0\x94\x98\xf5\xa9\x7a\xbf\x86\x37\xa4\x69\x59\xba\x24\x49\x11\x79\x1e\xe0\x65\xf5\x10\x71\x4a\xfa\x5c\x07\xe4\x80\x82\xf6\xd5\x9b\xdb\x05\xe3\xab\x7d\xa8\x7e\xd7\x36\xd1\x08\x3f\x69\x19\x77\x66\xe4\x5c\xbe\xc2\xb7\xe0\x07\xc1\xe7\x26\x2e\x48\xe1\x60\x6e\x6d\xf4\x1e\x1e\x2c\xd0\x7f\x79\xc2\x63\x66\xe2\xc0\x4f\xb0\xdd\x70\xbd\xa7\xfe\x21\x5f\x9c\x69\x60\xae\x1e\xd2\xab\x8e\x38\xb9\x3f\x39\xd6\x24\x3d\x1d\xb7\x78\x2e\x08\xeb\x1a\x64\xfb\x5f\x11\x65\x48\xac\xd9\xa0\xbd\xa5\x68\x05\xa6\x66\x57\xae\x29\x7a\x67\x1c\x6e\xa1\x0b\xf2\x20\xfd\x5a\x84\x8e\xdb\x2a\xb8\x23\xd7\x9e\x6d\xc8\xdd\xf7\x17\xa5\xd6\x4b\x42\x68\x27\xf3\x1a\x00\x00\xff\xff\xe2\xb1\xd8\x2d\x55\x02\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/psp-clusterrolebinding.yaml": &vfsgen۰CompressedFileInfo{ + name: "psp-clusterrolebinding.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 708, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x92\x3f\x4f\xc3\x30\x10\xc5\xf7\x7c\x8a\x53\xf7\xb8\x62\x43\xd9\x00\x21\xb6\x0e\x45\xea\x7e\xb1\x5f\x1b\x53\xe7\x6c\xf9\x4f\x25\x88\xf2\xdd\x51\x42\x05\xad\x4a\x11\x88\xd5\xbe\xdf\x4f\xcf\x7e\x37\x0c\x35\xd9\x2d\xa9\x0d\xbb\x82\xa4\x62\xcb\x5a\x85\x14\x1e\x85\x5b\x07\x43\xe3\x58\x71\xb0\x1b\xc4\x64\xbd\x34\x34\x5f\x73\xc9\x9d\x8f\xf6\x8d\xb3\xf5\xa2\xf6\xb7\x49\x59\xbf\x3c\xdc\x54\x7b\x2b\xa6\xa1\x07\x57\x52\x46\x5c\x7b\x87\x7b\x2b\xc6\xca\xae\xea\x91\xd9\x70\xe6\xa6\x22\x12\xee\xd1\xd0\x30\x50\x46\x1f\x1c\x67\xd0\x42\xbc\x41\x1d\xa2\x6f\x1d\xfa\xda\x20\x43\x67\x1f\xd5\xb6\x38\x37\x0d\x2f\x48\xd1\x38\xd6\x21\x85\x8a\xc8\x71\x0b\x97\x26\x0f\x11\x87\xa0\xf6\xa5\x45\x14\x64\xcc\x19\x3e\xdd\x56\xb4\x2b\xe6\xaa\xfa\x4b\x3b\x8b\x3a\xb8\x5e\xa5\x6e\xa9\x3b\x8e\xf9\x37\xfc\x3c\x78\x22\xb8\x4c\x62\x25\x65\x16\xfd\x91\x46\xad\xe1\xc0\x09\x6a\xc5\x3d\xae\x33\x3d\x0b\xef\x60\xea\xf6\xf5\x9c\x7a\x46\x3c\x58\x3d\x83\xd1\x3b\xac\xb1\x9d\xde\xcf\xc1\x3e\x45\x5f\xc2\x0f\x9d\x54\x44\x17\x95\xfc\xb3\x81\x54\xda\x17\xe8\x9c\x9a\xaa\x3e\xba\x8f\xe9\xee\xb4\xf6\x45\xf2\x5f\xf4\xe9\x8c\x5c\x9d\x76\x32\x39\x52\xe0\xef\xfe\x6f\x3e\x9e\xa6\xa6\xc5\x85\xcc\x1b\xfa\x1e\x00\x00\xff\xff\x00\xcd\x97\x3c\xc4\x02\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/psp.yaml": &vfsgen۰CompressedFileInfo{ + name: "psp.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 1061, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x52\x4d\x8b\x1a\x41\x10\xbd\xfb\x2b\x8a\xbd\x08\x01\x7b\xef\x73\x13\x5d\x82\x90\x2c\xc3\x2e\xf1\x1a\x6a\xba\x4b\xa7\x63\xf5\x07\xdd\xd5\xba\x22\xfb\xdf\xc3\x7c\xb8\x51\x37\x42\x72\xf3\xbd\x7a\xef\x59\xf3\xba\x4e\xa7\x19\xd8\x0d\xa8\x35\x72\xa1\xac\x52\x83\x5a\xc5\x1c\x9f\x3c\x36\x4c\x06\xde\xdf\x27\x18\xed\x9a\x52\xb6\xc1\x57\x70\x3a\x81\x90\x8b\x8c\x42\xf0\x10\x83\x79\x25\x5d\x92\x95\x63\x1d\xd8\xea\xa3\xfa\x23\x7d\x00\xd5\x79\x77\xd6\x9b\x0a\xea\x5b\xe1\xc4\x91\xa0\x41\xc1\x6a\x02\xe0\xd1\xd1\x4d\xb2\x0f\x86\x66\x31\x85\x86\xc9\xcd\x0c\x09\x69\x09\x49\x6d\x0a\x73\x27\x1e\xb3\x01\x18\x1b\xe2\xdc\x65\x00\x60\x8c\x6a\x57\x1a\x4a\x9e\x84\xb2\xb2\xe1\xf1\x23\xd7\x7a\xcd\xc5\xdc\x8d\xbd\x8a\x04\x68\x89\x9d\xca\xed\xa3\x6e\x31\xc9\xbf\xf8\x7b\xe1\x45\xc0\xe7\x4d\xac\xcf\x82\x5e\x0f\xdb\xa8\x17\x62\xc2\x4c\xea\x19\x1d\xdd\xf7\x38\xf4\xb8\x25\x33\x6b\x8e\xd7\xae\x57\x4a\x7b\xab\x7b\x63\x8e\xa4\xbb\x8f\x8f\xc9\xee\x2d\xd3\x96\x4c\x05\x92\x0a\x4d\x00\x90\x39\x1c\xea\x33\xff\x94\x35\x32\x4a\xff\x82\x97\x02\x32\x0b\x8c\xd8\x58\xb6\x62\xa9\xef\x71\x06\xd3\x2f\xd3\x09\xc0\x3e\x70\x71\x1f\x94\x0e\x7e\x63\xb7\xdf\x31\x4e\x07\x4c\x2e\xca\x71\x69\xd3\x08\x63\x0a\xbf\x48\x0b\x99\x11\x67\xd2\x89\x64\x04\x26\x1c\xfc\x01\x93\x99\xd7\xab\xb3\xbc\xbb\x90\x2c\xe4\x65\xdd\xff\xcb\x82\xd1\xba\x71\xd6\x86\x2c\x35\x4a\xdb\xc1\xee\xf7\x33\xc9\x21\xa4\xdd\x50\xc1\x78\xa2\x17\xfc\x50\x5f\x47\xac\xea\x45\x05\x1b\xe4\x4c\x23\x51\xaf\x96\x9f\x5c\xf5\x6a\x39\x38\x6e\x8e\xfe\xaf\x89\x75\x48\x32\x16\xe0\xac\xbf\xca\xca\x24\x62\xfd\x36\xab\x98\x82\x23\x69\xa9\xe4\x9f\x31\x24\x39\xbf\xa6\xc3\xb7\xff\xd0\x77\xcb\x90\x37\x03\x48\xc5\xcf\xf3\x8f\x4c\x69\xb8\xea\x54\x98\x2a\x98\xbe\x74\xec\xdc\x1f\xbb\x5a\x32\x7d\xb3\xbe\xbc\xdd\x9f\x97\x18\x99\x1c\x79\x41\xfe\x9a\x42\x89\xf9\xae\x74\x93\x7b\xc1\x9d\xf9\xc5\x5e\xbf\x03\x00\x00\xff\xff\x83\x0b\xb8\x4b\x25\x04\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/service.yaml": &vfsgen۰CompressedFileInfo{ + name: "service.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 709, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x52\xcd\xca\x1b\x31\x0c\xbc\xef\x53\x88\xef\xbe\xfe\xe8\xd5\xd7\x9c\x7a\x68\x28\x6d\xc9\xb5\x68\xbd\x93\xac\x89\xff\xb0\xb4\xa1\x61\xc9\xbb\x17\x6f\x92\x92\xd0\x06\xda\xde\x6c\x31\x33\x9a\x91\xb4\x2c\x3d\xf9\x3d\x99\x1d\x87\x19\x62\x22\xb4\x7a\x27\x46\x50\x4f\xde\xe1\x53\x4e\x5e\x73\x35\x48\x3c\x04\x8c\x74\xb9\x74\x5c\xfc\x0e\x55\x7c\x4e\x96\x4e\x1f\xba\xa3\x4f\xa3\xa5\xaf\x57\x78\x17\xa1\x3c\xb2\xb2\xed\x88\x12\x47\x58\x5a\x16\x52\xc4\x12\x58\x41\x6f\x29\x8f\xe8\x4b\xcd\x43\x40\xec\x47\x28\x5c\x13\xdf\xcf\x21\x34\xf0\x1b\x99\xd6\x80\x28\xf0\x80\x20\x4d\x83\x88\x4b\x31\xc7\x79\x40\x4d\x50\x88\xf1\xf9\xfd\x97\xae\x4f\x2e\xcc\xe3\x4b\xd9\x27\x49\xa2\x09\x21\x1a\x99\xde\xdd\xc4\x55\xff\x86\xbf\x02\x1f\x04\x7e\x77\xe2\x93\x28\x27\x77\x75\x63\xbe\x20\x80\x05\x66\xcb\x11\xaf\x39\x91\x13\x1f\x30\xf6\xc3\xf9\x99\x75\x9b\xe0\x03\xf1\x9f\x33\xb6\x8f\x14\xfe\x93\x9f\xb5\xdc\x50\x52\xe0\xda\x60\xf5\x5c\x60\x69\x13\x66\x51\xd4\x8f\x9f\x3b\x22\x77\x7f\x5b\xda\xe6\x84\x8e\xa8\xe4\xaa\xeb\x16\xfa\xdb\x2e\xf1\xa3\x95\x50\x57\x87\xed\x79\x6d\x74\x3b\x1d\x81\xaa\x4f\x07\x31\xa5\xe6\x08\x9d\x30\xcb\xf7\x06\xba\x47\x2a\x35\x6b\x76\x39\x58\xfa\xb6\x69\x0d\x05\x61\x0d\x61\xff\x33\x70\xbb\x5c\xa4\xf5\x26\x7f\x06\x00\x00\xff\xff\x19\xea\x51\x28\xc5\x02\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/serviceaccount.yaml": &vfsgen۰CompressedFileInfo{ + name: "serviceaccount.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 422, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x90\xc1\x4a\x03\x31\x10\x86\xef\xfb\x14\x43\xef\x49\xf1\xba\x37\x5f\xc0\x83\x42\xef\xb3\xc9\xaf\x1b\x9a\x4c\x42\x32\x5b\x90\xb0\xef\x2e\x51\x91\x56\x29\x78\x9f\xef\xfb\xfe\xa4\x77\x0a\xaf\x64\x4f\x1c\x37\x34\xdb\x50\x2f\xc1\xe1\xd1\xb9\xbc\x89\x5a\x57\xc1\x0a\xda\xf7\x89\x4b\x38\xa1\xb6\x90\x65\xa6\xcb\xc3\x74\x0e\xe2\x67\x7a\xb9\xb9\x9e\x12\x94\x3d\x2b\xcf\x13\x91\x70\xc2\x4c\xbd\x93\x22\x95\x38\x24\x07\xc9\x1e\xa6\xd4\xbc\x44\x24\xe3\xa1\x70\x9a\xeb\xaf\xe2\x13\x27\x1c\xc8\x8e\x22\x51\xe4\x05\xb1\x0d\x1b\x11\x97\x62\xcf\xdb\x82\x2a\x50\x34\x1b\xf2\xf1\xa7\x10\xc4\xc5\xcd\xdf\x0d\xc8\xb5\x92\x68\x45\x4c\xb6\xad\x47\xb7\x72\xd5\xff\xf0\x9f\x87\x57\x82\xbf\x4b\x82\x34\x65\x71\x5f\x6b\xec\x33\x22\xb8\xc1\x8e\xa7\xdc\x67\x12\x0b\xbf\xc1\x9b\xe5\xfd\x96\xfa\xfe\xd2\x01\xf6\x6e\x08\xe2\xc9\xec\xfb\xf4\x11\x00\x00\xff\xff\x39\x01\xb8\xd7\xa6\x01\x00\x00"), + }, + "/charts/components/node-problem-detector/templates/servicemonitor.yaml": &vfsgen۰CompressedFileInfo{ + name: "servicemonitor.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 1092, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x53\xc1\x6a\x1b\x31\x10\xbd\xfb\x2b\x86\xdc\x57\x6e\xa1\xf4\xb0\xdf\x90\xf6\xd0\x40\xa0\xa7\x65\x2c\xbd\x78\x45\xa4\x91\x90\xc6\xa6\xc5\xcd\xbf\x17\x69\x1d\xd7\x26\x35\x38\x39\x2d\x9a\x9d\xf7\x66\xde\x7b\xd2\xe1\x30\x90\x7f\x22\xf3\xc8\x61\x87\x6a\x22\xb4\x78\x5b\x4d\x45\xd9\x7b\x8b\x6f\x49\xbc\xa6\x62\x20\xbc\x09\x70\xf4\xf2\xb2\xe2\xec\x1f\x51\xaa\x4f\x32\x52\x5c\x7e\x7b\xd9\x1a\x9b\x0a\x52\x35\x36\xc5\xf5\xfe\xf3\xea\xd9\x8b\x1b\xe9\xe1\x82\x64\x15\xa1\xec\x58\x79\x5c\x11\x09\x47\x8c\x74\x38\x90\x22\xe6\xc0\x0a\xba\x93\xe4\x30\xe4\x92\x36\x01\x71\x70\x50\xd8\x36\xf9\x69\x17\x42\x6b\xbe\x23\xd3\xa6\x13\x05\xde\x20\xd4\xc6\x41\xc4\x39\x9b\xe7\xdd\x06\x45\xa0\xa8\xc6\xa7\xf5\x89\xd7\x8b\x0d\x3b\x77\x95\xf6\x82\x92\x68\x46\x88\xa6\xce\x6b\x3b\x73\xd1\x5b\xf0\xbd\xf1\x8c\xe0\xed\x26\x5e\xaa\xb2\xd8\x65\x1b\xf3\x03\x01\x5c\x61\xbe\x73\xc4\x75\x4c\x64\xe1\x2d\xdc\xb0\xf9\x7d\x89\x3a\x1a\xf9\x0a\xbc\x2d\x33\x76\xce\xab\x4f\xc2\xe1\xbe\x5b\xd6\xd0\xcd\xf0\xf4\x93\x63\x78\x37\xf8\x0f\x79\x71\x10\xa5\x2f\xe7\x5b\x40\xdc\x72\x6c\x7e\xd6\xcc\xff\x93\xdb\xcb\xad\xab\x66\xd8\x96\x5b\x45\xe8\x26\x2e\x19\x46\x56\x3b\xdf\x9f\x85\xda\x8d\x79\x77\x86\xa7\x05\x1e\xde\xb2\xf7\x2d\x96\xf3\x70\x7d\x3d\x6a\x6a\x72\xf2\xa2\xbd\x77\xa0\x9c\xda\x5d\xc0\xaf\xf6\x45\xe9\xf0\xcc\x3a\x8f\xb4\x3e\x9a\xd6\x4b\x5e\x14\x65\xcf\x61\xa4\xaf\x9f\x96\x4a\x41\xbf\xa3\x5e\xb6\xa7\xa1\x6c\xb5\x3f\x98\x82\x1c\xd8\xe2\xa8\x53\xb9\x6c\xa1\x5d\xfb\x48\x4d\xe3\xb1\x5e\xd3\xae\x58\x5c\x7a\xd2\x58\xa6\xa9\x3d\xa1\xe9\xdf\x9d\x99\x72\x72\x53\x03\x4e\x4d\xfe\xed\xb3\xe6\x54\x75\xf2\xf9\x43\xe3\x5e\xb1\x67\xf1\xff\x0d\x00\x00\xff\xff\x80\xac\xc1\x25\x44\x04\x00\x00"), + }, + "/charts/components/node-problem-detector/values.yaml": &vfsgen۰CompressedFileInfo{ + name: "values.yaml", + modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), + uncompressedSize: 2524, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x56\x4b\x6f\x1b\x39\x12\xbe\xf3\x57\x14\xa2\xc3\x5e\xd2\x92\x37\x40\xb0\x41\xdf\x9c\x17\x60\x6c\x6c\x0b\x56\x32\x97\xc1\xc0\x28\x91\xd5\xdd\x1c\xb3\xc9\x06\x59\x94\x25\x0c\xe6\xbf\x0f\x8a\x6c\x39\x52\x6c\x5f\x06\x3e\xc8\xac\xc7\xc7\xaa\xaf\x1e\xec\x44\xcc\xd6\xf7\xa9\x55\x00\x0b\xf8\x94\x13\x87\x11\xc6\xe0\x2d\x87\x08\x86\x3a\xeb\x2d\xdb\xe0\x13\x70\x00\x34\x46\x7e\x6e\x82\x21\x58\xc7\xb0\x75\x34\xc2\x67\x62\xd2\x62\xdb\x88\x6a\x4b\x05\x66\x0c\xd9\x33\x19\x40\x86\x95\x2e\x90\x8d\x0e\xbe\xb3\xfd\x12\xbe\x0f\x94\x08\x30\x12\x58\x2f\x80\x05\x5d\x5c\xa7\x48\xcd\x84\xfa\x01\x7b\x32\xc7\x00\x0a\xd8\x69\x10\x53\x0c\x3b\x6b\xc8\xc0\xa3\xe5\xc1\x7a\xe0\x81\x44\x8f\xd9\x31\x98\xa0\x1f\x28\x82\x1d\xb1\x27\xc0\x1d\x5a\x87\x5b\x47\x35\x86\x72\x79\x4d\x71\x60\x9e\x52\xbb\x5a\xf5\x96\x87\xbc\x5d\xea\x30\xae\x1e\xf2\x96\xa2\x27\xa6\xb4\xf2\xc1\x50\x33\xd5\xdc\x1a\x33\xe7\xb6\xe2\x48\xb4\x1a\x31\x31\xc5\x19\xab\x40\x1d\xb9\x5b\xd6\x1c\xef\xe7\xa8\xef\x4f\x23\x6e\x9a\x23\xa9\x93\xcb\xbd\xf5\x4f\xdc\x56\x1c\xe8\xac\xa3\xa4\x00\x5e\x87\x68\xe1\xaf\xbf\xcf\xaf\x73\xa1\x3f\x1a\x96\x0b\x7e\x24\x8a\x4d\x9a\x48\xdb\xce\x92\x99\xa1\x5e\x2a\xa2\x02\x38\xf5\x15\x42\x00\x9a\x23\x3f\xab\x07\x61\xc1\x35\xb3\x7a\xf9\x67\x0a\xfe\x17\x8b\xca\xf1\x73\x8b\x45\xb1\x39\xad\xf4\xab\x60\x2f\x98\x9e\xa3\x36\x42\x89\x0b\xfd\xa9\xcb\xa5\x07\xda\xe3\x38\x39\x82\xd0\x01\x6a\xb6\x3b\x14\x2e\x00\x8f\xd9\xba\xd0\xbf\x90\x31\xd8\x23\xc2\x8b\x4d\xfb\xef\x02\x9a\x4b\x55\xeb\xf9\x93\x4c\xf8\xfd\x0f\x75\x5e\xa7\x29\x86\x91\x78\xa0\x9c\xee\xd1\x98\x48\xa9\x54\x6b\xfd\x24\x05\xda\x4f\x21\x32\x45\x98\xd5\x0a\xe0\xb9\x4f\x0b\x17\xcb\xf2\xf7\x2a\xb8\x80\xbc\x86\x2c\x3f\xe7\xb0\x22\x69\xe1\xdd\xc5\xbb\xf7\xff\xab\xf1\x7e\x1f\x08\x26\x8a\x36\x94\x81\x7d\x1c\xac\x1e\xe0\xe1\x43\x6a\x9e\x30\x4c\xa0\x04\x5d\x88\xda\x6e\xdd\x01\xd2\xc1\xeb\x32\x7f\x80\x93\x4d\x14\x77\x14\xcf\x23\x1b\x08\x23\x7f\x24\xe4\x75\x05\x6d\x1a\xd8\x1c\xbc\x96\x72\x59\xcf\x14\x77\xe8\xaa\xff\xe5\xfa\x0a\x9e\x00\x7e\xf1\x6a\xe1\xfd\x78\x91\x94\x1a\x42\xe2\x09\x79\x98\x87\x77\x3e\xc9\x08\x18\x1b\x05\xfa\x5b\xe8\xc1\xd8\x58\xea\x79\x00\x51\x42\xf0\xf0\xff\x0f\xa9\x18\xd7\x8e\x37\x36\xb6\xb0\xda\x61\x5c\xb9\xd0\xaf\x94\x2a\x3b\x42\x10\x23\x4d\x21\x49\xf9\x0e\xad\xa4\xbc\xec\x75\x5c\xda\xf0\xca\x16\x78\x51\xaa\x00\x18\xfb\x16\x76\x17\xcb\x0f\xcb\xf7\xc2\x74\x76\x6e\x1d\x9c\xd5\x87\x16\xae\xba\x9b\xc0\xeb\x48\x89\x3c\xcf\xb7\xae\xb3\x73\x1b\xd2\x91\x78\xee\x18\x8f\x23\xdd\xee\x28\x46\x6b\xa8\x85\x37\x6f\x54\x97\x9d\x7b\x26\x54\x71\x8b\x5a\x22\xd6\x91\x90\xa9\x05\x8e\x59\x76\xed\x94\xa6\x2f\x5e\xf6\x9c\x69\xa1\x43\x97\x48\xa9\xca\xd2\x0d\xf1\x63\x88\x0f\xc2\xd0\x5d\xf6\x30\x05\x23\xb4\x88\x06\x7c\x55\xa9\x05\x7c\x75\xd8\xcb\xee\x8d\xd9\xbf\xb2\xd5\x43\xdd\xb1\xe2\xf7\x9f\x74\xf4\x94\x2d\x6e\x13\xd8\x04\x7c\x98\xac\x46\xe7\x0e\x6a\x01\x3e\x30\x44\xd2\x61\x1c\xc9\x1b\x32\x6f\x61\x9b\x19\x46\x3c\xc0\x96\x20\x27\xea\xb2\x93\x1e\x02\x4d\x91\xd1\x7a\x11\x81\xc6\x44\x69\xa9\x4e\xe2\x3d\x66\x21\xa2\xf5\xd5\xe7\xa7\xa4\xa6\x68\x43\xb4\x7c\xf8\xe4\x30\xa5\x1b\x1c\x67\x56\x12\xe9\x5c\xc4\xc1\x33\xed\xb9\x2d\x9d\x6e\x77\xd6\x51\x2f\x8c\x14\x92\x54\xa4\x14\x72\xd4\x54\x37\xa9\x42\xef\x03\xe3\xcf\xd5\xaa\x1c\x6e\xc9\xcd\xff\x73\x70\x14\x67\xa5\x92\xcd\x47\x5d\x47\x9a\x5b\xb8\x09\x1b\x3d\x90\xc9\x8e\xca\xd2\x08\x93\x98\x85\xd8\xc2\x97\xbd\x4d\x9c\x24\x94\xb8\xb3\x9a\x2e\xb5\x96\xc7\xaf\xb6\xeb\x66\xde\xc9\x09\x1e\x07\x99\xbe\x08\x08\x9b\x33\x3b\x48\x43\xc8\xce\x08\x47\xb5\xb2\xe6\x79\x8d\xeb\x84\x4a\x4b\xc8\xf2\x93\x72\xfc\x82\xc1\x41\xd8\x5c\x16\xd3\xab\xae\x14\x22\x11\x03\x7a\x33\x43\x95\x52\xc5\x4c\x6f\x01\x2b\x8e\x4d\xd0\x93\x97\x14\xc8\x40\x4e\x32\x9a\x82\x7b\x6c\x3d\x60\x1a\x27\x87\x2c\xb7\xcb\xb9\x55\x0a\xbb\xb2\x53\x0f\x95\x26\x19\x85\x0d\xb9\xd2\x23\x55\x32\x12\x47\xab\x0b\x69\x33\x13\xd7\x75\x31\xd6\x47\x86\xce\x9b\x54\x44\xc7\xc7\x1f\xdd\xb7\x93\x02\x90\xdf\xb5\x6a\x21\xcc\x97\x8b\xe1\xeb\xed\xad\x1c\x01\x76\xe8\x32\xb5\xf0\xf1\xf2\xee\x54\xbd\xbe\xfd\x7c\x7f\x73\x79\xfd\xe5\xc4\xe6\x6b\x0c\x63\x5b\xcf\x00\x9d\x25\x67\xee\xa8\x7b\x12\xcc\xa2\xb5\xac\x14\x18\x89\xd1\x20\xe3\x52\xc0\x94\xa2\x3d\x47\xfc\x2d\xb8\x3c\xd2\x3c\x9c\x27\x92\x6b\xa1\x7a\x16\x2f\x20\x4f\x06\x99\x36\x2c\x0c\xf6\x07\x99\xb2\x6b\xf4\xf2\xe1\x51\xbe\x48\x90\xc6\xe0\xa5\x04\xd5\x0c\xd2\x6c\xa7\xce\xdd\x5a\xb8\x0b\xce\x59\xdf\xff\x28\x62\xb5\x80\x11\xf7\x3f\xfc\xcf\x6f\x97\xa6\x29\xa5\x1f\x71\x2f\x03\x9c\x20\x9f\xe8\x4c\x8e\xe5\x01\xf4\xf3\x25\xea\xdc\xb7\x85\xff\xaa\x7f\x02\x00\x00\xff\xff\xbc\xc8\x2b\xcb\xdc\x09\x00\x00"), + }, "/charts/components/openebs-operator": &vfsgen۰DirInfo{ name: "openebs-operator", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), @@ -7122,6 +7235,7 @@ var vfsgenAssets = func() http.FileSystem { fs["/charts/components/istio-operator"].(os.FileInfo), fs["/charts/components/linkerd2"].(os.FileInfo), fs["/charts/components/metrics-server"].(os.FileInfo), + fs["/charts/components/node-problem-detector"].(os.FileInfo), fs["/charts/components/openebs-operator"].(os.FileInfo), fs["/charts/components/prometheus-operator"].(os.FileInfo), fs["/charts/components/rook"].(os.FileInfo), @@ -7507,6 +7621,26 @@ var vfsgenAssets = func() http.FileSystem { fs["/charts/components/metrics-server/templates/tests"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ fs["/charts/components/metrics-server/templates/tests/test-version.yaml"].(os.FileInfo), } + fs["/charts/components/node-problem-detector"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ + fs["/charts/components/node-problem-detector/Chart.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/README.md"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates"].(os.FileInfo), + fs["/charts/components/node-problem-detector/values.yaml"].(os.FileInfo), + } + fs["/charts/components/node-problem-detector/templates"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ + fs["/charts/components/node-problem-detector/templates/NOTES.txt"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/_helpers.tpl"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/clusterrole.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/clusterrolebinding.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/custom-config-configmap.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/daemonset.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/psp-clusterrole.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/psp-clusterrolebinding.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/psp.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/service.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/serviceaccount.yaml"].(os.FileInfo), + fs["/charts/components/node-problem-detector/templates/servicemonitor.yaml"].(os.FileInfo), + } fs["/charts/components/openebs-operator"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ fs["/charts/components/openebs-operator/Chart.yaml"].(os.FileInfo), fs["/charts/components/openebs-operator/OWNERS"].(os.FileInfo), diff --git a/pkg/components/node-problem-detector/component.go b/pkg/components/node-problem-detector/component.go new file mode 100644 index 000000000..ee7fbaf7d --- /dev/null +++ b/pkg/components/node-problem-detector/component.go @@ -0,0 +1,93 @@ +// Copyright 2021 The Lokomotive Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package nodeproblemdetector is code for node-problem-detector. +package nodeproblemdetector + +import ( + "fmt" + + "github.com/hashicorp/hcl/v2" + "github.com/hashicorp/hcl/v2/gohcl" + + "github.com/kinvolk/lokomotive/internal/template" + "github.com/kinvolk/lokomotive/pkg/components" + "github.com/kinvolk/lokomotive/pkg/components/util" + "github.com/kinvolk/lokomotive/pkg/k8sutil" +) + +const ( + // Name represents node-problem-detector component name as it should be referenced in function calls + // and in configuration. + Name = "node-problem-detector" +) + +type component struct { + CustomMonitors []string `hcl:"custom_monitors,optional"` + ServiceMonitor bool `hcl:"service_monitor,optional"` + Namespace string +} + +// NewConfig returns new node-problem-detector component configuration with default values set. +// +//nolint:golint +func NewConfig() *component { + return &component{ + Namespace: "kube-system", + } +} + +// LoadConfig loads the component config. +func (c *component) LoadConfig(configBody *hcl.Body, evalContext *hcl.EvalContext) hcl.Diagnostics { + if configBody == nil { + return hcl.Diagnostics{ + components.HCLDiagConfigBodyNil, + } + } + + if err := gohcl.DecodeBody(*configBody, evalContext, c); err != nil { + return err + } + + return nil +} + +// RenderManifests renders the Helm chart templates with values provided. +func (c *component) RenderManifests() (map[string]string, error) { + helmChart, err := components.Chart(Name) + if err != nil { + return nil, fmt.Errorf("retrieving chart from assets: %w", err) + } + + values, err := template.Render(chartValuesTmpl, c) + if err != nil { + return nil, fmt.Errorf("rendering chart values template: %w", err) + } + + renderedFiles, err := util.RenderChart(helmChart, Name, c.Metadata().Namespace.Name, values) + if err != nil { + return nil, fmt.Errorf("rendering chart: %w", err) + } + + return renderedFiles, nil +} + +func (c *component) Metadata() components.Metadata { + return components.Metadata{ + Name: Name, + Namespace: k8sutil.Namespace{ + Name: c.Namespace, + }, + } +} diff --git a/pkg/components/node-problem-detector/component_test.go b/pkg/components/node-problem-detector/component_test.go new file mode 100644 index 000000000..b98ce5328 --- /dev/null +++ b/pkg/components/node-problem-detector/component_test.go @@ -0,0 +1,98 @@ +// Copyright 2021 The Lokomotive Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nodeproblemdetector_test + +import ( + "testing" + + "github.com/hashicorp/hcl/v2" + "github.com/kinvolk/lokomotive/pkg/components/internal/testutil" + nodeproblemdetector "github.com/kinvolk/lokomotive/pkg/components/node-problem-detector" + "github.com/kinvolk/lokomotive/pkg/components/util" +) + +const name = "node-problem-detector" + +func TestRenderManifest(t *testing.T) { + tests := []struct { + desc string + hcl string + wantErr bool + }{ + { + desc: "Valid config", + hcl: ` +component "node-problem-detector" { + custom_monitors = ["testdata"] +} + `, + }, + } + + for _, tc := range tests { + b, d := util.GetComponentBody(tc.hcl, name) + if d != nil { + t.Errorf("%s - Error getting component body: %v", tc.desc, d) + } + + c := nodeproblemdetector.NewConfig() + + d = c.LoadConfig(b, nil) + + if !tc.wantErr && d.HasErrors() { + t.Errorf("%s - Valid config should not return error, got: %s", tc.desc, d) + } + + if tc.wantErr && !d.HasErrors() { + t.Errorf("%s - Wrong config should have returned an error", tc.desc) + } + + m, err := c.RenderManifests() + if err != nil { + t.Errorf("%s - Rendering manifests with valid config should succeed, got: %s", tc.desc, err) + } + + if len(m) == 0 { + t.Errorf("%s - Rendered manifests shouldn't be empty", tc.desc) + } + } +} + +func TestRenderManifestConfigMapCustomMonitor(t *testing.T) { + configHCL := ` +component "node-problem-detector" { + custom_monitors = ["testdata"] +} +` + + component := nodeproblemdetector.NewConfig() + + body, d := util.GetComponentBody(configHCL, name) + if d.HasErrors() { + t.Fatalf("Error getting component body: %v", d) + } + + if d = component.LoadConfig(body, &hcl.EvalContext{}); d.HasErrors() { + t.Fatalf("Valid config should not return error, got: %v", d) + } + + m := testutil.RenderManifests(t, component, name, configHCL) + jsonPath := "{.data.custom-monitor-0\\.json}" + expected := "testdata" + + gotConfig := testutil.ConfigFromMap(t, m, "node-problem-detector/templates/custom-config-configmap.yaml") + + testutil.MatchJSONPathStringValue(t, gotConfig, jsonPath, expected) +} diff --git a/pkg/components/node-problem-detector/doc.go b/pkg/components/node-problem-detector/doc.go new file mode 100644 index 000000000..3accd15a6 --- /dev/null +++ b/pkg/components/node-problem-detector/doc.go @@ -0,0 +1,15 @@ +// Copyright 2021 The Lokomotive Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nodeproblemdetector diff --git a/pkg/components/node-problem-detector/template.go b/pkg/components/node-problem-detector/template.go new file mode 100644 index 000000000..e802f5d56 --- /dev/null +++ b/pkg/components/node-problem-detector/template.go @@ -0,0 +1,38 @@ +// Copyright 2021 The Lokomotive Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nodeproblemdetector + +const chartValuesTmpl = ` +image: + tag: v0.8.7 +{{- if .CustomMonitors }} +settings: + {{- range $key, $val := .CustomMonitors }} + custom_monitor_definitions: + "custom-monitor-{{ $key }}.json": '{{ $val }}' + log_monitors: + - "/custom-config/custom-monitor-{{ $key }}.json" + {{- end }} + - /config/kernel-monitor.json + - /config/docker-monitor.json +{{- end }} +{{- if .ServiceMonitor }} +metrics: + serviceMonitor: + enabled: true + additionalLabels: + release: prometheus-operator +{{- end }} +` diff --git a/test/components/node-problem-detector/nodeproblemdetector_test.go b/test/components/node-problem-detector/nodeproblemdetector_test.go new file mode 100644 index 000000000..6aa06e434 --- /dev/null +++ b/test/components/node-problem-detector/nodeproblemdetector_test.go @@ -0,0 +1,165 @@ +// Copyright 2021 The Lokomotive Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build aws aws_edge packet aks +// +build e2e + +package nodeproblemdetector_test + +import ( + "context" + "fmt" + "strings" + "testing" + + testutil "github.com/kinvolk/lokomotive/test/components/util" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" +) + +const ( + daemonSetName = "node-problem-detector" + namespace = "kube-system" +) + +func TestNodeProblemDetectorDaemonSet(t *testing.T) { + client := testutil.CreateKubeClient(t) + + testutil.WaitForDaemonSet(t, client, namespace, daemonSetName, testutil.RetryInterval, testutil.TimeoutSlow) +} + +//nolint: funlen +func TestNodeProblemDetectorNodeEvent(t *testing.T) { + t.Parallel() + + client := testutil.CreateKubeClient(t).CoreV1() + nsclient := client.Namespaces() + + ns := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: testutil.TestNamespace("node-problem-detector"), + }, + } + + privileged := true + // Pod config. + pod := &corev1.Pod{ + TypeMeta: metav1.TypeMeta{ + Kind: "Pod", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + GenerateName: "node-problem-detector-test-", + }, + Spec: corev1.PodSpec{ + RestartPolicy: "Never", + Containers: []corev1.Container{ + { + Name: "nginx", + Image: "nginx", + SecurityContext: &corev1.SecurityContext{ + Privileged: &privileged, + }, + Command: []string{"sh"}, + Args: []string{"-c", "echo 'kernel: BUG: " + + "unable to handle kernel NULL pointer " + + "dereference at TESTING_IS_COOL' >> /dev/kmsg"}, + VolumeMounts: []corev1.VolumeMount{ + { + Name: "kmsg", + MountPath: "/dev/kmsg", + }, + }, + }, + }, + Volumes: []corev1.Volume{ + { + Name: "kmsg", + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: "/dev/kmsg", + }, + }, + }, + }, + }, + } + + // Creation of namespace. + ns, err := nsclient.Create(context.TODO(), ns, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("creating namespace: %v", err) + } + + t.Cleanup(func() { + if err := nsclient.Delete(context.TODO(), ns.Name, metav1.DeleteOptions{}); err != nil { + t.Logf("failed removing namespace: %v", err) + } + }) + + podsClient := client.Pods(ns.Name) + + // Retry pod creation. This might fail if node-problem-detector is not ready yet and some requests might fail. + if err := wait.PollImmediate(testutil.RetryInterval, testutil.TimeoutSlow, func() (done bool, err error) { + pod, err = podsClient.Create(context.TODO(), pod, metav1.CreateOptions{}) + if err != nil { + t.Logf("retrying pod creation, failed with: %v", err) + + return false, nil + } + + return true, nil + }); err != nil { + t.Fatalf("creating pod: %v", err) + } + + phase := corev1.PodUnknown + + if err := wait.PollImmediate(testutil.RetryInterval, testutil.TimeoutSlow, func() (done bool, err error) { + p, err := podsClient.Get(context.TODO(), pod.Name, metav1.GetOptions{}) + if err != nil { + return false, fmt.Errorf("couldn't get the pod %q: %w", pod.Name, err) + } + + // Check for event. + events, err := client.Events("default").List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return false, fmt.Errorf("couldn't list the events %w", err) + } + + phase = p.Status.Phase + if phase == corev1.PodSucceeded || phase == corev1.PodFailed { + for _, v := range events.Items { + if v.Reason == "KernelOops" && strings.Contains(v.Message, "TESTING_IS_COOL") { + return true, nil + } + } + } + + return false, nil + }); err != nil { + t.Errorf("waiting for the pod: %v", err) + } + + // Since pod failed print the logs. + if phase == corev1.PodFailed { + t.Error("pod failed with following error:") + + err := testutil.PrintPodsLogs(t, podsClient, &metav1.LabelSelector{MatchLabels: pod.Labels}) + if err != nil { + t.Errorf("printing error logs failed: %v", err) + } + } +} diff --git a/test/monitoring/components_metrics_test.go b/test/monitoring/components_metrics_test.go index 4737ffea7..ec468e2a8 100644 --- a/test/monitoring/components_metrics_test.go +++ b/test/monitoring/components_metrics_test.go @@ -107,6 +107,11 @@ func testComponentsPrometheusMetrics(t *testing.T, v1api v1.API) { query: "controller_runtime_reconcile_time_seconds_count{controller=\"istiocontrolplane-controller\"}", platforms: []testutil.Platform{testutil.PlatformPacket, testutil.PlatformAWS, testutil.PlatformAKS}, }, + { + componentName: "node-problem-detector", + query: "problem_counter{reason=\"KernelOops\"}", + platforms: []testutil.Platform{testutil.PlatformPacket, testutil.PlatformAWS, testutil.PlatformAKS}, + }, } for _, tc := range testCases {