本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。

一、关于Helm

1.1 为何需要Helm?

  虽然K8S能够很好地组织和编排容器,但是缺少一个更高层次的应用打包工具,而Helm就是专门干这个事的。

  通过Helm能够帮助开发者定义、安装和升级Kubernetes中的容器云应用。同时,也可以通过Helm进行容器云应用的分享。

1.2 Helm的架构

  Helm的整体架构如下图(图片来源-Kubernetes中文社区)所示:

  

  Helm架构由Helm客户端、Tiller服务器端和Chart仓库所组成;

两个重要概念:

(1)Chart是创建一个应用的信息集合,包括各种K8S对象的配置模板、参数定义等,可以理解为是apt、yum中的软件安装包;

(2)Release是Chart的运行实例,代表了一个正在运行的应用。

  Tiller部署在Kubernetes中,Helm客户端从Chart仓库中获取Chart安装包,并通过与Tiller服务器的交互将其安装部署到Kubernetes集群中。

  简单说来,Helm客户端负责管理Chart,而 Tiller服务器则负责管理Release。

二、Helm的安装和使用

2.1 Helm客户端的安装

  执行以下命令将Helm客户端安装在能够执行kubectl命令的节点上,这里假设我们安装在k8s-master节点上进行示例演示:

  1. curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash

  也可以通过下面的方式安装:

  1. wget https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-amd64.tar.gz
  2. tar -zxvf helm-v2.11.0-linux-amd64.tar.gz
  3. cd linux-amd64/
  4. cp helm /usr/local/bin/

  验证:查看helm版本

  1. helm version

  

  补充:为了提高使用命令行的效率,建议安装helm命令补全脚本,命令如下:

  1. cd ~ && helm completion bash > .helmrc echo "source .helmrc" >> .bashrc

  重新登录后,就可以方便地通过tab键来补全helm子命令和参数了,如下图所示,当我们输入helm install --之后按下Tab键,就会给我们参数提示了:

  

2.2 Tiller服务器的安装

  Tiller服务器本身也是作为容器化的一个应用运行在K8S集群中,这里我们简单执行下面的命令即可安装Tiller服务:

  1. helm init

  执行以上命令,会如下图所示:

  

  看到上图中的提示信息,代表Helm服务端已经安装成功。

  这时,我们可以看看Tiller的Service、Deployment和Pod有没有启动起来:

  (1)Service & Deployment

  

  (2)Pod

  

  如果看到其Status不是Running,那么很有可能是镜像没有拉取下来,可以曲线救国:即下载可访问的镜像然后修改Tag!

  1. docker pull fishead/gcr.io.kubernetes-helm.tiller:v2.11.0
  2. docker tag fishead/gcr.io.kubernetes-helm.tiller:v2.11.0 gcr.io/kubernetes-helm/tiller:v2.11.0

  这时再次通过helm version命令验证一下:

  

  可以看到,我们已经可以成功看到客户端和服务端的版本信息了,证明客户端和服务端(Pod)都已经安装成功了!

2.3 Helm的使用准备

  Helm安装好后,我们可以通过以下helm search来查看当前可安装的Chart:

  

Note:Helm安装时会为我们配置好两个仓库,一个是stable官方仓库,另一个是local本地仓库,上图中显示的都是stable官方仓库中的Chart。  

  为了能够执行install安装,我们还需要事先为Tiller服务器添加集群权限,防止因Tiller服务器的权限不足而无法install。

  1. # 创建serviceaccount资源tiller,属于kube-system命名空间
  2. kubectl create serviceaccount -n kube-system tiller
  3. # 创建 clusterrolebinding资源tiller-cluster-rule,集群角色为cluster-admin,用户为kube-system:tiller
  4. kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
  5. # 修改deployment tiller-deploy的配置,增加字段spec.template.spec.serviceAccount
  6. kubectl patch deploy -n kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

  

   至此,使用Helm的准备工作就到此结束,后面我们就可以开始实践安装Chart了!

三、MySQL Chart实践

3.1 初步安装MySQL Chart

  这里我们通过以下命令来通过官方仓库安装mysql:

  1. helm install stable/mysql -n=edc-mysql --namespace=edc-charts

  其中,-n 代表 release的名字,--namespace 指定了其所在namespace。

  执行成功之后,会显示一屏幕的提示信息,其中Notes部分包含了release的使用方法,可以重点关注一下。

  这里我们通过以下命令来看看已经部署的release:

  1. helm list

  

  可以看到,该release的状态已经是DEPLOYED,也可以看到其版本号是5.7.27。

  下面再看看service、deployment、pod以及pvc的情况:

  

  

  从上图可以看到,由于还没有位mysql准备PV(PersistentVolume,不了解此概念的童鞋可以参考这一篇《K8S数据管理》),导致当前release不可用,处于Pending状态。接下来我们就要先解决PV的问题,让release能够正常运行起来!在此之前,为了后续方便演示,这里现将此chart删除:

  1. helm delete edc-mysql

