有两种方法

一是按照正常流程直接用yaml文件的形式发布应用到k8s集群上

二是把生成好的yaml文件发布到kubeapps应用商店,在应用商店中操作发布应用到k8s集群中

这里采用第二种方式的变种方式:使用Helm chart 的方式把应用直接部署到k8s集群中

参考文章:https://www.hi-linux.com/posts/21466.html

  • 构建一个 Helm Chart
# 创建一个名为 mychart 的 Chart
helm create mychart 目录结构:
mychart/
├── charts
├── Chart.yaml # 描述这个 Chart的相关信息,包括名字、描述信息以及版本等
├── templates # YAML 文件的模板
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt # 介绍 Chart 部署后的一些信息,例如:如何使用这个 Chart、列出缺省的设置等。
│ └── service.yaml
└── values.yaml # 存储 templates 目录中模板文件中用到变量的值 Templates 目录下 YAML 文件模板的值默认都是在 values.yaml 里定义的,比如在 deployment.yaml 中定义的容器镜像。
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" 其中的 .Values.image.repository 的值就是在 values.yaml 里定义的 nginx,.Values.image.tag 的值就是 stable。
$ cat mychart/values.yaml|grep repository
repository: nginx $ cat mychart/values.yaml|grep tag
tag: stable 以上两个变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。 # 编写应用的介绍信息
$ cat mychart/Chart.yaml
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: mychart
version: 0.1.0 # 编写应用具体部署信息
编辑 values.yaml,它默认会在 Kubernetes 部署一个 busybox。下面是 mychart 应用的 values.yaml 文件的内容:
# 这里采用的是harbor仓库中的镜像
image:
repository: www.harbor.mobi/myrepo/busybox
tag: 0.1
pullPolicy: IfNotPresent # 检查依赖和模板配置是否正确,如果文件格式错误,可以根据提示进行修改
$ helm lint mychart/
==> Linting .
[INFO] Chart.yaml: icon is recommended 1 chart(s) linted, no failures # 将应用打包,mychart 目录会被打包为一个 mychart-0.1.0.tgz 格式的压缩包,该压缩包会被放到当前目录下,并同时被保存到了 Helm 的本地缺省仓库目录中。如果你想看到更详细的输出,可以加上 --debug 参数来查看打包的输出
helm package mychart
Successfully packaged chart and saved it to: /tmp/mychart-0.1.0.tgz # 将应用发布到 Repository,这一步稍微有些变化 ######## 正常流程 #################
# 虽然我们已经打包了 Chart 并发布到了 Helm 的本地目录中,但通过 helm search 命令查找,并不能找不到刚才生成的 mychart包。 helm search mychart
No results found # 这是因为 Repository 目录中的 Chart 包还没有被 Helm 管理。通过 helm repo list 命令可以看到目前 Helm 中已配置的 Repository 的信息。 helm repo list
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts # 注:新版本中执行 helm init 命令后默认会配置一个名为 local 的本地仓库。 # 我们可以在本地启动一个 Repository Server,并将其加入到 Helm Repo 列表中。Helm Repository 必须以 Web 服务的方式提供,这里我们就使用 helm serve 命令启动一个 Repository Server,该 Server 缺省使用 $HOME/.helm/repository/local 目录作为 Chart 存储,并在 8879 端口上提供服务。 helm serve &
Now serving you on 127.0.0.1:8879 # 默认情况下该服务只监听 127.0.0.1,如果你要绑定到其它网络接口,可使用以下命令: helm serve --address 192.168.100.211:8879 & # 如果你想使用指定目录来做为 Helm Repository 的存储目录,可以加上 --repo-path 参数 helm serve --address 192.168.100.211:8879 --repo-path /data/helm/repository/ --url http://192.168.100.211:8879/charts/ # 通过 helm repo index 命令将 Chart 的 Metadata 记录更新在 index.yaml 文件中 # 更新 Helm Repository 的索引文件
$ cd /home/k8s/.helm/repository/local
$ helm repo index --url=http://192.168.100.211:8879 . # 完成启动本地 Helm Repository Server 后,就可以将本地 Repository 加入 Helm 的 Repo 列表。 helm repo add local http://127.0.0.1:8879
"local" has been added to your repositories # 现在再次查找 mychart 包,就可以搜索到了。 $ helm repo update
$ helm search mychart
NAME CHART VERSION APP VERSION DESCRIPTION
local/mychart 0.1.0 1.0 A Helm chart for Kubernetes ############ 变种操作 ################
# 因为采用的是其他部署方式,默认已经有local仓库了,同时也能够搜索出来 helm search mychart
NAME CHART VERSION APP VERSION DESCRIPTION
local/mychart 0.1.0 1.0 A Helm chart for Kubernetes # 唯一的问题是,无法从该仓库中获取这个应用,报错信息如下
helm install --dry-run --debug local/mychart --name mike-test
[debug] Created tunnel using local port: '45398' [debug] SERVER: "127.0.0.1:45398" [debug] Original chart version: ""
Error: Get http://127.0.0.1:8879/charts/mychart-0.1.0.tgz: dial tcp 127.0.0.1:8879: connect: connection refused # 解决办法
# local仓库已经添加了,也能找到这个应用,唯一需要做的步骤就是后台启动这个仓库
helm serve &
[1] 96756
[root@ks-allinone tmp]# Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879 # 此时就能正常操作了
  • 在 Kubernetes 中部署应用
