有两种方法

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

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

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

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

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

    HTML 与 HTML 的跳转中如何在HTML之中实现参数的传递?主要代码如下:request为方法名称,params 为要获取的参数. function request(params) { var ...

  2. Windows 安装R

    下载 R 的安装包 双击 安装包 进行安装 安装完成 测试 修改 R 中的CRAN镜像 添加到 Windows 的环境变量中 测试

  3. 作业——12 hadoop大作业

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 Hadoop综合大作业 1.以下是爬虫大作业产生的csv文件 ...

  4. Python3基础 list(dict) 使用 * 扩充时,出现字典元素重复问题

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  5. 泡泡一分钟:GEN-SLAM - Generative Modeling for Monocular Simultaneous Localization and Mapping

    张宁  GEN-SLAM - Generative Modeling for Monocular Simultaneous Localization and Mapping GEN-SLAM  - 单 ...

  6. 【Redis】Redis 事务

    Redis 事务介绍 Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败 ...

  7. Pytest单元测试框架-Pytest环境安装

    unittest是python自带的单元测试框架,它封装好了一些校验返回的结果方法和一些用例执行前的初始化操作,使得单元测试易于开展,因为它的易用性,很多同学也拿它来做功能测试和接口测试,只需简单开发 ...

  8. css重直居中代码

    老是忘,记在这里: vertical-align: middle;

  9. [LeetCode] 151. Reverse Words in a String 翻转字符串中的单词

    Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...

  10. 【SSH进阶之路】Hibernate映射——一对多关联映射(七)

    上上篇博文[SSH进阶之路]Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份 ...