3.2 为MySQL Chart准备PV

  首先,按照约定准备一个edc-mysql-pv.yml,如下所示:

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: edc-mysql-pv
  5. spec:
  6. capacity:
  7. storage: 8Gi
  8. accessModes:
  9. - ReadWriteOnce
  10. persistentVolumeReclaimPolicy: Retain
  11. #storageClassName: nfs
  12. nfs:
  13. path: /edc/k8s/nfsdata/edc-mysql-pv
  14. server: k8s-master

  这里申请了一个8G的PV,用于适配mysql chart的默认配置要求,当然我们也可以通过修改自定义values.yaml来修改。

3.3 定制化安装MySQL Chart

  Helm有两种方式传递配置参数实现定制化安装,一种是指定自定义的values文件,另一种是通过--set直接传入参数值。这里我们演示通过第二种,这里我们重新安装mysql chart:

  1. helm install stable/mysql -namespace=edc-charts --set mysqlRootPassword=edc123456 -n edison

  验证结果如下图所示:

  

3.4 升级和回滚Release

  这里假设我安装的版本是5.7.14,这里我将其先升级为5.7.26来演示:

  1. helm upgrade --set imageTag=5.7. edison stable/mysql

  通过查看可以看到image已经换为了5.7.26:

  

  通过helm history可以查看release的所有历史版本:

  

  Note:这里Revision 1是5.7.14版本,Revision 2是5.7.26版本,Revision 3是5.7.27版本。

  这里我们通过helm rollback回退到Revision 1版本(即5.7.14版本),可以看到已经成功回退到了5.7.14版本:

  

四、自定义Chart实践

4.1 创建Chart

  首先,通过以下命令创建一个chart命名为mychart:

  1. helm create mychart

  Helm会帮我们创建目录mychart,并生成各种chart文件。

  

  这里我们需要关注的是values.yaml,修改其中的内容为我们之前演示的ASP.NET Core WebAPI应用镜像:

  1. # Default values for mychart.
  2. # This is a YAML-formatted file.
  3. # Declare variables to be passed into your templates.
  4.  
  5. replicaCount:
  6.  
  7. image:
  8. repository: edisonsaonian/k8s-demo
  9. tag: latest
  10. pullPolicy: IfNotPresent
  11.  
  12. service:
  13. type: NodePort
  14. port:
  15. nodePort:
  16.  
  17. ingress:
  18. enabled: false
  19.  
  20. resources:
  21. limits:
  22. cpu:
  23. memory: 228Mi
  24. requests:
  25. cpu: 100m
  26. memory: 128Mi

  这里我们选择NodePort的方式让外部可以通过31000端口访问到API,也设置了资源限制。

  此外,我们再修改一下Templates目录下的deployment和service两个模板文件:

  (1)deployment模板:重点关注两个探针的配置

  1. apiVersion: apps/v1beta2
  2. kind: Deployment
  3. metadata:
  4. name: {{ include "mychart.fullname" . }}
  5. labels:
  6. app.kubernetes.io/name: {{ include "mychart.name" . }}
  7. helm.sh/chart: {{ include "mychart.chart" . }}
  8. app.kubernetes.io/instance: {{ .Release.Name }}
  9. app.kubernetes.io/managed-by: {{ .Release.Service }}
  10. spec:
  11. replicas: {{ .Values.replicaCount }}
  12. selector:
  13. matchLabels:
  14. app.kubernetes.io/name: {{ include "mychart.name" . }}
  15. app.kubernetes.io/instance: {{ .Release.Name }}
  16. template:
  17. metadata:
  18. labels:
  19. app.kubernetes.io/name: {{ include "mychart.name" . }}
  20. app.kubernetes.io/instance: {{ .Release.Name }}
  21. spec:
  22. containers:
  23. - name: {{ .Chart.Name }}
  24. image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
  25. imagePullPolicy: {{ .Values.image.pullPolicy }}
  26. ports:
  27. - name: http
  28. containerPort:
  29. protocol: TCP
  30. # 探针 检测项目是否存活
  31. livenessProbe:
  32. httpGet:
  33. path: /api/values
  34. port: http
  35. # 探针 检测项目是否启动成功
  36. readinessProbe:
  37. httpGet:
  38. path: /api/values
  39. port: http
  40. initialDelaySeconds:
  41. periodSeconds:
  42. resources:
  43. {{ toYaml .Values.resources | indent }}
  44. {{- with .Values.nodeSelector }}
  45. nodeSelector:
  46. {{ toYaml . | indent }}
  47. {{- end }}
  48. {{- with .Values.affinity }}
  49. affinity:
  50. {{ toYaml . | indent }}
  51. {{- end }}
  52. {{- with .Values.tolerations }}
  53. tolerations:
  54. {{ toYaml . | indent }}
  55. {{- end }}

  (2)service模板:重点关注NodePort的配置

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: {{ include "mychart.fullname" . }}
  5. labels:
  6. app.kubernetes.io/name: {{ include "mychart.name" . }}
  7. helm.sh/chart: {{ include "mychart.chart" . }}
  8. app.kubernetes.io/instance: {{ .Release.Name }}
  9. app.kubernetes.io/managed-by: {{ .Release.Service }}
  10. spec:
  11. type: {{ .Values.service.type }}
  12. ports:
  13. - port: {{ .Values.service.port }}
  14. targetPort: http
  15. # 添加nodePort
  16. nodePort: {{ .Values.service.nodePort }}
  17. protocol: TCP
  18. name: http
  19. selector:
  20. app.kubernetes.io/name: {{ include "mychart.name" . }}
  21. app.kubernetes.io/instance: {{ .Release.Name }}

  编写完成后,通过 helm lint 可以帮助我们快速验证是否有语法错误:

  

