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看到我们有两个仓库,分别是stablelocal

$  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-pushhelm的主机,如果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。