diff --git a/examples/helm/docker-registry-ui/.helmignore b/examples/helm/docker-registry-ui/.helmignore new file mode 100644 index 0000000..50af031 --- /dev/null +++ b/examples/helm/docker-registry-ui/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/examples/helm/docker-registry-ui/Chart.yaml b/examples/helm/docker-registry-ui/Chart.yaml new file mode 100644 index 0000000..6fc5fa6 --- /dev/null +++ b/examples/helm/docker-registry-ui/Chart.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +appVersion: "1.2.1" +description: The simplest and most complete UI for your private registry +name: docker-registry-ui +home: https://github.com/Joxit/docker-registry-ui +keywords: +- docker +- registry +sources: +- https://github.com/Joxit/docker-registry-ui +version: 0.1.0 diff --git a/examples/helm/docker-registry-ui/README.md b/examples/helm/docker-registry-ui/README.md new file mode 100644 index 0000000..a392a31 --- /dev/null +++ b/examples/helm/docker-registry-ui/README.md @@ -0,0 +1,97 @@ +# docker-registry-ui + +[docker-registry-ui](https://joxit.dev/docker-registry-ui/) is the simplest and most complete UI for your private registry! + + +## TL;DR; + +```bash +$ helm install . +``` + +## Introduction + +This chart bootstraps a [docker-registry-ui](https://joxit.dev/docker-registry-ui/) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +It also may deploy the [docker registry](https://docs.docker.com/registry/) if you havent have one already. + +## Prerequisites + +- Kubernetes 1.9+ with Beta APIs enabled +- PV provisioner support in the underlying infrastructure + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```bash +$ helm update --install my-release . +``` + +The command deploys docker-registry-ui on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation. + +> **Tip**: List all releases using `helm list` + +## Uninstalling the Chart + +To uninstall/delete the `my-release` deployment: + +```bash +$ helm delete my-release +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +## Configuration + +The following table lists the configurable parameters of the Redmine chart and their default values. + +| Parameter | Description | Default | +| --------------------------------- | ---------------------------------------- | ------------------------------------------------------- | +| `ui.title` | Title of the managed repository | `Docker registry UI` | +| `ui.delete_images` | Allow to delete image from the front-end | `false` | +| `ui.proxy` | The UI service act as a proxy of the registry | `true` | +| `ui.replicaCount` | Number of replicas to start | `1` | +| `ui.image.registry` | registry to pull the docker-registry-ui image from | `docker.io` | +| `ui.image.repository` | docker-registry-ui image name | `joxit/docker-registry-ui` | +| `ui.image.tag` | docker-registry-ui image tag (change to latest to have multi registry support) | `static` | +| `ui.image.pullPolicy` | docker-registry-ui image pull policy | `Always` | +| `ui.probe.liveness` | Ask kubernetes to check the service port for liveness | `true` | +| `ui.probe.readyness ` | Ask kubernetes to check the service port for readyness | `true` | +| `ui.service.type` | Desired service type | `ClusterIP` | +| `ui.service.port` | Service exposed port | `80` | +| `ui.ingress.enabled` | Create an ingress for docker-regstry-ui | `false` | +| `registry.external` | Use an already available registry | `false` | +| `registry.url` | URL of the existing registry | `http://localhost:5000` | +| `registry.replicaCount` | Number of replicas to start | `1` | +| `registry.image.registry` | registry to pull the docker-registry image from | `docker.io` | +| `registry.image.repository` | docker-registry-ui image name | `registry` | +| `registry.image.tag` | docker-registry-ui image tag | `2.6.2` | +| `registry.image.pullPolicy` | docker-registry-ui image pull policy | `Always` | +| `registry.probe.liveness` | Ask kubernetes to check the service port for liveness | `true` | +| `registry.probe.readyness ` | Ask kubernetes to check the service port for readyness | `true` | +| `registry.persistence.enabled` | Enable persistence using PVC for the registry | `false` | +| `registry.persistence.storageClass` | PVC Storage Class | `-` | +| `registry.persistence.size` | PVC Storage Request size | `1Gi` | +| `registry.service.type` | Desired service type | `ClusterIP` | +| `registry.service.port` | Service exposed port | `5000` | +| `registry.ingress.enabled` | Create an ingress for the regstry | `false` | + + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, + +```bash +$ helm upgrade --install my-release \ + --set registry.external=true \ + --set registry.url=http://registry.example.com:5000 \ + . +``` + +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example, + +```bash +$ helm upgrade --install my-release -f values.yaml . +``` + +> **Tip**: You can use the default [values.yaml](values.yaml) + diff --git a/examples/helm/docker-registry-ui/templates/NOTES.txt b/examples/helm/docker-registry-ui/templates/NOTES.txt new file mode 100644 index 0000000..e69de29 diff --git a/examples/helm/docker-registry-ui/templates/_helpers.tpl b/examples/helm/docker-registry-ui/templates/_helpers.tpl new file mode 100644 index 0000000..ec4a989 --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/_helpers.tpl @@ -0,0 +1,147 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "docker-registry-ui.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 "docker-registry-ui.fullname" -}} +{{- if .Values.ui.fullnameOverride -}} +{{- .Values.ui.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- printf "%s-ui" .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-ui-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- define "docker-registry.fullname" -}} +{{- if .Values.registry.fullnameOverride -}} +{{- .Values.registry.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- printf "%s-registry" .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-registry-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "docker-registry-ui.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "docker-registry-ui.labels" -}} +app: registry-ui +chart: {{ include "docker-registry-ui.chart" . }} +release: {{ .Release.Name }} +{{- if .Chart.AppVersion }} +app/version: {{ .Chart.AppVersion | quote }} +{{- end }} +{{- end -}} + +{{- define "docker-registry-ui.matchLabels" -}} +app: registry-ui +release: {{ .Release.Name }} +{{- end -}} + +{{- define "docker-registry.labels" -}} +app: registry +chart: {{ include "docker-registry-ui.chart" . }} +release: {{ .Release.Name }} +{{- if .Chart.AppVersion }} +app/version: {{ .Chart.AppVersion | quote }} +{{- end }} +{{- end -}} + +{{- define "docker-registry.matchLabels" -}} +app: registry +release: {{ .Release.Name }} +{{- end -}} + +{{- define "docker-registry-ui.probes" -}} +{{- if and .Values.ui.probe.liveness (eq .Values.ui.probe.liveness true) -}} +livenessProbe: + httpGet: + path: / + port: http +{{- end -}} +{{- if and .Values.ui.probe.readiness (eq .Values.ui.probe.readiness true) }} +readinessProbe: + httpGet: + path: / + port: http +{{- end -}} +{{- end -}} + +{{- define "docker-registry.probes" -}} +{{- if and .Values.registry.probe.liveness (eq .Values.registry.probe.liveness true) -}} +livenessProbe: + httpGet: + path: /v2/ + port: registry +{{- end -}} +{{- if and .Values.registry.probe.readiness (eq .Values.registry.probe.readiness true) }} +readinessProbe: + httpGet: + path: /v2/ + port: registry +{{- end -}} +{{- end -}} + +{{- define "docker-registry-ui.url-name" -}} +{{- if eq .Values.ui.proxy true -}} +REGISTRY_URL +{{- else -}} +URL +{{- end -}} +{{- end -}} + +{{- define "docker-registry-ui.url-value" -}} +{{- if eq .Values.registry.external true -}} +{{ .Values.registry.url }} +{{- else -}} +{{- $fullName := include "docker-registry.fullname" . -}} +{{ printf "http://%s.%s:%.0f" $fullName .Release.Namespace .Values.registry.service.port }} +{{- end -}} +{{- end -}} + +{{- define "docker-registry-ui.pull" -}} +{{- if eq .Values.registry.external true -}} +{{ .Values.registry.url }} +{{- else -}} +{{- if eq .Values.ui.proxy true -}} +{{- if eq .Values.ui.ingress.enabled true -}} +{{- $host := index .Values.ui.ingress.hosts 0 -}} +{{ $host.host }} +{{- else -}} +{{- $fullName := include "docker-registry-ui.fullname" . -}} +{{ printf "%s.%s:%.0f" $fullName .Release.Namespace .Values.ui.service.port }} +{{- end -}} +{{- else -}} +{{- if eq .Values.registry.ingress.enabled true -}} +{{- $host := index .Values.registry.ingress.hosts 0 -}} +{{ $host.host }} +{{- else -}} +{{- $fullName := include "docker-registry.fullname" . -}} +{{ printf "%s.%s:%.0f" $fullName .Release.Namespace .Values.registry.service.port }} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/examples/helm/docker-registry-ui/templates/reg-configmap.yaml b/examples/helm/docker-registry-ui/templates/reg-configmap.yaml new file mode 100644 index 0000000..210f15c --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/reg-configmap.yaml @@ -0,0 +1,31 @@ +{{- if eq .Values.registry.external false -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "docker-registry.fullname" . }} + labels: +{{ include "docker-registry.labels" . | indent 4 }} +data: + config.yml: |- + version: 0.1 + log: + fields: + service: registry + storage: + delete: + enabled: true + cache: + blobdescriptor: inmemory + filesystem: + rootdirectory: /var/lib/registry + http: + addr: :5000 + headers: + X-Content-Type-Options: [nosniff] + Access-Control-Allow-Origin: ['*'] + Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE'] + Access-Control-Allow-Headers: ['Authorization'] + Access-Control-Max-Age: [1728000] + Access-Control-Allow-Credentials: [true] + Access-Control-Expose-Headers: ['Docker-Content-Digest'] +{{- end -}} diff --git a/examples/helm/docker-registry-ui/templates/reg-deployment.yaml b/examples/helm/docker-registry-ui/templates/reg-deployment.yaml new file mode 100644 index 0000000..dc157ef --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/reg-deployment.yaml @@ -0,0 +1,62 @@ +{{- if eq .Values.registry.external false -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "docker-registry.fullname" . }} + labels: +{{ include "docker-registry.labels" . | indent 4 }} +spec: + replicas: {{ .Values.registry.replicaCount }} + selector: + matchLabels: +{{ include "docker-registry.matchLabels" . | indent 6 }} + template: + metadata: + labels: +{{ include "docker-registry.matchLabels" . | indent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: config + configMap: + defaultMode: 420 + name: {{ include "docker-registry.fullname" . }} + - name: data +{{- if .Values.registry.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ include "docker-registry.fullname" . }} +{{- else }} + emptyDir: {} +{{- end }} + containers: + - name: registry + image: "{{ .Values.registry.image.registry }}/{{ .Values.registry.image.repository }}:{{ .Values.registry.image.tag }}" + imagePullPolicy: {{ .Values.registry.image.pullPolicy }} + ports: + - name: registry + containerPort: 5000 + protocol: TCP + volumeMounts: + - mountPath: "/var/lib/registry" + name: "data" + - mountPath: "/etc/docker/registry" + name: "config" +{{ include "docker-registry.probes" . | indent 10 }} + resources: + {{- toYaml .Values.registry.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end -}} diff --git a/examples/helm/docker-registry-ui/templates/reg-ingress.yaml b/examples/helm/docker-registry-ui/templates/reg-ingress.yaml new file mode 100644 index 0000000..3b1830d --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/reg-ingress.yaml @@ -0,0 +1,34 @@ +{{- if and (eq .Values.registry.external false) (and (eq .Values.ui.proxy false) .Values.registry.ingress.enabled) -}} +{{- $fullName := include "docker-registry.fullname" . -}} +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: {{ $fullName }} + labels: +{{ include "docker-registry.labels" . | indent 4 }} + {{- with .Values.registry.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: +{{- if .Values.registry.ingress.tls }} + tls: + {{- range .Values.registry.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + {{- range .Values.registry.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + - path: / + backend: + serviceName: {{ $fullName }} + servicePort: registry + {{- end }} +{{- end -}} diff --git a/examples/helm/docker-registry-ui/templates/reg-pvc.yaml b/examples/helm/docker-registry-ui/templates/reg-pvc.yaml new file mode 100644 index 0000000..0b6a38d --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/reg-pvc.yaml @@ -0,0 +1,23 @@ +{{- if and (eq .Values.registry.external false) .Values.registry.persistence.enabled -}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: +{{ include "docker-registry.labels" . | indent 4 }} + name: {{ include "docker-registry.fullname" . }} +spec: + accessModes: +{{- range .Values.registry.persistence.accessModes }} + - {{ . | quote }} +{{- end }} + resources: + requests: + storage: {{ .Values.registry.persistence.size }} +{{- if .Values.registry.persistence.storageClass }} +{{- if (eq "-" .Values.registry.persistence.storageClass) }} + storageClassName: "" +{{- else }} + storageClassName: {{ .Values.registry.persistence.storageClass | quote }} +{{- end }} +{{- end }} +{{- end -}} diff --git a/examples/helm/docker-registry-ui/templates/reg-service.yaml b/examples/helm/docker-registry-ui/templates/reg-service.yaml new file mode 100644 index 0000000..8e68a0c --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/reg-service.yaml @@ -0,0 +1,17 @@ +{{- if eq .Values.registry.external false -}} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "docker-registry.fullname" . }} + labels: +{{ include "docker-registry.labels" . | indent 4 }} +spec: + type: {{ .Values.registry.service.type }} + ports: + - port: {{ .Values.registry.service.port }} + targetPort: registry + protocol: TCP + name: registry + selector: +{{ include "docker-registry.matchLabels" . | indent 6 }} +{{- end -}} diff --git a/examples/helm/docker-registry-ui/templates/ui-deployment.yaml b/examples/helm/docker-registry-ui/templates/ui-deployment.yaml new file mode 100644 index 0000000..a0faac0 --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/ui-deployment.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "docker-registry-ui.fullname" . }} + labels: +{{ include "docker-registry-ui.labels" . | indent 4 }} +spec: + replicas: {{ .Values.ui.replicaCount }} + selector: + matchLabels: +{{ include "docker-registry-ui.matchLabels" . | indent 6 }} + template: + metadata: + labels: +{{ include "docker-registry-ui.matchLabels" . | indent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: registry-ui + image: "{{ .Values.ui.image.registry }}/{{ .Values.ui.image.repository }}:{{ .Values.ui.image.tag }}" + imagePullPolicy: {{ .Values.ui.image.pullPolicy }} + env: + - name: REGISTRY_TITLE + value: {{ .Values.ui.title| quote }} + - name: DELETE_IMAGES + value: {{ .Values.ui.delete_images| quote }} + - name: {{ include "docker-registry-ui.url-name" . }} + value: {{ include "docker-registry-ui.url-value" . | quote }} + - name: PULL_URL + value: {{ include "docker-registry-ui.pull" . | quote }} + ports: + - name: http + containerPort: 80 + protocol: TCP +{{ include "docker-registry-ui.probes" . | indent 10 }} + resources: + {{- toYaml .Values.ui.resources | nindent 12 }} + {{- with .Values.ui.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.ui.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.ui.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/examples/helm/docker-registry-ui/templates/ui-ingress.yaml b/examples/helm/docker-registry-ui/templates/ui-ingress.yaml new file mode 100644 index 0000000..a17b648 --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/ui-ingress.yaml @@ -0,0 +1,34 @@ +{{- if .Values.ui.ingress.enabled -}} +{{- $fullName := include "docker-registry-ui.fullname" . -}} +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: {{ $fullName }} + labels: +{{ include "docker-registry-ui.labels" . | indent 4 }} + {{- with .Values.ui.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: +{{- if .Values.ui.ingress.tls }} + tls: + {{- range .Values.ui.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + {{- range .Values.ui.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + - path: / + backend: + serviceName: {{ $fullName }} + servicePort: http + {{- end }} +{{- end }} diff --git a/examples/helm/docker-registry-ui/templates/ui-service.yaml b/examples/helm/docker-registry-ui/templates/ui-service.yaml new file mode 100644 index 0000000..2aeda25 --- /dev/null +++ b/examples/helm/docker-registry-ui/templates/ui-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "docker-registry-ui.fullname" . }} + labels: +{{ include "docker-registry-ui.labels" . | indent 4 }} +spec: + type: {{ .Values.ui.service.type }} + ports: + - port: {{ .Values.ui.service.port }} + targetPort: http + protocol: TCP + name: http + selector: +{{ include "docker-registry-ui.matchLabels" . | indent 6 }} diff --git a/examples/helm/docker-registry-ui/values.yaml b/examples/helm/docker-registry-ui/values.yaml new file mode 100644 index 0000000..f2b7505 --- /dev/null +++ b/examples/helm/docker-registry-ui/values.yaml @@ -0,0 +1,129 @@ +# Default values for docker-registry-ui. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + + +ui: + # title of the registry + title: "Docker registry UI" + # allow delete of images + delete_images: false + # UI behave as a proxy of the registry + proxy: true + + replicaCount: 1 + image: + registry: docker.io + repository: joxit/docker-registry-ui + tag: static + pullPolicy: Always + probe: + liveness: true + readiness: true + + resources: {} + # If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + nodeSelector: {} + tolerations: [] + affinity: {} + fullnameOverride: "" + + service: + type: ClusterIP + port: 80 + + ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: docker-registry-ui.local + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + + +registry: + external: false + # URL of the registry (requiered. Note: this wont work as localhost is inside the container. Only used if the registry is external) + url: http://localhost:5000 + + replicaCount: 1 + # Image definition for the registry (Only used if the registry is not external) + image: + registry: docker.io + repository: registry + tag: 2.6.2 + pullPolicy: Always + probe: + liveness: true + readiness: true + resources: {} + # If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + nodeSelector: {} + tolerations: [] + affinity: {} + fullnameOverride: "" + + + persistence: + ## If true, use a Persistent Volume Claim, If false, use emptyDir + ## + enabled: false + ## Persistent Volume Storage Class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + # storageClass: "-" + ## Persistent Volume Claim annotations + ## + annotations: + ## Persistent Volume Access Mode + ## + accessModes: + # This have to be ReadWriteMany if replicaCount>1 + - ReadWriteOnce + ## Persistent Volume size + ## + size: 1Gi + ## + + service: + type: ClusterIP + port: 5000 + + ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: docker-registry.local + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +imagePullSecrets: [] +nameOverride: "" diff --git a/examples/kubernetes/README.md b/examples/kubernetes/README.md new file mode 100644 index 0000000..c35671d --- /dev/null +++ b/examples/kubernetes/README.md @@ -0,0 +1,19 @@ +# Kubernetes installation of Docker Registry UI + +## Full installation +Install a registry and docker-registry-ui as frontend of this registry to kubernetes. + +```sh +kubectl apply -f *.yaml +``` + +Please note that you'll need a PV provisionner to be able to store the uploaded images. + +## Dynamic installation +Edit the image tag in the ui-deployement.yaml file and set it to `latest`, then : + +```sh +kubectl apply -f ui*.yaml +``` + +You'll get a docker-registry-ui pod installed inside kubernetes and you'll be able to configure it to act as a frontend to your existing registry(ies). diff --git a/examples/kubernetes/registry-configmap.yaml b/examples/kubernetes/registry-configmap.yaml new file mode 100644 index 0000000..44ae91d --- /dev/null +++ b/examples/kubernetes/registry-configmap.yaml @@ -0,0 +1,31 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: docker-registry + labels: + app: registry + release: docker-registry-ui + app/version: "1.2.1" +data: + config.yml: |- + version: 0.1 + log: + fields: + service: registry + storage: + delete: + enabled: true + cache: + blobdescriptor: inmemory + filesystem: + rootdirectory: /var/lib/registry + http: + addr: :5000 + headers: + X-Content-Type-Options: [nosniff] + Access-Control-Allow-Origin: ['*'] + Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE'] + Access-Control-Allow-Headers: ['Authorization'] + Access-Control-Max-Age: [1728000] + Access-Control-Allow-Credentials: [true] + Access-Control-Expose-Headers: ['Docker-Content-Digest'] diff --git a/examples/kubernetes/registry-deployment.yaml b/examples/kubernetes/registry-deployment.yaml new file mode 100644 index 0000000..929e826 --- /dev/null +++ b/examples/kubernetes/registry-deployment.yaml @@ -0,0 +1,51 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: docker-registry + labels: + app: registry + release: docker-registry-ui + app/version: "1.2.1" +spec: + replicas: 1 + selector: + matchLabels: + app: registry + release: docker-registry-ui + template: + metadata: + labels: + app: registry + release: docker-registry-ui + spec: + volumes: + - name: config + configMap: + defaultMode: 420 + name: docker-registry + - name: data + persistentVolumeClaim: + claimName: docker-registry + containers: + - name: registry + image: "docker.io/registry:2.6.2" + imagePullPolicy: Always + ports: + - name: registry + containerPort: 5000 + protocol: TCP + volumeMounts: + - mountPath: "/var/lib/registry" + name: "data" + - mountPath: "/etc/docker/registry" + name: "config" + livenessProbe: + httpGet: + path: /v2/ + port: registry + readinessProbe: + httpGet: + path: /v2/ + port: registry + resources: + {} diff --git a/examples/kubernetes/registry-pvc.yaml b/examples/kubernetes/registry-pvc.yaml new file mode 100644 index 0000000..a1b7ded --- /dev/null +++ b/examples/kubernetes/registry-pvc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + app: registry + release: docker-registry-ui + app/version: "1.2.1" + name: docker-registry +spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: 1Gi diff --git a/examples/kubernetes/registry-service.yaml b/examples/kubernetes/registry-service.yaml new file mode 100644 index 0000000..1470f71 --- /dev/null +++ b/examples/kubernetes/registry-service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: docker-registry + labels: + app: registry + release: docker-registry-ui + app/version: "1.2.1" +spec: + type: ClusterIP + ports: + - port: 5000 + targetPort: registry + protocol: TCP + name: registry + selector: + app: registry + release: docker-registry-ui diff --git a/examples/kubernetes/ui-deployment.yaml b/examples/kubernetes/ui-deployment.yaml new file mode 100644 index 0000000..e5a5215 --- /dev/null +++ b/examples/kubernetes/ui-deployment.yaml @@ -0,0 +1,48 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: docker-registry-ui + labels: + app: registry-ui + release: docker-registry-ui + app/version: "1.2.1" +spec: + replicas: 1 + selector: + matchLabels: + app: registry-ui + release: docker-registry-ui + template: + metadata: + labels: + app: registry-ui + release: docker-registry-ui + spec: + containers: + - name: registry-ui + image: "docker.io/joxit/docker-registry-ui:static" + imagePullPolicy: Always + env: + - name: REGISTRY_TITLE + value: "Docker registry UI" + - name: DELETE_IMAGES + value: "false" + - name: REGISTRY_URL + value: "http://docker-registry.default:5000" + - name: PULL_URL + value: "docker-registry-ui.default:80" + ports: + - name: http + containerPort: 80 + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: + {} + diff --git a/examples/kubernetes/ui-service.yaml b/examples/kubernetes/ui-service.yaml new file mode 100644 index 0000000..63e19c4 --- /dev/null +++ b/examples/kubernetes/ui-service.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + name: docker-registry-ui + labels: + app: registry-ui + release: docker-registry-ui + app/version: "1.2.1" +spec: + type: LoadBalancer + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: registry-ui + release: docker-registry-ui +