4.2 安装Chart

  没有语法错误检测之后,便可以开始安装Chart了,正式安装之前我们可以通过以下命令来模拟安装,它会输出每个模板生成的yaml内容,帮助你检查生成的yaml内容是否是你想要的或者正确的。

  1. helm install --dry-run --debug

  然后,这里我们选择本地安装Chart:

  1. helm install mychart -n edc-api-release --namespace=aspnetcore

  只需要简单的一句话,就可以将chart部署到K8S集群中了,下面我们通过在外部访问NodePort 31000端口来验证一下是否部署成功:

  (1)Node 1

  

  (2)Node 2

  

  两个Node节点都可以访问到,证明部署成功!

4.3 添加Chart到仓库

  通过测试之后,我们的Chart就可以发布到仓库中供团队成员使用了,像阿里云、腾讯云等云服务商都已经提供了完善的Helm远程仓库,我们也可以自己搭建一个仓库,任何的Web Server其实都可以作为一个chart仓库。

  下面我们在k8s-master上启动给一个httpd容器,让它来作为我们的本地chart仓库。

  1. docker run -d -p : -v /var/www:/usr/local/apache2/htdocs/ httpd

  然后,我们将mychart进行打包,helm会将其打包为一个tgz包:

  1. helm package mychart

  然后,我们为mychart包生成仓库的index文件,并将其推送到本地chart仓库中:

  1. mkdir myrepo
  2. mv mychart-0.1..tgz myrepo/
  3. helm repo index myrepo/ --url http://192.168.2.100:8080/charts

  这里我们将httpd容器中的charts目录作为chart仓库,因此需要提前创建charts目录,并将打好的包和index.yaml文件也上传到该目录中:

  

  最后,我们将新仓库添加到helm:

  1. helm repo add edc-repo http://192.168.2.100:8080/charts
  2. helm repo list

  

  可以看到,edc-repo已经添加到了helm中,代表可以从新的本地仓库中下载和安装mychart了!

4.4 使用自定义Chart

  现在我们来从本地的新仓库中下载和安装mychart:

  1. helm install edc-repo/mychart -n mychart-release --namespace=aspnetcore

  安装完成后再次验证:

  (1)Node 1

  

  (2)Node 2

  

  如果以后仓库添加了新的chart,需要使用以下命令来更新本地的index文件:

  1. helm repo update

五、小结

  本文介绍了K8S的包管理器Helm的基本概念与安装和使用,Helm能够帮助我们像使用apt或yum那样管理安装、部署、升级和删除容器化应用,最后演示了如何为我们的ASP.NET Core API应用开发自己的chart,并在团队中共享chart。当然,关于Helm,笔者也是初学,还有很多地方没有研究,希望此文能给初学者一点帮助,谢谢!

参考资料

(1)CloudMan,《每天5分钟玩转Kubernetes

(2)李振良,《一天入门Kubernets教程

(3)马哥(马永亮),《Kubernetes快速入门

(4)潘猛,《Kubernetes笔记之Helm

(5)雪雁(心莱科技),《利用Helm简化Kubernetes应用部署(二)

(6)周国通,《Kubernetes实战篇之Helm填坑与基本命令

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

