搭建私有helm仓库及图形界面

搭建私有helm仓库及图形界面

本篇主要介绍私有 helm 仓库 Chartmuseum 及图形界面 Monocular UI /kubeapps 的搭建

helm chart 能够很好的封装和管理我们的 kubernetes 应用,可以实现中间件、数据库、公共组件等快速发布。
什么场景下我们需要构建一个私有的helm仓库呢

  1. 首先我们日常发布中肯定是经常使用到了helm
  2. 有较多自定义的或者调整过的helm模板,或者有多套k8s/ocp 集群要同时基于 helm 进行发布与管理
  3. 如果想要要更好的管理 charts 历史版本,可以使用下面说的 github page 或者 gitlab page

Helm chart对仓库的要求并不高,需要你对外提供yaml文件和tar文件的web服务即可。helm2 原本是带了本地仓库功能,helm3 移除了这部分,将他变成了一个纯粹的应用管理工具。

像 harbor镜像仓库,JFrog Artifactory(制品仓库,镜像仓库) 都包含了 helm 商店的功能,如果同时对镜像仓库和制品管理有需求,可以选择上面两款产品,都提供免费社区版。

如果不需要上面两者的镜像仓库功能,可以使用在线的github 或 gitlab
https://www.bookstack.cn/read/kubernetes-handbook-201910/practice-create-private-charts-repo.md

也可以是本地私有化部署的 gitlab
https://my.oschina.net/doctorlzr1988/blog/3044964

又或者是helm 开源得工具 chartmuseum
https://github.com/helm/chartmuseum

Chartmuseum 除了给我们提供一个类似于web服务器的功能之外,还提供了其他有用的功能,便于日常我们私有仓库的管理。

  • 根据chart文件自动生成index.yaml(无须使用helm repo index手动生成)
  • helm push的插件,可以在helm命令之上实现将chart文件推送到chartmuseum上
  • 相应的tls配置,Basic认证,JWT认证(Bearer token认证)
  • 提供了Restful的api(可以使用curl命令操作)和可以使用的cli命令行工具
  • 提供了各种后端存储的支持(Amazon s3, Google Cloud Storage, 阿里、百度、腾讯,开源对象存储等)
  • 提供了Prometheus的集成,对外提供自己的监控信息。
  • 没有用户的概念,但是基于目录实现了一定程度上的多租户的需求。

Chartmuseum 搭建

直接使用最简单的 docker run 方式,使用local 本地存储方式,通过 -v 映射到宿主机 /opt/charts
更多支持安装方式见官网

mkdir /opt/charts

docker run -d \
  -p 8080:8080 \
  -e DEBUG=1 \
  -e STORAGE=local \
  -e STORAGE_LOCAL_ROOTDIR=/charts \
  -v /opt/charts:/charts \
  chartmuseum/chartmuseum:latest

# 使用 curl 测试下接口,没有报错就行,当前仓库内容还是空的
# curl localhost:8080/api/charts
{}

准备 helm 及离线 chart,推送到私有库

给我们的私有仓库准备些chart,可以是自己生成的或者从公共仓库获取

先安装 helm3, 添加源

# 添加官方源,网络不好可以试试下面微软的
helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com

# 也可以换成微软的源,速度快,内容和官方同步的 
helm repo add az-stable http://mirror.azure.cn/kubernetes/charts/
helm repo add az-incubator http://mirror.azure.cn/kubernetes/charts-incubator/
### 把 charts 文件直接下载到 chartmuseum 指定的本地目录
cd /opt/charts
helm search repo mysql

# 将charts 文件下载到本地
helm pull az-stable/mysql
helm pull az-stable/tomcat
...

# ls
mysql-1.6.6.tgz  tomcat-0.4.1.tgz
 

测试仓库接口,能正常返回已有的 helm charts 信息,说明 charts 文件放到对应目录下,仓库会自动更新

