ChartMuseum is an opensource Helm Chart Repository written in Go Language with support for cloud storage backends, including Google Cloud Storage, Amazon S3, Microsoft Azure Blob Storage, Alibaba Cloud OSS Storage, Openstack Object Storage, Oracle Cloud Infrastructure Object Storage, Baidu Cloud BOS Storage, Tencent Cloud Object Storage, DigitalOcean Spaces, Minio, and etcd.
Prerequisites
- Helm v3.0.0+
- A persistent storage resource and RW access to it
- Kubernetes StorageClass for dynamic provisioning
Verify Helm Version
root@master:~# helm version
version.BuildInfo{Version:"v3.13.1", GitCommit:"3547a4b5bf5edb5478ce352e18858d8a552a4110", GitTreeState:"clean", GoVersion:"go1.20.8"}
Verify the Default Storage
root@master:~# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage (default) arobyte.tech/nfs Delete Immediate false 118m
Using Local Storage to configure Chartmuseum
root@master:~# cat values.yaml
env:
open:
STORAGE: local
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 8Gi
storageClass: "managed-nfs-storage"
Installation
- Add repository
root@master:~# helm repo add chartmuseum https://chartmuseum.github.io/charts
- Install chart (Helm v3)
root@master:~# kubectl create ns chartmuseum
root@master:~# helm install -f values.yaml chartmuseum chartmuseum/chartmuseum --set env.open.DISABLE_API=false -n chartmuseum
Edit the svc to convert the type to LoadBalancer
root@master:~# kubectl edit svc chartmuseum -n chartmuseum
app.kubernetes.io/instance: chartmuseum
app.kubernetes.io/name: chartmuseum
sessionAffinity: None
type: ClusterIP ---> LoadBalancer
Verify The Chartmuseum is installed successfully
root@master:~# kubectl get pods,svc -n chartmuseum
NAME READY STATUS RESTARTS AGE
pod/chartmuseum-6f5dcc8787-7r9lm 1/1 Running 0 54m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/chartmuseum LoadBalancer 10.109.118.6 172.16.16.151 8080:32563/TCP 54m
I am using HA Proxy for getting traffic routed to my cluster
root@master:~# cat /etc/haproxy/haproxy.cfg
frontend chartmuseum
bind 192.168.0.114:6201
mode tcp
default_backend chartmuseum
backend chartmuseum
mode tcp
balance roundrobin
server backend_server 172.16.16.151:8080 check
root@master:~# systemctl restart haproxy
Login to Browser and verify the URL
Install the helm-cm plugin to push charts to chartmuseum.
root@master:~# helm create mychart
root@master:~# cd mychart/
root@master:~/mychart# helm package .
Successfully packaged chart and saved it to: /root/mychart/mychart-0.1.0.tgz
root@master:~/mychart# helm cm-push mychart-0.1.0.tgz http://chartmuseum.arobyte.tech:6201
"chartmuseum-1" has been added to your repositories
Now Access the Browser the verify the Chart
Add the repo locally and search for it
root@master:~# helm repo add chartmuseum-local http://chartmuseum.arobyte.tech:6201
"chartmuseum-local" has been added to your repositories
root@master:~# helm search repo chartmuseum-local
NAME CHART VERSION APP VERSION DESCRIPTION
chartmuseum-local/mychart 0.1.0 1.16.0 A Helm chart for Kubernetes
root@master:~# helm pull chartmuseum-local/mychart
root@master:~# ls -l | grep mychart
-rw-r--r-- 1 root root 3957 Feb 29 11:59 mychart-0.1.0.tgz
We can see that we are able to push and pull the charts to and from our local charts.