kubernetes
  • Introduction
  • 安装
    • 组件端口
    • 二进制安装
    • Kubeadm
      • 安装单Master集群
      • 安装高可用集群(手动分发证书)
      • 安装高可用集群(自动上传证书)
      • 安装ETCD集群
      • 安装高可用集群(外部ETCD)
    • 启动参数解析
      • ETCD相关参数
  • 负载均衡
    • Service
    • Ingress
    • 安装MetalLB
    • Nginx-ingress-controller
      • 转发TCP与UDP服务
      • 启动参数
      • 自定义Nginx模板
  • 存储
    • Volume
    • PV与PVC
    • StorageClass
    • Local-PV
      • Static-Provisioner
    • 实践
      • Ceph-RBD
      • NFS
  • 有状态服务
    • Mysql实践
    • Operator
      • Etcd
      • Zookeeper
      • Mysql
  • 认证与授权
    • 认证
      • 实践
    • 授权
  • Helm
    • 安装
    • Chart
      • 依赖
    • Helm命令
    • Repository
  • 日志
  • 监控
    • Prometheus体系
      • Prometheus
        • 内置函数
        • 配置
          • 规则文件
        • PromQL
      • Exporter
        • Metrics
      • Grafana
        • 配置
      • AlertManager
        • 配置
    • 容器监控
      • Cadvisor的指标
      • k8s中部署Prom与Cadvisor
  • Istio
  • 资源预留
    • imagefs与nodefs
    • 总结
  • 集群联邦
    • 联邦DNS原理
    • 联邦DNS安装
    • 安装federation-v1
  • Other
    • ImagePullSecret
    • QOS
    • Apiserver的代理
    • 资源配额
Powered by GitBook
On this page
  • Chart.yaml
  • templates/
  • Deployment.yaml
  • Service.yaml
  • values.yaml
  • 发布chart
  • 指定参数发布
  • 删除Release
  • 打包Chart
  • Reference

Was this helpful?

  1. Helm

Chart

本人将介绍如何一步一步地创建一个chart。

假设我们现在要自定义一个chart,用来发布一个tomcat应用,资源对象包括Deployment与Service。

首先为chart手动创建如下的目录结构:

mytomcat/
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml

Chart.yaml

该文件包含了这个chart的元数据,以下是几个比较重要的字段:

  • apiVersion:必填,取值一直为"v1"

  • name:必填,chart的名字,必须与文件夹的名字一致

  • version:必填,chart的版本,遵循SemVer语法

  • appVersion:可选,app的版本,比如如果我们这个chart是发布一个tomcat服务,使用的镜像是tomcat:7.0,那么该字段值我们可以填7

以下便是我们的Chart.yaml文件的内容

apiVersion: v1
name: mytomcat
version: 1.0.0
appappVersion: 7

templates/

该目录下是一个个模板文件,文件其实就是kubernetes中的资源的yaml文件,只不过抽象了一些参数出来。

Deployment.yaml

在这里,我们把名字、镜像、版本号、资源规格等内容抽象出来,于是该文件的内容如下:

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的端口号等抽象出来,模板文件如下

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文件的内容,如下:

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,执行以下的命令:

$ helm install ./mytomcat

然后便会在k8s集群中创建一个Deployment与Service。这一次发布(Release)没有指定名字,所以是随机生成的,我们来list一下Release:

$ 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

$ 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的名字

$ helm install ./mytomcat --name=release2

然后查看Release的情况:

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的状态:

$ 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中的值,如下:

$ helm install ./mytomcat --name=release3 --set deploy.image=tomcat:8.0 --set deploy.resources.limits.cpu=1

查看Deployment的yaml文件发现覆盖生效(已验证)。

当然,我们也可以使用自定义文件中的值来覆盖,新建myvalues.yaml,内容如下:

deploy:
  image: tomcat:7.0
  resources:
    limits:
      cpu: 1

然后,我们再进行发布:

$ helm install ./mytomcat --name release4 --values ./myvalues.yaml

备注: 关于自定义值,在helm install命令中有多个flag可以使用,分别为--set、--set-file、--set-string和--values,关于它们的区别,请参考《Helm命令》一节或官方文档

删除Release

在上面,我们使用一个chart进行了多次发布,我们可以使用下面的命令删除指定的Release,比如删除release2

$ helm delete release2

删除后,release2对应的Deployment与Service会被删除,但元数据并没有被删掉,如下可以看到:

$ 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:

$ helm delete --purge release2

打包Chart

使用如下的命令为打包我们的chart

$ helm package mytomcat

然后会在当前目录下生成一个压缩包mytomcat-1.0.0.tgz,其中1.0.0表示这个chart的版本号,来源于mytomcat/Chart.yaml中的version字段的值。

Reference

Previous安装Next依赖

Last updated 5 years ago

Was this helpful?

https://helm.sh/docs/developing_charts/