本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。上一篇 Part 1 中介绍了Helm的基本概念与基本使用,这一篇我们来自定义一个Chart玩玩。
自定义一个Chart
1 创建Chart
首先,通过以下命令创建一个chart命名为mychart:
helm create mychart
Helm会帮我们创建目录mychart,并生成各种chart文件。
这里我们需要关注的是values.yaml,修改其中的内容为我们之前演示的ASP.NET Core WebAPI应用镜像:
# Default values for mychart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.replicaCount: 1image:repository: edisonsaonian/k8s-demotag: latestpullPolicy: IfNotPresentservice:type: NodePortport: 80nodePort: 31000ingress:enabled: falseresources:limits:cpu: 1memory: 228Mirequests:cpu: 100mmemory: 128Mi
这里我们选择NodePort的方式让外部可以通过31000端口访问到API,也设置了资源限制。
此外,我们再修改一下Templates目录下的deployment和service两个模板文件:
(1)deployment模板:重点关注两个探针的配置
apiVersion: apps/v1beta2
kind: Deployment
metadata:name: {{ include "mychart.fullname" . }}labels:app.kubernetes.io/name: {{ include "mychart.name" . }}helm.sh/chart: {{ include "mychart.chart" . }}app.kubernetes.io/instance: {{ .Release.Name }}app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:replicas: {{ .Values.replicaCount }}selector:matchLabels:app.kubernetes.io/name: {{ include "mychart.name" . }}app.kubernetes.io/instance: {{ .Release.Name }}template:metadata:labels:app.kubernetes.io/name: {{ include "mychart.name" . }}app.kubernetes.io/instance: {{ .Release.Name }}spec:containers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"imagePullPolicy: {{ .Values.image.pullPolicy }}ports:- name: httpcontainerPort: 80protocol: TCP# 探针 检测项目是否存活livenessProbe:httpGet:path: /api/valuesport: http# 探针 检测项目是否启动成功readinessProbe:httpGet:path: /api/valuesport: httpinitialDelaySeconds: 30periodSeconds: 60resources:
{{ toYaml .Values.resources | indent 12 }}{{- with .Values.nodeSelector }}nodeSelector:
{{ toYaml . | indent 8 }}{{- end }}{{- with .Values.affinity }}affinity:
{{ toYaml . | indent 8 }}{{- end }}{{- with .Values.tolerations }}tolerations:
{{ toYaml . | indent 8 }}{{- end }}
(2)service模板:重点关注NodePort的配置
apiVersion: v1
kind: Service
metadata:name: {{ include "mychart.fullname" . }}labels:app.kubernetes.io/name: {{ include "mychart.name" . }}helm.sh/chart: {{ include "mychart.chart" . }}app.kubernetes.io/instance: {{ .Release.Name }}app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: http# 添加nodePortnodePort: {{ .Values.service.nodePort }}protocol: TCPname: httpselector:app.kubernetes.io/name: {{ include "mychart.name" . }}app.kubernetes.io/instance: {{ .Release.Name }}
编写完成后,通过 helm lint 可以帮助我们快速验证是否有语法错误:
2 安装Chart
没有语法错误检测之后,便可以开始安装Chart了,正式安装之前我们可以通过以下命令来模拟安装,它会输出每个模板生成的yaml内容,帮助你检查生成的yaml内容是否是你想要的或者正确的。
helm install --dry-run --debug
然后,这里我们选择本地安装Chart:
helm install mychart -n edc-api-release --namespace=aspnetcore
只需要简单的一句话,就可以将chart部署到K8S集群中了,下面我们通过在外部访问NodePort 31000端口来验证一下是否部署成功:
(1)Node 1
(2)Node 2
两个Node节点都可以访问到,证明部署成功!
3 添加Chart到仓库
通过测试之后,我们的Chart就可以发布到仓库中供团队成员使用了,像阿里云、腾讯云等云服务商都已经提供了完善的Helm远程仓库,我们也可以自己搭建一个仓库,任何的Web Server其实都可以作为一个chart仓库。
下面我们在k8s-master上启动给一个httpd容器,让它来作为我们的本地chart仓库。
docker run -d -p 8080:80 \
-v /var/www:/usr/local/apache2/htdocs/ \
httpd
然后,我们将mychart进行打包,helm会将其打包为一个tgz包:
helm package mychart
然后,我们为mychart包生成仓库的index文件,并将其推送到本地chart仓库中:
mkdir myrepo
mv mychart-0.1.0.tgz myrepo/
helm repo index myrepo/ --url http://192.168.2.100:8080/charts
这里我们将httpd容器中的charts目录作为chart仓库,因此需要提前创建charts目录,并将打好的包和index.yaml文件也上传到该目录中:
最后,我们将新仓库添加到helm:
helm repo add edc-repo http://192.168.2.100:8080/charts
helm repo list
可以看到,edc-repo已经添加到了helm中,代表可以从新的本地仓库中下载和安装mychart了!
4 使用自定义Chart
现在我们来从本地的新仓库中下载和安装mychart:
helm install edc-repo/mychart \
-n mychart-release \
--namespace=aspnetcore
安装完成后再次验证:
(1)Node 1
(2)Node 2
如果以后仓库添加了新的chart,需要使用以下命令来更新本地的index文件:
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填坑与基本命令》
恰童鞋骚年,风华也许不再正茂,但却仍想挥斥方遒。
本公众号会长期关注和分享.NET Core,Microservice,Cloud Native,DevOps等技术内容文章,还会与你分享个人生活成长的点滴及各类好书的读书笔记,希望能对你有所帮助,一起成长!
点个【在看】,和更多人一起分享!