fix(prometheus): add init containers to download plugins
Some checks failed
Generate README / generate-parameters (push) Failing after 15s
Helm / helm-lint (push) Successful in 15s
Helm / helm-unittest (push) Successful in 7s
Markdown linter / markdown-lint (push) Successful in 8s
Release / publish-chart (push) Successful in 8s
Markdown linter / markdown-link-checker (push) Successful in 43s

The following patch extends the helm chart of additional init containers for
each plugin.
This commit is contained in:
2025-09-20 16:19:49 +02:00
parent de8ef2b201
commit 413fe95b86
14 changed files with 315 additions and 68 deletions

4
.gitignore vendored
View File

@@ -1,6 +1,6 @@
charts charts
node_modules node_modules
target target
values2.yml values[0-9].yml
values2.yaml values[0-9].yaml
*.tgz *.tgz

149
README.md
View File

@@ -122,14 +122,15 @@ deployment:
secret.reloader.stakater.com/reload: "reposilite-tls" secret.reloader.stakater.com/reload: "reposilite-tls"
``` ```
### Network policies #### Network policies
Network policies can only take effect, when the used CNI plugin support network policies. The chart supports no custom Network policies can only take effect, when the used CNI plugin support network policies. The chart supports no custom
network policy implementation of CNI plugins. It's support only the official API resource of `networking.k8s.io/v1`. network policy implementation of CNI plugins. It's support only the official API resource of `networking.k8s.io/v1`.
The example below is an excerpt of the `values.yaml` file. The network policy contains ingress rules to allow incoming The example below is an excerpt of the `values.yaml` file. The network policy contains ingress rules to allow incoming
traffic from an ingress controller. Additionally one egress rule is defined, to allow the application outgoing access traffic from an ingress controller. Additionally two egress rules are defined. The first one to allow the application
to the internal running DNS server `core-dns`. outgoing access to the internal running DNS server `core-dns`. The second rule to be able to access the Apache Maven
Central repository via HTTPS.
> [!IMPORTANT] > [!IMPORTANT]
> Please keep in mind, that the namespace and pod selector labels can be different from environment to environment. For > Please keep in mind, that the namespace and pod selector labels can be different from environment to environment. For
@@ -156,6 +157,10 @@ networkPolicies:
protocol: TCP protocol: TCP
- port: 53 - port: 53
protocol: UDP protocol: UDP
- ports:
- port: 443
protocol: TCP
ingress: ingress:
- from: - from:
- namespaceSelector: - namespaceSelector:
@@ -169,6 +174,26 @@ networkPolicies:
protocol: TCP protocol: TCP
``` ```
### Prometheus
Reposilite is not able to expose metrics by default. Reposilite requires an additional plugin to expose the metrics via
`/metrics`. The plugin will be downloaded from Apache Maven Central, when the plugin is enabled directly or the
Prometheus feature has been enabled. The plugin is a simple JAR file, which will be stored in `/app/data/plugins`.
Furthermore, Reposilite will not expose the metrics without protection. For this reason must be defined basic auth
credentials. By default generate the helm chart a random username and password for basic auth. For debugging propose can
be set the credentials manually.
The following example enable Prometheus metrics with custom basic auth credentials:
```bash
CHART_VERSION=0.1.3
helm install --version "${CHART_VERSION}" reposilite volker.raschek/reposilite \
--set 'prometheus.metrics.enabled=true' \
--set 'prometheus.metrics.basicAuthUsername=my-username' \
--set 'prometheus.metrics.basicAuthUsername=my-password'
```
## Parameters ## Parameters
### Global ### Global
@@ -178,44 +203,56 @@ networkPolicies:
| `nameOverride` | Individual release name suffix. | `""` | | `nameOverride` | Individual release name suffix. | `""` |
| `fullnameOverride` | Override the complete release name logic. | `""` | | `fullnameOverride` | Override the complete release name logic. | `""` |
### Config
| Name | Description | Value |
| ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `config.plugins.prometheus.enabled` | Download the Prometheus plugin via an additional init container. The Prometheus plugin will automatically enabled, when Prometheus is enabled. | `false` |
| `config.plugins.prometheus.url` | URL to download the plugin. | `https://maven.reposilite.com/releases/com/reposilite/plugin/prometheus-plugin/3.5.25/prometheus-plugin-3.5.25-all.jar` |
### Deployment ### Deployment
| Name | Description | Value | | Name | Description | Value |
| -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | --------------------- | | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------- |
| `deployment.annotations` | Additional deployment annotations. | `{}` | | `deployment.annotations` | Additional deployment annotations. | `{}` |
| `deployment.labels` | Additional deployment labels. | `{}` | | `deployment.labels` | Additional deployment labels. | `{}` |
| `deployment.additionalContainers` | List of additional containers. | `[]` | | `deployment.additionalContainers` | List of additional containers. | `[]` |
| `deployment.affinity` | Affinity for the Reposilite deployment. | `{}` | | `deployment.affinity` | Affinity for the Reposilite deployment. | `{}` |
| `deployment.initContainers` | List of additional init containers. | `[]` | | `deployment.initContainers` | List of additional init containers. | `[]` |
| `deployment.dnsConfig` | dnsConfig of the Reposilite deployment. | `{}` | | `deployment.dnsConfig` | dnsConfig of the Reposilite deployment. | `{}` |
| `deployment.dnsPolicy` | dnsPolicy of the Reposilite deployment. | `""` | | `deployment.dnsPolicy` | dnsPolicy of the Reposilite deployment. | `""` |
| `deployment.hostname` | Individual hostname of the pod. | `""` | | `deployment.hostname` | Individual hostname of the pod. | `""` |
| `deployment.subdomain` | Individual domain of the pod. | `""` | | `deployment.subdomain` | Individual domain of the pod. | `""` |
| `deployment.hostNetwork` | Use the kernel network namespace of the host system. | `false` | | `deployment.hostNetwork` | Use the kernel network namespace of the host system. | `false` |
| `deployment.imagePullSecrets` | Secret to use for pulling the image. | `[]` | | `deployment.imagePullSecrets` | Secret to use for pulling the image. | `[]` |
| `deployment.reposilite.args` | Arguments passed to the Reposilite container. | `[]` | | `deployment.reposilite.args` | Arguments passed to the Reposilite container. | `[]` |
| `deployment.reposilite.command` | Command passed to the Reposilite container. | `[]` | | `deployment.reposilite.command` | Command passed to the Reposilite container. | `[]` |
| `deployment.reposilite.env` | List of environment variables for the Reposilite container. | | | `deployment.reposilite.env` | List of environment variables for the Reposilite container. | |
| `deployment.reposilite.envFrom` | List of environment variables mounted from configMaps or secrets for the Reposilite container. | `[]` | | `deployment.reposilite.envFrom` | List of environment variables mounted from configMaps or secrets for the Reposilite container. | `[]` |
| `deployment.reposilite.image.registry` | Image registry, eg. `docker.io`. | `docker.io` | | `deployment.reposilite.image.registry` | Image registry, eg. `docker.io`. | `docker.io` |
| `deployment.reposilite.image.repository` | Image repository, eg. `library/busybox`. | `dzikoysk/reposilite` | | `deployment.reposilite.image.repository` | Image repository, eg. `library/busybox`. | `dzikoysk/reposilite` |
| `deployment.reposilite.image.tag` | Custom image tag, eg. `0.1.0`. Defaults to `appVersion`. | `""` | | `deployment.reposilite.image.tag` | Custom image tag, eg. `0.1.0`. Defaults to `appVersion`. | `""` |
| `deployment.reposilite.image.pullPolicy` | Image pull policy. | `IfNotPresent` | | `deployment.reposilite.image.pullPolicy` | Image pull policy. | `IfNotPresent` |
| `deployment.reposilite.resources` | CPU and memory resources of the pod. | `{}` | | `deployment.reposilite.resources` | CPU and memory resources of the pod. | `{}` |
| `deployment.reposilite.securityContext` | Security context of the container of the deployment. | `{}` | | `deployment.reposilite.securityContext` | Security context of the container of the deployment. | `{}` |
| `deployment.reposilite.volumeMounts` | Additional volume mounts. | `[]` | | `deployment.reposilite.volumeMounts` | Additional volume mounts. | `[]` |
| `deployment.nodeSelector` | NodeSelector of the Reposilite deployment. | `{}` | | `deployment.nodeSelector` | NodeSelector of the Reposilite deployment. | `{}` |
| `deployment.priorityClassName` | PriorityClassName of the Reposilite deployment. | `""` | | `deployment.pluginContainer.args` | Arguments passed to the plugin container. | `["--location","--fail","--max-time","60"]` |
| `deployment.replicas` | Number of replicas for the Reposilite deployment. | `1` | | `deployment.pluginContainer.image.registry` | Image registry, eg. `docker.io`. | `docker.io` |
| `deployment.restartPolicy` | Restart policy of the Reposilite deployment. | `""` | | `deployment.pluginContainer.image.repository` | Image repository, eg. `curlimages/curl`. | `curlimages/curl` |
| `deployment.securityContext` | Security context of the Reposilite deployment. | `{}` | | `deployment.pluginContainer.image.tag` | Custom image tag, eg. `0.1.0`. | `8.15.0` |
| `deployment.strategy.type` | Strategy type - `Recreate` or `RollingUpdate`. | `RollingUpdate` | | `deployment.pluginContainer.image.pullPolicy` | Image pull policy. | `IfNotPresent` |
| `deployment.strategy.rollingUpdate.maxSurge` | The maximum number of pods that can be scheduled above the desired number of pods during a rolling update. | `1` | | `deployment.priorityClassName` | PriorityClassName of the Reposilite deployment. | `""` |
| `deployment.strategy.rollingUpdate.maxUnavailable` | The maximum number of pods that can be unavailable during a rolling update. | `1` | | `deployment.replicas` | Number of replicas for the Reposilite deployment. | `1` |
| `deployment.terminationGracePeriodSeconds` | How long to wait until forcefully kill the pod. | `60` | | `deployment.restartPolicy` | Restart policy of the Reposilite deployment. | `""` |
| `deployment.tolerations` | Tolerations of the Reposilite deployment. | `[]` | | `deployment.securityContext` | Security context of the Reposilite deployment. | `{}` |
| `deployment.topologySpreadConstraints` | TopologySpreadConstraints of the Reposilite deployment. | `[]` | | `deployment.strategy.type` | Strategy type - `Recreate` or `RollingUpdate`. | `RollingUpdate` |
| `deployment.volumes` | Additional volumes to mount into the pods of the reposilite deployment. | `[]` | | `deployment.strategy.rollingUpdate.maxSurge` | The maximum number of pods that can be scheduled above the desired number of pods during a rolling update. | `1` |
| `deployment.strategy.rollingUpdate.maxUnavailable` | The maximum number of pods that can be unavailable during a rolling update. | `1` |
| `deployment.terminationGracePeriodSeconds` | How long to wait until forcefully kill the pod. | `60` |
| `deployment.tolerations` | Tolerations of the Reposilite deployment. | `[]` |
| `deployment.topologySpreadConstraints` | TopologySpreadConstraints of the Reposilite deployment. | `[]` |
| `deployment.volumes` | Additional volumes to mount into the pods of the reposilite deployment. | `[]` |
### Horizontal Pod Autoscaler (HPA) ### Horizontal Pod Autoscaler (HPA)
@@ -265,6 +302,39 @@ networkPolicies:
| `persistentVolumeClaim.new.size` | Size of the persistent volume claim. | `10Gi` | | `persistentVolumeClaim.new.size` | Size of the persistent volume claim. | `10Gi` |
| `persistentVolumeClaim.new.storageClass` | Custom storage class. Left it empty to use the clusters default storage class. | `""` | | `persistentVolumeClaim.new.storageClass` | Custom storage class. Left it empty to use the clusters default storage class. | `""` |
### Prometheus
| Name | Description | Value |
| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| `prometheus.metrics.enabled` | Enable of scraping metrics by Prometheus. | `false` |
| `prometheus.metrics.basicAuthUsername` | Username for basic auth. The username and password is required by reposilite to expose metrics. Default: random alpha numeric string. | `""` |
| `prometheus.metrics.basicAuthPassword` | Password for basic auth. The username and password is required by reposilite to expose metrics. Default random alpha numeric string. | `""` |
| `prometheus.metrics.podMonitor.enabled` | Enable creation of a podMonitor. Excludes the existence of a serviceMonitor resource. | `false` |
| `prometheus.metrics.podMonitor.annotations` | Additional podMonitor annotations. | `{}` |
| `prometheus.metrics.podMonitor.enableHttp2` | Enable HTTP2. | `false` |
| `prometheus.metrics.podMonitor.followRedirects` | FollowRedirects configures whether scrape requests follow HTTP 3xx redirects. | `false` |
| `prometheus.metrics.podMonitor.honorLabels` | Honor labels. | `false` |
| `prometheus.metrics.podMonitor.labels` | Additional podMonitor labels. | `{}` |
| `prometheus.metrics.podMonitor.interval` | Interval at which metrics should be scraped. If not specified Prometheus' global scrape interval is used. | `60s` |
| `prometheus.metrics.podMonitor.path` | HTTP path of the Reposilite pod for scraping Prometheus metrics. | `/metrics` |
| `prometheus.metrics.podMonitor.port` | HTTP port of the Reposilite pod for scraping Prometheus metrics. | `http` |
| `prometheus.metrics.podMonitor.relabelings` | RelabelConfigs to apply to samples before scraping. Prometheus Operator automatically adds relabelings for a few standard Kubernetes fields. | `[]` |
| `prometheus.metrics.podMonitor.scrapeTimeout` | Timeout after which the scrape is ended. If not specified, global Prometheus scrape timeout is used. | `30s` |
| `prometheus.metrics.podMonitor.scheme` | HTTP scheme to use for scraping. For example `http` or `https`. | `http` |
| `prometheus.metrics.podMonitor.tlsConfig` | TLS configuration to use when scraping the metric endpoint by Prometheus. | `{}` |
| `prometheus.metrics.serviceMonitor.enabled` | Enable creation of a serviceMonitor. Excludes the existence of a podMonitor resource. | `false` |
| `prometheus.metrics.serviceMonitor.annotations` | Additional serviceMonitor annotations. | `{}` |
| `prometheus.metrics.serviceMonitor.labels` | Additional serviceMonitor labels. | `{}` |
| `prometheus.metrics.serviceMonitor.enableHttp2` | Enable HTTP2. | `false` |
| `prometheus.metrics.serviceMonitor.followRedirects` | FollowRedirects configures whether scrape requests follow HTTP 3xx redirects. | `false` |
| `prometheus.metrics.serviceMonitor.honorLabels` | Honor labels. | `false` |
| `prometheus.metrics.serviceMonitor.interval` | Interval at which metrics should be scraped. If not specified Prometheus' global scrape interval is used. | `60s` |
| `prometheus.metrics.serviceMonitor.path` | HTTP path for scraping Prometheus metrics. | `/metrics` |
| `prometheus.metrics.serviceMonitor.relabelings` | RelabelConfigs to apply to samples before scraping. Prometheus Operator automatically adds relabelings for a few standard Kubernetes fields. | `[]` |
| `prometheus.metrics.serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended. If not specified, global Prometheus scrape timeout is used. | `30s` |
| `prometheus.metrics.serviceMonitor.scheme` | HTTP scheme to use for scraping. For example `http` or `https`. | `http` |
| `prometheus.metrics.serviceMonitor.tlsConfig` | TLS configuration to use when scraping the metric endpoint by Prometheus. | `{}` |
### Service ### Service
| Name | Description | Value | | Name | Description | Value |
@@ -280,6 +350,7 @@ networkPolicies:
| `service.loadBalancerIP` | LoadBalancer will get created with the IP specified in this field. Requires service from type `LoadBalancer`. | `""` | | `service.loadBalancerIP` | LoadBalancer will get created with the IP specified in this field. Requires service from type `LoadBalancer`. | `""` |
| `service.loadBalancerSourceRanges` | Source range filter for LoadBalancer. Requires service from type `LoadBalancer`. | `[]` | | `service.loadBalancerSourceRanges` | Source range filter for LoadBalancer. Requires service from type `LoadBalancer`. | `[]` |
| `service.port` | Port to forward the traffic to. | `8080` | | `service.port` | Port to forward the traffic to. | `8080` |
| `service.scheme` | Name of the service port. This name is also used as scheme / port name of the service monitor resource. | `http` |
| `service.sessionAffinity` | Supports `ClientIP` and `None`. Enable client IP based session affinity via `ClientIP`. | `None` | | `service.sessionAffinity` | Supports `ClientIP` and `None`. Enable client IP based session affinity via `ClientIP`. | `None` |
| `service.sessionAffinityConfig` | Contains the configuration of the session affinity. | `{}` | | `service.sessionAffinityConfig` | Contains the configuration of the session affinity. | `{}` |
| `service.type` | Kubernetes service type for the traffic. | `ClusterIP` | | `service.type` | Kubernetes service type for the traffic. | `ClusterIP` |

View File

@@ -36,6 +36,13 @@
{{/* image */}} {{/* image */}}
{{- define "reposilite.deployment.images.plugin.fqin" -}}
{{- $registry := .Values.deployment.pluginContainer.image.registry -}}
{{- $repository := .Values.deployment.pluginContainer.image.repository -}}
{{- $tag := default .Chart.AppVersion .Values.deployment.pluginContainer.image.tag -}}
{{- printf "%s/%s:%s" $registry $repository $tag -}}
{{- end -}}
{{- define "reposilite.deployment.images.reposilite.fqin" -}} {{- define "reposilite.deployment.images.reposilite.fqin" -}}
{{- $registry := .Values.deployment.reposilite.image.registry -}} {{- $registry := .Values.deployment.reposilite.image.registry -}}
{{- $repository := .Values.deployment.reposilite.image.repository -}} {{- $repository := .Values.deployment.reposilite.image.repository -}}
@@ -52,6 +59,34 @@
{{- end }} {{- end }}
{{- end }} {{- end }}
{{/* initContainers */}}
{{- define "reposilite.deployment.initContainers" -}}
{{- $initContainers := .Values.deployment.initContainers | default list -}}
{{- $pluginContainerImage := (include "reposilite.deployment.images.plugin.fqin" . ) }}
{{- $pluginContainerArgs := .Values.deployment.pluginContainer.args | default list }}
{{- $pluginContainerArgs := concat $pluginContainerArgs (list "--output-dir" "/app/data/plugins" ) }}
{{- $pluginContainerVolumeMounts := list (dict "name" "plugins" "mountPath" "/app/data/plugins") }}
{{- if eq (include "reposilite.plugins.prometheus.enabled" $) "true" }}
{{- $fileName := splitList "/" (tpl .Values.config.plugins.prometheus.url $) | last }}
{{- $individualArgs := concat $pluginContainerArgs (list "--output" $fileName (tpl .Values.config.plugins.prometheus.url $)) }}
{{- $initContainers = concat $initContainers (list (dict "args" $individualArgs "name" "download-prometheus-plugin" "image" $pluginContainerImage "volumeMounts" $pluginContainerVolumeMounts)) }}
{{- end }}
{{ toYaml (dict "initContainers" $initContainers) }}
{{- end }}
{{/* plugins */}}
{{- define "reposilite.plugins.prometheus.enabled" -}}
{{- if or .Values.config.plugins.prometheus.enabled .Values.prometheus.metrics.enabled -}}
true
{{- else -}}
false
{{- end -}}
{{- end }}
{{/* serviceAccount */}} {{/* serviceAccount */}}
{{- define "reposilite.deployment.serviceAccount" -}} {{- define "reposilite.deployment.serviceAccount" -}}
@@ -69,6 +104,11 @@
{{- if .Values.persistentVolumeClaim.enabled }} {{- if .Values.persistentVolumeClaim.enabled }}
{{- $volumeMounts = concat $volumeMounts (list (dict "name" "data" "mountPath" .Values.persistentVolumeClaim.path )) }} {{- $volumeMounts = concat $volumeMounts (list (dict "name" "data" "mountPath" .Values.persistentVolumeClaim.path )) }}
{{- end }} {{- end }}
{{- if eq (include "reposilite.plugins.prometheus.enabled" $) "true" }}
{{- $volumeMounts = concat $volumeMounts (list (dict "name" "plugins" "mountPath" "/app/data/plugins")) }}
{{- end }}
{{ toYaml (dict "volumeMounts" $volumeMounts) }} {{ toYaml (dict "volumeMounts" $volumeMounts) }}
{{- end -}} {{- end -}}
@@ -85,6 +125,10 @@
{{- $volumes = concat $volumes (list (dict "name" "data" "persistentVolumeClaim" (dict "claimName" $persistentVolumeClaimName))) }} {{- $volumes = concat $volumes (list (dict "name" "data" "persistentVolumeClaim" (dict "claimName" $persistentVolumeClaimName))) }}
{{- end }} {{- end }}
{{- if eq (include "reposilite.plugins.prometheus.enabled" $) "true" }}
{{- $volumes = concat $volumes (list (dict "name" "plugins" "emptyDir" dict)) }}
{{- end }}
{{ toYaml (dict "volumes" $volumes) }} {{ toYaml (dict "volumes" $volumes) }}
{{- end -}} {{- end -}}

View File

@@ -31,5 +31,5 @@ false
{{- define "reposilite.serviceMonitor.selectorLabels" -}} {{- define "reposilite.serviceMonitor.selectorLabels" -}}
{{ include "reposilite.selectorLabels" . }} {{ include "reposilite.selectorLabels" . }}
{{/* Add label to select the correct service via `selector.matchLabels` of the serviceMonitor resource. */}} {{/* Add label to select the correct service via `selector.matchLabels` of the serviceMonitor resource. */}}
app.kubernetes.io/service-name: http app.kubernetes.io/service-name: {{ required "The scheme of the serviceMonitor is not defined!" .Values.service.scheme }}
{{- end }} {{- end }}

View File

@@ -7,8 +7,6 @@
{{- if .Values.service.annotations }} {{- if .Values.service.annotations }}
{{ toYaml .Values.service.annotations }} {{ toYaml .Values.service.annotations }}
{{- end }} {{- end }}
{{/* Add label to select the correct service via `selector.matchLabels` of the serviceMonitor resource. */}}
app.kubernetes.io/service-name: http
{{- end }} {{- end }}
{{/* labels */}} {{/* labels */}}
@@ -18,6 +16,8 @@ app.kubernetes.io/service-name: http
{{- if .Values.service.labels }} {{- if .Values.service.labels }}
{{ toYaml .Values.service.labels }} {{ toYaml .Values.service.labels }}
{{- end }} {{- end }}
{{/* Add label to select the correct service via `selector.matchLabels` of the serviceMonitor resource. */}}
app.kubernetes.io/service-name: {{ required "The scheme of the serviceMonitor is not defined!" .Values.service.scheme }}
{{- end }} {{- end }}
{{/* names */}} {{/* names */}}

View File

@@ -109,6 +109,11 @@ spec:
imagePullSecrets: imagePullSecrets:
{{- toYaml . | nindent 8 }} {{- toYaml . | nindent 8 }}
{{- end }} {{- end }}
{{- $initContainers := (include "reposilite.deployment.initContainers" . | fromYaml) }}
{{- if and (hasKey $initContainers "initContainers") (gt (len $initContainers.initContainers) 0) }}
initContainers:
{{- toYaml $initContainers.initContainers | nindent 6 }}
{{- end }}
{{- with .Values.deployment.nodeSelector }} {{- with .Values.deployment.nodeSelector }}
nodeSelector: nodeSelector:
{{- toYaml . | nindent 8 }} {{- toYaml . | nindent 8 }}

View File

@@ -27,13 +27,17 @@ spec:
honorLabels: {{ required "The honorLabels option of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.honorLabels }} honorLabels: {{ required "The honorLabels option of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.honorLabels }}
interval: {{ required "The scrape interval of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.interval }} interval: {{ required "The scrape interval of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.interval }}
path: {{ required "The metric path of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.path }} path: {{ required "The metric path of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.path }}
port: "8080" port: {{ required "The metric port of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.port | quote }}
{{- with .Values.prometheus.metrics.podMonitor.relabelings }} {{- with .Values.prometheus.metrics.podMonitor.relabelings }}
relabelings: relabelings:
{{- toYaml . | nindent 6 }} {{- toYaml . | nindent 6 }}
{{- end }} {{- end }}
scrapeTimeout: {{ required "The scrape timeout of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.scrapeTimeout }} scrapeTimeout: {{ required "The scrape timeout of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.scrapeTimeout }}
scheme: http scheme: {{ required "The scheme of the podMonitor is not defined!" .Values.prometheus.metrics.podMonitor.scheme }}
{{- with .Values.prometheus.metrics.podMonitor.tlsConfig }}
tlsConfig:
{{- toYaml . | nindent 6 }}
{{- end }}
namespaceSelector: namespaceSelector:
matchNames: matchNames:
- {{ .Release.Namespace }} - {{ .Release.Namespace }}

View File

@@ -27,13 +27,17 @@ spec:
honorLabels: {{ required "The honorLabels option of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.honorLabels }} honorLabels: {{ required "The honorLabels option of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.honorLabels }}
interval: {{ required "The scrape interval of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.interval }} interval: {{ required "The scrape interval of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.interval }}
path: {{ required "The metric path of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.path }} path: {{ required "The metric path of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.path }}
port: {{ required "The port of the serviceMonitor is not defined!" .Values.service.scheme }}
{{- with .Values.prometheus.metrics.serviceMonitor.relabelings }} {{- with .Values.prometheus.metrics.serviceMonitor.relabelings }}
relabelings: relabelings:
{{- toYaml . | nindent 6 }} {{- toYaml . | nindent 6 }}
{{- end }} {{- end }}
scrapeTimeout: {{ required "The scrape timeout of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.scrapeTimeout }} scrapeTimeout: {{ required "The scrape timeout of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.scrapeTimeout }}
scheme: http scheme: {{ required "The scheme of the serviceMonitor is not defined!" .Values.prometheus.metrics.serviceMonitor.scheme }}
targetPort: 8080 {{- with .Values.prometheus.metrics.serviceMonitor.tlsConfig }}
tlsConfig:
{{- toYaml . | nindent 6 }}
{{- end }}
namespaceSelector: namespaceSelector:
matchNames: matchNames:
- {{ .Release.Namespace }} - {{ .Release.Namespace }}

View File

@@ -0,0 +1,42 @@
chart:
appVersion: 0.1.0
version: 0.1.0
suite: Test reposilite plugins
release:
name: reposilite-unittest
namespace: testing
templates:
- templates/deployment.yaml
- templates/secretPrometheusBasicAuth.yaml
tests:
- it: Test init containers for prometheus
set:
config.plugins.prometheus.enabled: true
config.plugins.prometheus.url: "https://reposilite.com/plugins/prometheus.jar"
deployment.pluginContainer.image.tag: 0.1.0
asserts:
- contains:
path: spec.template.spec.initContainers
content:
args:
- --location
- --fail
- --max-time
- "60"
- --output-dir
- /app/data/plugins
- --output
- prometheus.jar
- https://reposilite.com/plugins/prometheus.jar
name: download-prometheus-plugin
image: docker.io/curlimages/curl:0.1.0
volumeMounts:
- mountPath: /app/data/plugins
name: plugins
template: templates/deployment.yaml
- contains:
path: spec.template.spec.volumes
content:
name: plugins
emptyDir: {}
template: templates/deployment.yaml

View File

@@ -390,6 +390,19 @@ tests:
- name: my-special-secret - name: my-special-secret
template: templates/deployment.yaml template: templates/deployment.yaml
- it: Test initContainers
set:
deployment.initContainers:
- name: busybox
image: docker.io/library/busybox:latest
asserts:
- contains:
path: spec.template.spec.initContainers
content:
name: busybox
image: docker.io/library/busybox:latest
template: templates/deployment.yaml
- it: Test nodeSelector - it: Test nodeSelector
set: set:
deployment.nodeSelector: deployment.nodeSelector:

View File

@@ -67,7 +67,7 @@ tests:
name: reposilite-unittest-basic-auth-credentials name: reposilite-unittest-basic-auth-credentials
- equal: - equal:
path: spec.podMetricsEndpoints[0].enableHttp2 path: spec.podMetricsEndpoints[0].enableHttp2
value: true value: false
- equal: - equal:
path: spec.podMetricsEndpoints[0].followRedirects path: spec.podMetricsEndpoints[0].followRedirects
value: false value: false
@@ -82,7 +82,7 @@ tests:
value: /metrics value: /metrics
- equal: - equal:
path: spec.podMetricsEndpoints[0].port path: spec.podMetricsEndpoints[0].port
value: "8080" value: http
- notExists: - notExists:
path: spec.podMetricsEndpoints[0].relabelings path: spec.podMetricsEndpoints[0].relabelings
- equal: - equal:
@@ -133,12 +133,14 @@ tests:
prometheus.metrics.podMonitor.honorLabels: true prometheus.metrics.podMonitor.honorLabels: true
prometheus.metrics.podMonitor.interval: "180s" prometheus.metrics.podMonitor.interval: "180s"
prometheus.metrics.podMonitor.path: "/my-metrics" prometheus.metrics.podMonitor.path: "/my-metrics"
prometheus.metrics.podMonitor.port: "8443"
prometheus.metrics.podMonitor.relabelings: prometheus.metrics.podMonitor.relabelings:
- sourceLabels: [ container ] - sourceLabels: [ container ]
separator: ";" separator: ";"
regex: "app" regex: "app"
replacement: "$1" replacement: "$1"
action: "drop" action: "drop"
prometheus.metrics.podMonitor.scheme: https
prometheus.metrics.podMonitor.scrapeTimeout: "5s" prometheus.metrics.podMonitor.scrapeTimeout: "5s"
asserts: asserts:
- hasDocuments: - hasDocuments:
@@ -160,7 +162,7 @@ tests:
value: /my-metrics value: /my-metrics
- equal: - equal:
path: spec.podMetricsEndpoints[0].port path: spec.podMetricsEndpoints[0].port
value: "8080" value: "8443"
- contains: - contains:
path: spec.podMetricsEndpoints[0].relabelings path: spec.podMetricsEndpoints[0].relabelings
content: content:
@@ -174,4 +176,4 @@ tests:
value: 5s value: 5s
- equal: - equal:
path: spec.podMetricsEndpoints[0].scheme path: spec.podMetricsEndpoints[0].scheme
value: http value: https

View File

@@ -68,7 +68,7 @@ tests:
name: reposilite-unittest-basic-auth-credentials name: reposilite-unittest-basic-auth-credentials
- equal: - equal:
path: spec.endpoints[0].enableHttp2 path: spec.endpoints[0].enableHttp2
value: true value: false
- equal: - equal:
path: spec.endpoints[0].followRedirects path: spec.endpoints[0].followRedirects
value: false value: false
@@ -90,8 +90,8 @@ tests:
path: spec.endpoints[0].scheme path: spec.endpoints[0].scheme
value: http value: http
- equal: - equal:
path: spec.endpoints[0].targetPort path: spec.endpoints[0].port
value: 8080 value: http
- contains: - contains:
path: spec.namespaceSelector.matchNames path: spec.namespaceSelector.matchNames
content: content:
@@ -142,7 +142,8 @@ tests:
replacement: "$1" replacement: "$1"
action: "drop" action: "drop"
prometheus.metrics.serviceMonitor.scrapeTimeout: "5s" prometheus.metrics.serviceMonitor.scrapeTimeout: "5s"
prometheus.metrics.serviceMonitor.scheme: "http" prometheus.metrics.serviceMonitor.scheme: "https"
service.scheme: https
asserts: asserts:
- hasDocuments: - hasDocuments:
count: 1 count: 1
@@ -161,6 +162,9 @@ tests:
- equal: - equal:
path: spec.endpoints[0].path path: spec.endpoints[0].path
value: /my-metrics value: /my-metrics
- equal:
path: spec.endpoints[0].port
value: https
- contains: - contains:
path: spec.endpoints[0].relabelings path: spec.endpoints[0].relabelings
content: content:
@@ -174,4 +178,4 @@ tests:
value: 5s value: 5s
- equal: - equal:
path: spec.endpoints[0].scheme path: spec.endpoints[0].scheme
value: http value: https

View File

@@ -24,16 +24,15 @@ tests:
kind: Service kind: Service
name: reposilite-unittest name: reposilite-unittest
namespace: testing namespace: testing
- equal: - notExists:
path: metadata.annotations path: metadata.annotations
value:
app.kubernetes.io/service-name: http
- equal: - equal:
path: metadata.labels path: metadata.labels
value: value:
app.kubernetes.io/instance: reposilite-unittest app.kubernetes.io/instance: reposilite-unittest
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: reposilite app.kubernetes.io/name: reposilite
app.kubernetes.io/service-name: http
app.kubernetes.io/version: 0.1.0 app.kubernetes.io/version: 0.1.0
helm.sh/chart: reposilite-0.1.0 helm.sh/chart: reposilite-0.1.0
- notExists: - notExists:
@@ -88,6 +87,13 @@ tests:
- failedTemplate: - failedTemplate:
errorMessage: No service port defined! errorMessage: No service port defined!
- it: Require scheme.
set:
service.scheme: ""
asserts:
- failedTemplate:
errorMessage: No service scheme defined!
- it: Require sessionAffinity. - it: Require sessionAffinity.
set: set:
service.sessionAffinity: "" service.sessionAffinity: ""
@@ -108,11 +114,11 @@ tests:
foo: bar foo: bar
service.labels: service.labels:
bar: foo bar: foo
service.scheme: https
asserts: asserts:
- equal: - equal:
path: metadata.annotations path: metadata.annotations
value: value:
app.kubernetes.io/service-name: http
foo: bar foo: bar
- equal: - equal:
path: metadata.labels path: metadata.labels
@@ -120,6 +126,7 @@ tests:
app.kubernetes.io/instance: reposilite-unittest app.kubernetes.io/instance: reposilite-unittest
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: reposilite app.kubernetes.io/name: reposilite
app.kubernetes.io/service-name: https
app.kubernetes.io/version: 0.1.0 app.kubernetes.io/version: 0.1.0
helm.sh/chart: reposilite-0.1.0 helm.sh/chart: reposilite-0.1.0
bar: foo bar: foo
@@ -137,6 +144,7 @@ tests:
service.loadBalancerSourceRanges: service.loadBalancerSourceRanges:
- "11.12.0.0/17" - "11.12.0.0/17"
service.port: 10443 service.port: 10443
service.scheme: https
service.sessionAffinity: ClientIP service.sessionAffinity: ClientIP
service.type: LoadBalancer service.type: LoadBalancer
asserts: asserts:
@@ -164,6 +172,9 @@ tests:
path: spec.loadBalancerSourceRanges path: spec.loadBalancerSourceRanges
value: value:
- "11.12.0.0/17" - "11.12.0.0/17"
- equal:
path: spec.ports[0].name
value: https
- equal: - equal:
path: spec.ports[0].port path: spec.ports[0].port
value: 10443 value: 10443

View File

@@ -6,6 +6,17 @@
nameOverride: "" nameOverride: ""
fullnameOverride: "" fullnameOverride: ""
## @section Config
config:
plugins:
## @param config.plugins.prometheus.enabled Download the Prometheus plugin via an additional init container. The Prometheus plugin will automatically enabled, when Prometheus is enabled.
## @param config.plugins.prometheus.url URL to download the plugin.
prometheus:
enabled: false
url: https://maven.reposilite.com/releases/com/reposilite/plugin/prometheus-plugin/{{ .Chart.AppVersion }}/prometheus-plugin-{{ .Chart.AppVersion }}-all.jar
## @section Deployment ## @section Deployment
deployment: deployment:
## @param deployment.annotations Additional deployment annotations. ## @param deployment.annotations Additional deployment annotations.
@@ -149,6 +160,24 @@ deployment:
## @param deployment.nodeSelector NodeSelector of the Reposilite deployment. ## @param deployment.nodeSelector NodeSelector of the Reposilite deployment.
nodeSelector: {} nodeSelector: {}
pluginContainer:
## @param deployment.pluginContainer.args Arguments passed to the plugin container.
args:
- "--location"
- "--fail"
- "--max-time"
- "60"
## @param deployment.pluginContainer.image.registry Image registry, eg. `docker.io`.
## @param deployment.pluginContainer.image.repository Image repository, eg. `curlimages/curl`.
## @param deployment.pluginContainer.image.tag Custom image tag, eg. `0.1.0`.
## @param deployment.pluginContainer.image.pullPolicy Image pull policy.
image:
registry: docker.io
repository: curlimages/curl
tag: "8.15.0"
pullPolicy: IfNotPresent
## @param deployment.priorityClassName PriorityClassName of the Reposilite deployment. ## @param deployment.priorityClassName PriorityClassName of the Reposilite deployment.
priorityClassName: "" priorityClassName: ""
@@ -302,6 +331,11 @@ networkPolicy:
# - port: 53 # - port: 53
# protocol: UDP # protocol: UDP
## Allow outgoing HTTP traffic. For example to download maven artifacts from Apache Maven Central or Reposlite plugins from upstream.
# - ports:
# - port: 443
# protocol: TCP
ingress: [] ingress: []
# Allow incoming HTTP traffic from prometheus. # Allow incoming HTTP traffic from prometheus.
# #
@@ -315,6 +349,8 @@ networkPolicy:
# ports: # ports:
# - port: http # - port: http
# protocol: TCP # protocol: TCP
# - port: https
# protocol: TCP
# Allow incoming HTTP traffic from ingress-nginx. # Allow incoming HTTP traffic from ingress-nginx.
# #
@@ -328,6 +364,8 @@ networkPolicy:
# ports: # ports:
# - port: http # - port: http
# protocol: TCP # protocol: TCP
# - port: https
# protocol: TCP
## @section Persistent Volume Claim ## @section Persistent Volume Claim
@@ -360,11 +398,11 @@ persistentVolumeClaim:
prometheus: prometheus:
## @param prometheus.metrics.enabled Enable of scraping metrics by Prometheus. ## @param prometheus.metrics.enabled Enable of scraping metrics by Prometheus.
## @param prometheus.metrics.basicAuthUsername Username for basic auth. The username and password is required by reposilite to expose metrics. Default: random alpha numeric string. ## @param prometheus.metrics.basicAuthUsername Username for basic auth. The username and password is required by reposilite to expose metrics. Default: random alpha numeric string.
## @param prometheus.metrics.enabled Enable of Password for basic auth. The username and password is required by reposilite to expose metrics. Default random alpha numeric string. ## @param prometheus.metrics.basicAuthPassword Password for basic auth. The username and password is required by reposilite to expose metrics. Default random alpha numeric string.
metrics: metrics:
enabled: false enabled: false
basicAuthUsername: "my-username" basicAuthUsername: ""
basicAuthPassword: "my-password" basicAuthPassword: ""
## @param prometheus.metrics.podMonitor.enabled Enable creation of a podMonitor. Excludes the existence of a serviceMonitor resource. ## @param prometheus.metrics.podMonitor.enabled Enable creation of a podMonitor. Excludes the existence of a serviceMonitor resource.
## @param prometheus.metrics.podMonitor.annotations Additional podMonitor annotations. ## @param prometheus.metrics.podMonitor.annotations Additional podMonitor annotations.
@@ -373,20 +411,27 @@ prometheus:
## @param prometheus.metrics.podMonitor.honorLabels Honor labels. ## @param prometheus.metrics.podMonitor.honorLabels Honor labels.
## @param prometheus.metrics.podMonitor.labels Additional podMonitor labels. ## @param prometheus.metrics.podMonitor.labels Additional podMonitor labels.
## @param prometheus.metrics.podMonitor.interval Interval at which metrics should be scraped. If not specified Prometheus' global scrape interval is used. ## @param prometheus.metrics.podMonitor.interval Interval at which metrics should be scraped. If not specified Prometheus' global scrape interval is used.
## @param prometheus.metrics.podMonitor.path HTTP path for scraping Prometheus metrics. ## @param prometheus.metrics.podMonitor.path HTTP path of the Reposilite pod for scraping Prometheus metrics.
## @param prometheus.metrics.podMonitor.port HTTP port of the Reposilite pod for scraping Prometheus metrics.
## @param prometheus.metrics.podMonitor.relabelings RelabelConfigs to apply to samples before scraping. Prometheus Operator automatically adds relabelings for a few standard Kubernetes fields. ## @param prometheus.metrics.podMonitor.relabelings RelabelConfigs to apply to samples before scraping. Prometheus Operator automatically adds relabelings for a few standard Kubernetes fields.
## @param prometheus.metrics.podMonitor.scrapeTimeout Timeout after which the scrape is ended. If not specified, global Prometheus scrape timeout is used. ## @param prometheus.metrics.podMonitor.scrapeTimeout Timeout after which the scrape is ended. If not specified, global Prometheus scrape timeout is used.
## @param prometheus.metrics.podMonitor.scheme HTTP scheme to use for scraping. For example `http` or `https`.
## @param prometheus.metrics.podMonitor.tlsConfig TLS configuration to use when scraping the metric endpoint by Prometheus.
## @skip prometheus.metrics.podMonitor.tlsConfig Skip individual TLS configuration.
podMonitor: podMonitor:
enabled: false enabled: false
annotations: {} annotations: {}
enableHttp2: true enableHttp2: false
followRedirects: false followRedirects: false
honorLabels: false honorLabels: false
labels: {} labels: {}
interval: "60s" interval: "60s"
path: "/metrics" path: "/metrics"
port: "http"
relabelings: [] relabelings: []
scrapeTimeout: "30s" scrapeTimeout: "30s"
scheme: "http"
tlsConfig: {}
## @param prometheus.metrics.serviceMonitor.enabled Enable creation of a serviceMonitor. Excludes the existence of a podMonitor resource. ## @param prometheus.metrics.serviceMonitor.enabled Enable creation of a serviceMonitor. Excludes the existence of a podMonitor resource.
## @param prometheus.metrics.serviceMonitor.annotations Additional serviceMonitor annotations. ## @param prometheus.metrics.serviceMonitor.annotations Additional serviceMonitor annotations.
@@ -405,14 +450,15 @@ prometheus:
enabled: false enabled: false
annotations: {} annotations: {}
labels: {} labels: {}
enableHttp2: true enableHttp2: false
followRedirects: false followRedirects: false
honorLabels: false honorLabels: false
interval: "60s" interval: "60s"
path: "/metrics" path: "/metrics"
relabelings: [] relabelings: []
scrapeTimeout: "30s" scrapeTimeout: "30s"
scheme: "http"
tlsConfig: {}
## @section Service ## @section Service
## @param service.enabled Enable the service. ## @param service.enabled Enable the service.
@@ -426,6 +472,7 @@ prometheus:
## @param service.loadBalancerIP LoadBalancer will get created with the IP specified in this field. Requires service from type `LoadBalancer`. ## @param service.loadBalancerIP LoadBalancer will get created with the IP specified in this field. Requires service from type `LoadBalancer`.
## @param service.loadBalancerSourceRanges Source range filter for LoadBalancer. Requires service from type `LoadBalancer`. ## @param service.loadBalancerSourceRanges Source range filter for LoadBalancer. Requires service from type `LoadBalancer`.
## @param service.port Port to forward the traffic to. ## @param service.port Port to forward the traffic to.
## @param service.scheme Name of the service port. This name is also used as scheme / port name of the service monitor resource.
## @param service.sessionAffinity Supports `ClientIP` and `None`. Enable client IP based session affinity via `ClientIP`. ## @param service.sessionAffinity Supports `ClientIP` and `None`. Enable client IP based session affinity via `ClientIP`.
## @param service.sessionAffinityConfig Contains the configuration of the session affinity. ## @param service.sessionAffinityConfig Contains the configuration of the session affinity.
## @param service.type Kubernetes service type for the traffic. ## @param service.type Kubernetes service type for the traffic.