ASP.NET Core on K8S深入学习(10)K8S包管理器Helm的更多相关文章

  1. 容器编排系统K8s之包管理器Helm基础使用

    前文我们了解了k8s上的hpa资源的使用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14293237.html:今天我们来聊一下k8s包管理器helm的相 ...

  2. 容器编排系统K8s之包管理器helm基础使用(二)

    前文我们介绍了helm的相关术语和使用helm安装和卸载应用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14305902.html:今天我们来介绍下自定义 ...

  3. 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2  任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...

  4. ASP.NET Core MVC的基础学习笔记

    最近由于“武汉肺炎”疫情在家办公,也没闲着,最近学习了一下asp.net core mvc的一些网页开发的的基础知识,话不多说直接上教程! 一.创建Web应用程序 1)创建新项目--->找到 “ ...

  5. NET Core 静态文件及JS包管理器(npm, Bower)的使用

    NET Core 静态文件及JS包管理器(npm, Bower)的使用 文章目录 在 ASP.NET Core 中添加静态文件 使用npm管理JavaScript包 使用Bower管理JavaScri ...

  6. Kubernetes学习之路(二十五)之Helm程序包管理器

    目录 1.Helm的概念和架构 2.部署Helm (1)下载helm (2)部署Tiller 3.helm的使用 4.chart 目录结构 5.chart模板 6.定制安装MySQL chart (1 ...

  7. Openresty 学习笔记(四)lualocks包管理器安装使用

    Luarocks是一个Lua包管理器,基于Lua语言开发,提供一个命令行的方式来管理Lua包依赖.安装第三方Lua包等,社区比较流行的包管理器之一,另还有一个LuaDist,Luarocks的包数量比 ...

  8. Linux学习之RPM包管理-yum管理(十七)

    Linux学习之RPM包管理-yum管理 目录 IP地址配置 网络yum源 yum命令 光盘yum源搭建 IP地址配置 IP+子网掩码就可以在局域网(内网)使用. IP+子网掩码+网关+DNS就可以访 ...

  9. Linux学习之RPM包管理-rpm命令管理(十六)

    Linux学习之RPM包管理-rpm命令管理 目录 简介 RPM包依赖性 包全名与包名 rpm软件包安装 rpm软件包卸载 升级降级rpm软件包 rpm软件包的查询 rpm软件包校验 简介 RPM是R ...

随机推荐

  1. Idea创建maven项目,报错xxx already exists in VFS

    1.问题描述: 我打算在父级maven项目中创建子级project,但是一直报错如下: 2.stackover flow中找到了问题的答案, 地址:https://stackoverflow.com/ ...

  2. AutoCAD二次开发(2020版)--4,使用ARX向导创建编程模板(框架)--

    手动创建ObjectARX应用程序非常麻烦,在此步骤中,将介绍ObjectARX向导. 在这里,我们将使用ObjectARX向导创建我们的ObjectARX应用程序. 本节的程序的需求是,接收CAD用 ...

  3. postgresql密码加强-passwordcheck源码修改三种以上字符

    目录 1.使用方式 2.效果 3.源码修改 1.参考pg_cron的源码在配置文件内增加一个参数 2.修改源码配置校验数字 因数据库入网检测须修改密码级别,在源有的passwordcheck插件上进行 ...

  4. 共享共建会让中国的5G加速吗?

    9月9号,中国联通正式公告,已与中国电信签署<5G网络共建共享框架合作协议书>,将在全国范围内合作共建5G接入网络. 这则消息堪称爆炸性新闻,但却看不到什么深度分析,评论文章除了强调&qu ...

  5. 详细nginx配置SSL

    1.nginx的ssl 让nginx实现用https来访问网站,http是80端口,https是443端口. https其实就是一种加密的http 2.为什么要加密 例子:在网上银行汇款,在你汇款的过 ...

  6. shell 数组作为函数形参

    问题描述: 把字符串tarFile和数组slaves_hostIP传入函数processArray中并输出结果. #!/bin/bash function processArray() { tarFi ...

  7. MRC ARC 混编

    今天一个人问我 什么是MRC 什么是ARC 要是一个工程里用到了MRC和ARC 怎么办 我当时就无语了 什么情况 这是....   好了正经一点 我说一下iOS5.0以后就开始可以使用ARC( Aut ...

  8. MAC vim修改hosts文件

    在终端输入sudo vim /etc/hosts 输入密码获取写权限 输入i,执行insert插入修改操作,修改hosts文件内容 修改完成后先按ESC进入命令模式,再按shift + :,在底端出现 ...

  9. cesium 结合 geoserver 实现地图属性查询(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  10. HDU4918 Query on the subtree 点分治+树状数组

    bobo has a tree, whose vertices are conveniently labeled by 1,2,…,n. At the very begining, the i-th ...