Simple Private Docker Registry via Helm (as Helm Chart)

Overview

Overwiew

Updated: 07.12.2022 – etc/hosts step added, all metada-name with release.name refactored, hostPath in values.yaml defined.

Installation

volume.yaml (PV and PVC )

apiVersion: v1
kind: PersistentVolume
metadata:
  name: {{ .Release.Name }}-pv
  labels:
    type: local
spec:
  capacity:
    storage: "{{ .Values.storageSize }}"
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: {{ .Values.hostPath }}
  volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: {{ .Release.Name }}-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: {{ .Values.storageSize }}

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: private-registry-container
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: 5000
          volumeMounts:
            - name: registry-data
              mountPath: /var/lib/registry
      volumes:
        - name: registry-data
          persistentVolumeClaim:
            claimName: {{ .Release.Name }}-pvc

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-service
spec:
  selector:
    app: {{ .Release.Name }}
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000
      name: http

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .Release.Name }}-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
spec:
  rules:
    - host: {{ .Values.hostname }}
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: {{ .Release.Name }}-service
                port:
                  number: 80

values.yaml

hostname: private-registry.local

image:
  repository: registry
  tag: 2

storageSize: 20Gi

hostPath: '/home/user/projects/privateDockerRegistry'

Directory structure (in my case privateDockerRegistry):

├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── ingress.yaml
│   ├── volume.yaml
│   └── service.yaml
└── values.yaml

Installation:

d8devs.com@kubernetes:/home/user/projects/privateDockerRegistry$ helm upgrade --install docker-registry -f values.yaml .

Hostname in etc/hosts

Open your /etc/hosts with text editor in administrator mode, add the ip address and hostname

 d8devs.com@kubernetes:/var/privateDockerRegistry$ sudo vim /etc/hosts
# /etc/hosts
# ...
# ...
127.0.0.1 private-registry.local

Testing

d8devs.com@kubernetes:/var/privateDockerRegistry$  curl -X GET private-registry.local/v2/_catalog
{"repositories":[]} 

Done !

Views: 97