# Chart 被发布到仓储后,就可以通过 helm install 命令部署该 Chart。
# 当使用 helm install 命令部署应用时,实际上就是将 templates 目录下的模板文件渲染成 Kubernetes 能够识别的 YAML 格式。
# 在部署前我们可以使用 helm install --dry-run --debug <chart_dir> --name <release_name>命令来验证 Chart 的配置。该输出中包含了模板的变量配置与最终渲染的 YAML 文件。
# 注:local/mychart表示从local仓库获取mychart应用,--name 表示的是部署后的应用名称
helm install --dry-run --debug local/mychart --name mike-test # 验证完成没有问题后,我们就可以使用以下命令将其部署到 Kubernetes 上了。
# 部署时需指定 Chart 名及 Release(部署的实例)名。
# 注:helm install 默认会用到 socat,需要在所有节点上安装 socat 软件包。 helm install local/mychart --name mike-test NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=mike-test" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
# 最后显示的这个是说明如何操作才能访问这个应用的
# 在这里不采用这种方式,而是在KubeSphere中管理这个应用 # 使用下面的命令列出的所有已部署的 Release 以及其对应的 Chart。 helm list # 还可以使用 helm status 查询一个特定的 Release 的状态。 helm status mike-test # 升级和回退一个应用
# 从上面 helm list 输出的结果中我们可以看到有一个 Revision(更改历史)字段,该字段用于表示某一个 Release 被更新的次数,我们可以用该特性对已部署的 Release 进行回滚。
# 将版本号从 0.1.0 修改为 0.2.0, 然后使用 helm package 命令打包并发布到本地仓库。 cat mychart/Chart.yaml apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: mychart
version: 0.2.0 helm package mychart
Successfully packaged chart and saved it to: /tmp/mychart-0.2.0.tgz # 查询本地仓库中的 Chart 信息,可以看到在本地仓库中 mychart 有两个版本。
helm search mychart -l
NAME CHART VERSION APP VERSION DESCRIPTION
local/mychart 0.2.0 1.0 A Helm chart for Kubernetes
local/mychart 0.1.0 1.0 A Helm chart for Kubernetes # 现在用 helm upgrade 命令将已部署的 mike-test 升级到新版本。你可以通过 --version 参数指定需要升级的版本号,如果没有指定版本号,则缺省使用最新版本。 helm upgrade mike-test local/mychart
Release "mike-test" has been upgraded.
LAST DEPLOYED: Wed Nov 20 02:27:05 2019
NAMESPACE: test
STATUS: DEPLOYED RESOURCES:
==> v1/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
mike-test-mychart 0/1 1 0 104m ==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
mike-test-mychart-69b44c75bf-7rxqt 0/1 Completed 25 104m ==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mike-test-mychart ClusterIP 10.233.41.226 <none> 80/TCP 104m NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace test -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=mike-test" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80 helm list | grep mychart mike-test 2 Wed Nov 20 02:27:05 2019 DEPLOYED mychart-0.2.0 1.0 test # 如果更新后的程序由于某些原因运行有问题,需要回退到旧版本的应用。
# 首先我们可以使用 helm history 命令查看一个 Release 的所有变更记录。
helm history mike-test
REVISION UPDATED STATUS CHART DESCRIPTION
1 Wed Nov 20 00:42:38 2019 SUPERSEDED mychart-0.1.0 Install complete
2 Wed Nov 20 02:27:05 2019 DEPLOYED mychart-0.2.0 Upgrade complete # 其次,我们可以使用下面的命令对指定的应用进行回退。
helm rollback mike-test 1
Rollback was a success. # 注:其中的参数 1 是 helm history 查看到 Release 的历史记录中 REVISION 对应的值。 # 最后,我们使用 helm list 和 helm history 命令都可以看到 mychart 的版本已经回退到 0.1.0 版本。 helm history mike-test
REVISION UPDATED STATUS CHART DESCRIPTION
1 Wed Nov 20 00:42:38 2019 SUPERSEDED mychart-0.1.0 Install complete
2 Wed Nov 20 02:27:05 2019 SUPERSEDED mychart-0.2.0 Upgrade complete
3 Wed Nov 20 02:34:42 2019 DEPLOYED mychart-0.1.0 Rollback to 1
# 删除一个应用
# 如果需要删除一个已部署的 Release,可以利用 helm delete 命令来完成删除。
helm delete mike-test
release "mike-test" deleted # 确认应用是否删除,该应用已被标记为 DELETED 状态。
helm ls -a mike-test
NAME REVISION UPDATED STATUS CHART NAMESPACE
mike-test 3 Mon Jul 23 10:53:42 2018 DELETED mychart-0.1.0 default # 也可以使用 --deleted 参数来列出已经删除的 Release
helm ls --deleted
NAME REVISION UPDATED STATUS CHART NAMESPACE
mike-test 3 Mon Jul 23 10:53:42 2018 DELETED mychart-0.1.0 default # 默认情况下已经删除的 Release 只是将状态标识为 DELETED 了 ,但该 Release 的历史信息还是继续被保存的。 # 如果要移除指定 Release 所有相关的 Kubernetes 资源和 Release 的历史记录,可以用如下命令
helm delete --purge mike-test
release "mike-test" deleted # 再次查看已删除的 Release,已经无法找到相关信息
$ helm hist mike-test
Error: release: "mike-test" not found # helm ls 命令也已均无查询记录。
$ helm ls --deleted
$ helm ls -a mike-test
  • 总结

    以上这些都是使用helm命令进行操作管理的,但是我们这想要的效果是通过Kubeapps应用商店进行管理。

    在创建chart目录并做相应的修改后,不是直接把应用打包成tgz文件,然后直接安装到k8s集群中,而是直接把chart目录给推送到Harbor仓库的Helm Charts中。

    若harbor是http访问的,如下这些操作没什么问题:
  1. helm添加harbor 的repo应用仓库
  2. 推送helm chart到harbor的Helm Charts,并查看
  3. 在Kubeapps中查看的到Harbor里的Helm Charts。

