本人将介绍如何一步一步地创建一个chart。
假设我们现在要自定义一个chart,用来发布一个tomcat应用,资源对象包括Deployment
与Service
。
首先为chart手动创建如下的目录结构:
Copy mytomcat/
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
Chart.yaml
该文件包含了这个chart的元数据,以下是几个比较重要的字段:
name
:必填,chart的名字,必须与文件夹的名字一致
version
:必填,chart的版本,遵循SemVer语法
appVersion
:可选,app的版本,比如如果我们这个chart是发布一个tomcat服务,使用的镜像是tomcat:7.0,那么该字段值我们可以填7
以下便是我们的Chart.yaml
文件的内容
Copy apiVersion: v1
name: mytomcat
version: 1.0.0
appappVersion: 7
templates/
该目录下是一个个模板文件,文件其实就是kubernetes中的资源的yaml文件,只不过抽象了一些参数出来。
Deployment.yaml
在这里,我们把名字、镜像、版本号、资源规格等内容抽象出来,于是该文件的内容如下:
Copy apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.deploy.replicas }}
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Release.Name }}
image: {{ .Values.deploy.image }}
resources:
{{ toYaml .Values.deploy.resources | indent 12 }}
解释一下上述的值的来源:{{ .Release.Name }}
表示Release
的名字,因为我们可以通过这个chart在集群上进行多次发布,每一次发布就是一次Release
;{{ .Values.deploy.replicas }}
表示Values.yaml
中的deploy.replicas
字段的值;{{ toYaml .Values.deploy.resources | indent 12 }}
表示Values.yaml
中resources
字段的值,但该值不是一个string类型,而是一个yaml类型,注意该行内容前不能有空格,因为里面的indent 12
已经把值替代进来时要缩进12个空格
Service.yaml
我们把Service
的端口号等抽象出来,模板文件如下
Copy apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
spec:
type: {{ .Values.service.type }}
selector:
app: {{ .Release.Name }}
ports:
- port: {{ .Values.service.externalPort }}
targetPort: {{ .Values.service.internalPort }}
protocol: TCP
name: {{ .Values.service.name }}
values.yaml
最后我们给出values.yaml
文件的内容,如下:
Copy deploy:
replicas: 1
image: tomcat:7.0
resources:
limits:
cpu: 100m
memory: 256Mi
requests:
cpu: 100m
memory: 256Mi
service:
name: http
type: ClusterIP
externalPort: 80
internalPort: 8080
发布chart
接下来,我们来发布这个chart,执行以下的命令:
Copy $ helm install ./mytomcat
然后便会在k8s集群中创建一个Deployment
与Service
。这一次发布(Release
)没有指定名字,所以是随机生成的,我们来list一下Release
:
Copy $ helm list
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
anxious-numbat 1 Thu Apr 25 14:40:29 2019 DEPLOYED mytomcat-1.0.0 default
我们来查看一下本次Release
的状态,发现其生成了一个Deployment
与Service
,名字与Release
的名字相同。Pod
不是由于此次Release
直接生成的,已标注为related
Copy $ helm status anxious-numbat
LAST DEPLOYED: Thu Apr 25 14:40:29 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
anxious-numbat-846d87c67-g8dxq 1/1 Running 0 28m
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
anxious-numbat ClusterIP 10.109.196.73 <none> 80/TCP 28m
==> v1beta2/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
anxious-numbat 1/1 1 1 28m
接下来,我们再发布一次,指定Release
的名字
Copy $ helm install ./mytomcat --name=release2
然后查看Release
的情况:
Copy NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
anxious-numbat 1 Thu Apr 25 14:40:29 2019 DEPLOYED mytomcat-1.0.0 default
release2 1 Thu Apr 25 14:52:58 2019 DEPLOYED mytomcat-1.0.0 default
查看release2
的状态:
Copy $ helm status release2
LAST DEPLOYED: Thu Apr 25 14:52:58 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
release2-798f98488c-spqx2 1/1 Running 0 19m
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
release2 ClusterIP 10.109.20.196 <none> 80/TCP 19m
==> v1beta2/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
release2 1/1 1 1 19m
指定参数发布
在上面中,我们使用了values.yaml
中的默认值。我们也可以使用自定义值来覆盖values.yaml
中的值,如下:
Copy $ helm install ./mytomcat --name=release3 --set deploy.image=tomcat:8.0 --set deploy.resources.limits.cpu=1
查看Deployment
的yaml文件发现覆盖生效(已验证)。
当然,我们也可以使用自定义文件中的值来覆盖,新建myvalues.yaml
,内容如下:
Copy deploy:
image: tomcat:7.0
resources:
limits:
cpu: 1
然后,我们再进行发布:
Copy $ helm install ./mytomcat --name release4 --values ./myvalues.yaml
备注: 关于自定义值,在helm install
命令中有多个flag
可以使用,分别为--set
、--set-file
、--set-string
和--values
,关于它们的区别,请参考《Helm命令》一节或官方文档
删除Release
在上面,我们使用一个chart进行了多次发布,我们可以使用下面的命令删除指定的Release
,比如删除release2
Copy $ helm delete release2
删除后,release2
对应的Deployment
与Service
会被删除,但元数据并没有被删掉,如下可以看到:
Copy $ helm list --all
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
anxious-numbat 1 Thu Apr 25 14:40:29 2019 DEPLOYED mytomcat-1.0.0 default
release2 1 Thu Apr 25 14:52:58 2019 DELETED mytomcat-1.0.0 default
$ helm status release2
LAST DEPLOYED: Thu Apr 25 14:52:58 2019
NAMESPACE: default
STATUS: DELETED
此时,如果再发布一次,名字叫release2
便会报错。要想彻底删掉一个Release
,添加选项--purge
:
Copy $ helm delete --purge release2
打包Chart
使用如下的命令为打包我们的chart
Copy $ helm package mytomcat
然后会在当前目录下生成一个压缩包mytomcat-1.0.0.tgz
,其中1.0.0
表示这个chart的版本号,来源于mytomcat/Chart.yaml
中的version
字段的值。
Reference