Deploy Helm private charts repository on the Kubernetes
Helm是一个管理Kubernetes上charts的工具,通过Helm你可以比较方便的部署、卸载组件等操作。
在大多数时候,我们都可以直接使用官方的charts仓库来安装我们想要的组件,但是我们有时候会在内网的情况下使用Helm,这个时候我们可能需要一个自己私有的charts仓库。该文档将介绍如何搭建一个私有的charts仓库。
我们使用minio
作为charts仓库的后端存储,结合chartmuseum
来提供charts仓库的服务,以方便我们操作charts仓库。
术语
- minio: minio是一个类似Amazon S3的分布式存储服务,该服务提供API、SDK、Client来让我们操作。
- chartmuseum: chartmuseum是一个Web服务,该服务提供API来让我们比较轻松的操作charts仓库,而且该服务还可以满足多租户场景。
组件
部署完成后,全部的组件。
$ kubectl get pod -n kube-system -l "name=tiller"
NAME READY STATUS RESTARTS AGE
tiller-deploy-<xxx> 1/1 Running 0 5h
$ kubectl get pod -n kube-system -l "app=chartmuseum"
NAME READY STATUS RESTARTS AGE
<release-name>-chartmuseum-<xxx> 1/1 Running 0 47m
$ kubectl get pod -n storage
NAME READY STATUS RESTARTS AGE
minio-client-deployment-<xxx> 1/1 Running 0 7h
minio-deployment-<xxx> 1/1 Running 0 9h
部署
部署私有charts仓库,初始化helm init
,部署tiller
服务,部署好minio
服务,部署chartmuseum
,通过helm install
安装上述两个组件,启动服务。等待服务启动成功,使用helm
添加新的charts仓库即可使用。
初始化helm
对于charts仓库的初始化,需要使用到helm
命令行工具,因此需要先安装该工具到本机。
关于helm
工具的安装,这里不进行描述,可以参考官方文档Installing the Helm Client。
使用helm --help
来确认该工具是否安装成功。
初始化helm,会安装Tiller,该组件是helm
的服务端组件,安装方式比较简单。
具体的安装可以参考Securing Helm installation。
因为我们在内网环境中,无法连接https://kubernetes-charts.storage.googleapis.com
, 因此在初始化的时候,需要跳过更新本地仓库缓存的步骤,即:
helm init --service-account tiller --skip-refresh
初始化helm成功后,可以通过helm repo list
看到我们有两个仓库,分别是stable
和local
。
$ helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts
到这里,我们就完成了helm的初始化。
部署minio服务
当前我们部署单节点minio服务,使用本地存储。关于minio分布式部署方式详见官方文档。
关于单节点minio服务的部署,可以根据deploy minio on the Kubernetes来操作。
这里我们使用Use helm install minio来部署单节点minio。
查看minio服务是否正常启动。
$ kubectl get pod -n storage
NAME READY STATUS RESTARTS AGE
minio-client-deployment-<xxx> 1/1 Running 0 7h
minio-deployment-<xxx> 1/1 Running 0 9h
等待minio服务启动成功后,通过浏览器访问http://<节点IP>:30002
,如果访问成功说明服务正常。同时我们也可以通过操作mc
(minio的cli工具)来查看服务是否正常。
创建charts仓库
想要创建charts仓库,需要在minio上创建bucket,我们这里使用一个chartmuseum
管理多个charts仓库的方式,因此需要创建多个bucket。
首先创建父级bucket,这里取名叫charts
。
kubectl exec -it -n storage minio-client-deployment-<xxx> mc -- mb kminio/charts
创建完成bucket,通过mc ls
命令查看创建好的bucket是否存在。
$ kubectl exec -it -n storage minio-client-deployment-<xxx> mc -- ls kminio
[2019-01-08 06:35:45 UTC] 0B charts/
因为采用多仓库的形式,因此需要在上面bucket中,再创建子bucket,取名叫kubernetes
。使用下面命令进行子bucket的创建:
kubectl exec -it -n storage minio-client-deployment-<xxx> mc -- mb kminio/charts/kubernetes/
设置bucket的权限
kubectl exec -it -n storage minio-client-deployment-<xxx> mc -- policy download kminio/charts/kubernetes
设置成功后,通过以下命令查看该bucket是否修改成功:
$ kubectl exec -it -n storage minio-client-deployment-<xxx> mc -- policy list kminio/charts/kubernetes
charts/kubernetes* => readonly
安装chartmuseum
我们使用chartmuseum
来管理多个charts仓库,使用该服务,不需要客户端直接连接minio,只需要通过API即可管理和操作charts仓库。
添加chartmuseum
首先需要下载官方的chart包到本地。
$ git clone https://github.com/helm/charts
拷贝charts/stable/chartmuseum
到安装好helm
的主机上。
安装chartmuseum
我们需要修改chartmuseum的一些启动和安装参数,具体的参数修改,可以参考下面:
image:
repository: chartmuseum/chartmuseum
replicaCount: 1
resources:
limits:
memory: 200Mi
env:
open:
STORAGE: amazon
STORAGE_AMAZON_BUCKET: "charts"
STORAGE_AMAZON_ENDPOINT: "http://<minio-service>.storage.svc:9000"
DEPTH: 1
DEBUG: true
DISABLE_API: false
secret:
AWS_ACCESS_KEY_ID: "..."
AWS_SECRET_ACCESS_KEY: "..."
参数 | 说明 |
---|---|
image.repository |
如果我们有自己的chartmuseum可以修改为自己的镜像 |
env.open.STORAGE |
因为我们使用minio作为后端存储服务,因此该值需要配置为amazon |
env.open.STORAGE_AMAZON_BUCKET |
我们采用chartmuseum管理多个仓库,该值填写为最上层bucket即可 |
env.open.STORAGE_AMAZON_ENDPOINT |
如果使用上面所说的方式部署minio,因为chartmuseum和minio不在同一个namespace中,因此需要填写为minio服务地址 |
env.open.DEPTH |
我们采用chartmuseum管理多个仓库,该值为index.yaml 所在bucket和STORAGE_AMAZON_BUCKET 的层级深度,该文档中为1 |
env.secret.AWS_ACCESS_KEY_ID |
minio服务的access key |
env.secret.AWS_SECRET_ACCESS_KEY |
minio服务的secret key |
如果想要自定义更多配置项,可以查看官方的说明ChartMuseum Helm Chart。
创建custom.yaml
来配置自定义的参数,执行以下命令安装chartsumeum
:
helm install -f custom.yaml ./chartmuseum --namespace kube-system
$ kubectl get pod -n kube-system -l "app=chartmuseum"
NAME READY STATUS RESTARTS AGE
<release-name>-chartmuseum-<xxx> 1/1 Running 0 47m
添加chartmuseum到本地repo
helm repo add chartk8s http://<CHARTMUSEUM-CLUSTER-IP>:8080/kubernetes
我们采用的是chartmuseum管理多个charts仓库的方式,因此这里添加的repo的url并不是minio的子bucket,而是去掉父级bucket后的地址。
通过helm repo
可以看到该repo。
$ helm repo list
NAME URL
local http://127.0.0.1:8879/charts
chartk8s http://<CHARTMUSEUM-CLUSTER-IP>:8080/kubernetes
到这里,整个charts私仓部署就完成了,如果我们需要提供给集群外面使用,可以开放chartmuseum的NodePort
。后续会更新如何开放对外服务。
如何使用chartmuseum
我们可以使用API来操作chart仓库,具体的用法可以参考官方文档。
$ git clone https://github.com/chartmuseum/helm-push
拷贝helm-push
到helm
的主机,如果helm-push_${version}_linux_amd64.tar.gz
包在自定义的文件服务器上,我们可以修改helm-push/scripts/install_plugin.sh
中Linux平台的url
包路径。
$ helm plugin install ./helm-push
Downloading and installing helm-push v0.7.1 ...
https://github.com/chartmuseum/helm-push/releases/download/v0.7.1/helm-push_0.7.1_darwin_amd64.tar.gz
Installed plugin: push
安装完成后,使用helm --help
可以看到多了helm push
的命令,通过该命令可以推送chart到chartmuseum管理的repo上。
$ helm push minio-2.3.1.tgz chartk8s
Pushing minio-2.3.1.tgz to chartk8s...
Done.
上传成功后,使用helm repo update
更新,可以看到上传的minio的chart。