有问题的是,使用docker login 命令登陆harbor仓库时报错,这个也有办法解决,但是docker并不是单独安装的,而是基于KubeSphere安装的,解决这个问题极容易导致Harbor所使用的相关容器无法使用等

若harbor是https访问的,

  1. helm添加harbor 的repo应用仓库 (需要加上自签名证书),这一步没问题
  2. 推送helm chart到harbor的Helm Charts,(需要加上自签名证书和账号信息等),这一步也没问题。但是在Harbor中查看Helm Charts的话会报错:HELM_CHART.NO_DETAIL

    还有一个问题时无法在Kubeapps中查看Harbor里的Helm Charts。报错信息如下:{"code":404,"message":"could not find chart"}

如上这俩问题还需要进一步解决

helm chart应用使用示例的更多相关文章

  1. 【K8S】helm chart多环境部署最佳实践-示例

    Chart.yaml apiVersion: v1 appVersion: "1.0" description: A Helm chart for Kubernetes name: ...

  2. 从入门到实践:创作一个自己的 Helm Chart

    前言 我们平时在日常生活中会经常在不同的平台上与各种各样的应用打交道,比如从苹果的 App Store 里下载的淘宝.高德.支付宝等应用,或者是在 PC 端安装的 Word.Photoshop.Ste ...

  3. 使用 Helm Chart 部署及卸载 istio

    部署 istio 1.添加 istio 官方的 helm 仓库 helm repo add istio https://storage.googleapis.com/istio-release/rel ...

  4. 构建helm chart应用

    使用helm命令创建基础目录 helm create t2cp [root@node04 ~]# tree t2cp t2cp ├── charts ├── Chart.yaml ├── templa ...

  5. [转帖]从入门到实践:创作一个自己的 Helm Chart

    从入门到实践:创作一个自己的 Helm Chart https://www.cnblogs.com/alisystemsoftware/p/11436469.html 自己已经搭建好了 helm 和t ...

  6. Helm chart仓库官方仓库不能使用解决方法

    Helm chart仓库官方仓库不能使用解决方法 k8s中的官方helm chart仓库在国内可能使用不了,但是我们又需要使用,这里推荐几个方法. 使用其他的chart仓库 微软的chart仓库 ht ...

  7. 云原生交付加速!容器镜像服务企业版支持 Helm Chart

    2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...

  8. Helm Chart 一键部署 Jenkins

    Jenkins Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件.目前提供超过1000个插件来支持构建.部署.自动化, 满足任何项目的需要. Jenki ...

  9. 如何选出适合自己的管理Helm Chart的最佳方式?

    本文转载自Rancher Labs 无论你喜欢与否,你都不得不承认Helm是管理Kubernetes应用程序独一无二的工具,你甚至可以通过不同的方式使用它. 在Helm的使用过程中,我们注意到有几个问 ...