[root@bastion charts]# curl localhost:8080/api/charts |jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1833  100  1833    0     0   349k      0 --:--:-- --:--:-- --:--:--  358k
{
  "mysql": [
    {
      "name": "mysql",
      "home": "https://www.mysql.com/",
      "sources": [
        "https://github.com/kubernetes/charts",
        "https://github.com/docker-library/mysql"
      ],
      "version": "1.6.6",
      "description": "Fast, reliable, scalable, and easy to use open-source relational database system.",
      "keywords": [
        "mysql",
        "database",
        "sql"

...

也可以使用 helm push 插件上传

# 安装 helm push 插件
helm plugin install https://github.com/chartmuseum/helm-push.git

# 从官网下载一个 consul
helm search repo consul
helm pull az-stable/consul 

# 添加本地仓库到 helm repo,看下仓库内容
helm repo add localrepo http://192.168.2.19:8080
helm search repo localrepo
    NAME                CHART VERSION   APP VERSION DESCRIPTION                                       
    localrepo/mysql     1.6.6           5.7.30      Fast, reliable, scalable, and easy to use open-...
    localrepo/tomcat    0.4.1           7.0         Deploy a basic tomcat application server with s...

# helm push 推送 postgres
helm push consul-7.1.3.tgz localrepo
如果出现报错,权限问题 "Error: 500: open /charts/consul-7.1.3.tgz: permission denied
Error: plugin "push" exited with error" 
直接给本地目录权限最大, 再次push  chmod 777 -R /opt/charts/

# 更新本地 repo,查看仓库内容,可以看到新上传的 postgres
helm repo update 
[root@bastion charts]# helm search repo localrepo

    NAME                    CHART VERSION   APP VERSION DESCRIPTION                                       
    localrepo/consul      7.1.3         1.8.0       Highly available and distributed service discov...
    localrepo/mysql         1.6.6           5.7.30      Fast, reliable, scalable, and easy to use open-...
    localrepo/tomcat        0.4.1           7.0         Deploy a basic tomcat application server with s...

安装 ingress controller

Monocular UI 必须依赖ingress,如果环境里没有,先安装一个

helm search repo ingress
helm install ng-ingress az-stable/nginx-ingress 

安装Monocular UI 界面,管理helm charts

官方站点 https://github.com/helm/monocular

通过 helm 方式来安装

helm repo add monocular https://helm.github.io/monocular
# helm install monocular/monocular

# 下载chart,把mongodb 存储改成持久化
helm pull monocular/monocular
tar -zxvf monocular-1.4.15.tgz 
vim values.yaml 
在 repos 注释自带的stable 和incubator 4行,添加 localrepo, 地址是 http://192.168.2.19:8080
修改 mongodb.persistence.enabled 为 true

# 安装
helm install helmui .

访问通过 ingress controller 的nodeport, 不是直接通过 monocular 的 nodeport,可以看下ingress 的内容就了解了。

[root@bastion ~]# kubectl get svc  |grep ingress
ng-ingress-nginx-ingress-controller        LoadBalancer   172.30.241.122   <pending>                              80:31537/TCP,443:30814/TCP   4h53m
ng-ingress-nginx-ingress-default-backend   ClusterIP      172.30.91.91     <none>                                 80/TCP                       4h53m

通过浏览器访问 k8s节点ip:31537
标记 deprecated: true 的charts,即为弃用的,不会展示在页面

monocular-ui-1.png

monocular-ui-2.png

默认是1小时同步一次repo,可以在helm install 的时候修改 values.yaml,比如这样,5分钟同步一次

    - name: incubator
      url: https://kubernetes-charts-incubator.storage.googleapis.com
      schedule: "*/5 * * * *"

或者部署之后修改 cronjob,修改 schedule: "*/5 * * * *"

[root@bastion ~]# kubectl get cronjob
NAME                                        SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
helmui-monocular-sync-scheduled-localrepo   0 * * * *   False     0        8m57s           3d
[root@bastion ~]# kubectl edit cronjob helmui-monocular-sync-scheduled-localrepo 

另一款界面管理工具 kubeapps

kubeapps 和 monocular 类似,都是bitnami 公司维护的,多了已发布helm 应用的查看,以及可以通过页面添加 repo,功能比上面的多,建议用这个。
使用方法见官网
https://github.com/kubeapps/kubeapps

注意访问的时候是使用 kubeapps 这个svc 的nodeport, 不依赖于ingress

查看通过 helm 发布的应用,支持按照 namespace 区分

kubeapps-applications.png

这块和 monocular 一样

kubeapps-catalog.png

可以通过页面添加仓库


kubeapps-repositories.png

更多k8s 和ocp相关文档见github

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341