随机推荐

  1. 计蒜客——Goldbach

    Goldbach 判断大素数 #include<cstdio> #include<cstdlib> using namespace std; #define N 10000 t ...

  2. 平安银行Java面试-社招-五面(2019/09)

    个人情况 2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验.做过分布式开发,没有高并发的处理经验,平时做To G的项目居多.写下面经是希望 ...

  3. Alpha冲刺(5/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 准备"Alpha事后诸葛亮" 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们 ...

  4. 设置应用程序的样式并对其进行部署——《Python编程从入门到实践》

    我们将使用应用程序django-bootstrap3为Web应用程序设计样式.我们将把项目"学习笔记"部署到Heroku,这个网站能让我们们将项目推送到其服务器,让任何有网络连接的 ...

  5. 第09组 Alpha冲刺(3/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  6. max函数比较字符串类型

    关于sql中 max函数比较字符串类型 max只比较首个字符的大小 只要首字母大,则不比较其他位置的字母,若首字母相同,则比较顺序位字母. 今天死在这了 数据库中 step字段类型char分别为 5. ...

  7. SQL server 表结构转Oracle SQL脚本

    SQL server 表结构转Oracle SQL脚本 /****** Object: StoredProcedure [dbo].[getOracle] Script Date: 2019/7/25 ...

  8. vi中使用删除键(backspace)只能删除到行首不能跳到上一行怎么处理?

    答: 在~/.vimrc中加入以下内容: set backspace=2

  9. [LeetCode] 117. Populating Next Right Pointers in Each Node II 每个节点的右向指针 II

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  10. Kubernetes 配置管理 Dashboard(十三)

    目录 一.安装配置 1.1 下载 镜像 1.2.安装 1.3.修改 NodePort 二.配置授权 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户 ...