helm chart编写入门

简介: helm chart编写入门

helm相关概念介绍

什么是helm

Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。使用helm能够将一组k8s资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。


helm 相关组件及概念

  • helm  一个命令行下客户端工具,主要用于k8s应用chart的创建/打包/发布已经创建和管理和远程Chart仓库。
  • Tiller  helm的服务端,部署于k8s内,Tiller接受helm的请求,并根据chart生成k8s部署文件(helm称为release),然后提交给 k8s创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
  • chart helm的软件包,其包含运行一个应用所需的所有镜像/依赖/资源定义等,以及k8s中服务定义
  • release 使用 helm install 命令在 k8s集群中部署的 Chart 称为 Release
  • Repoistory Helm chart 的仓库,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引文件和压缩包


创作helm chart

Chart目录结构

本地安装helm客户端工具(具体安装步骤参考官网https://github.com/helm/helm/releases)。

运行 helm create demo,会得到一个 helm 自动生成的空 chart。这个 chart 里的名称是demo。需要注意的是,Chart 里面的 demo 名称需要和生成的 Chart 文件夹名称一致。如果修改 demo,则需要做一致的修改。

demo                                # Chart 目录
├── charts                          # 这个 charts 依赖的其他 charts,始终被安装
├── Chart.yaml                      # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates                       # 模板目录
│   ├── deployment.yaml             # deployment 控制器的 Go 模板文件
│   ├── _helpers.tpl                # 以 _ 开头的文件不会部署到 k8s 上,可用于定制通用信息
│   ├── ingress.yaml                # ingress 的模板文件
│   ├── NOTES.txt                   # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值
│   ├── service.yaml                # service 的 Go 模板文件
└── values.yaml                     # 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件

Chart.yaml

# 对于部分仅支持使用Helm3的chart,应使用v2。对于可以同时支持helm3和helm2版本的chart,可设置为v1# v2新增了dependencies字段用于定义chart依赖关系,v1中使用requirement.yaml实现该功能# v2版本新增了type字段,用于区分chart类型,取值为 application(应用类型) / library(库类型)apiVersion: v2
name: demo
description: A Helm chart for Kubernetes
type: application
# chart版本version: 1.0.0# 应用版本appVersion: "1.0.0"


version

每个 chart 都必须有一个版本号。版本必须遵循 Semver 2标准。Helm 使用版本号作为发布标记。存储库中的软件包由名称加版本识别。

appVersion

appVersion 字段与 version 字段无关。用于指定应用程序版本。该字段是信息标识,对 chart 版本没有影响。

Semver 2

版本格式:主版本号.次版本号.修订号

版本号递增规则如下:

  1. 主版本号:当你做了不兼容的 API 修改,
  2. 次版本号:当你做了向下兼容的功能性新增,
  3. 修订号:当你做了向下兼容的问题修正。

先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

values.yaml


values.yaml 文件是 chart 的必要文件,主要用于变量的定义,此处定义的变量可在templates文件夹下引用


# Default values# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount: 1image:  repository: demo
  pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.  tag: "1.0"imagePullSecrets: []nameOverride: ""fullnameOverride: ""service:  type: ClusterIP
  port: 80  targetPort: 8080ingress:  enabled: true  className: ""  annotations: {}# kubernetes.io/ingress.class: nginx# kubernetes.io/tls-acme: "true"  hosts:    - host: demo.local
      paths:        - path: /
          pathType: ImplementationSpecific
  tls: []#  - secretName: chart-example-tls#    hosts:#      - chart-example.localautoscaling:  enabled: false  minReplicas: 1  maxReplicas: 100  targetCPUUtilizationPercentage: 80# targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}



templates

文件夹内存放了各类应用部署所需要使用的 YAML 文件,比如 Deployment 和 Service。具体参考k8s配置定义。其模板是用 Go 模板语言 Go template language 编写的 ,其中添加了来自 Sprig 库 from the Sprig library 的 50 个左右的附加模板函数以及一些其他专用函数 specialized functions

deployment.yaml

apiVersion: apps/v1  # 指定api版本,此值必须在kubectl api-versions中  kind: Deployment  # 指定创建资源的角色/类型   metadata:  # 资源的元数据/属性   name: demo  # 资源的名字,在同一个namespace中必须唯一  namespace: default # 部署在哪个namespace中  labels:  # 设定资源的标签    app: demo
    version: stable
spec: # 资源规范字段  replicas: 1 # 声明副本数目  revisionHistoryLimit: 3 # 保留历史版本  selector: # 选择器    matchLabels: # 匹配标签      app: demo
      version: stable
  strategy: # 策略    rollingUpdate: # 滚动更新      maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数      maxUnavailable: 30% # 示在更新过程中能够进入不可用状态的 Pod 的最大值,可以为百分比,也可以为整数    type: RollingUpdate # 滚动更新策略  template: # 模版    metadata: # 资源的元数据/属性       annotations: # 自定义注解列表        sidecar.istio.io/inject: "false"# 自定义注解名字      labels: # 设定资源的标签        app: demo
        version: stable
    spec: # 资源规范字段      containers:      - name: demo # 容器的名字           image: demo:v1 # 容器使用的镜像地址           imagePullPolicy: IfNotPresent # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent# Always,每次都检查;Never,每次都不检查(不管本地是否有);IfNotPresent,如果本地有就不检查,如果没有就拉取         resources: # 资源管理          limits: # 最大使用            cpu: 300m # CPU,1核心 = 1000m            memory: 500Mi # 内存,1G = 1024Mi          requests:  # 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行            cpu: 100m
            memory: 100Mi
        livenessProbe: # pod 内部健康检查的设置          httpGet: # 通过httpget检查健康,返回200-399之间,则认为容器正常            path: /healthCheck # URI地址            port: 8080 # 端口            scheme: HTTP # 协议# host: 127.0.0.1 # 主机地址          initialDelaySeconds: 30 # 表明第一次检测在容器启动后多长时间后开始          timeoutSeconds: 5 # 检测的超时时间          periodSeconds: 30 # 检查间隔时间          successThreshold: 1 # 成功门槛          failureThreshold: 5 # 失败门槛,连接失败5次,pod杀掉,重启一个新的pod        readinessProbe: # Pod 准备服务健康检查设置          httpGet:            path: /healthCheck
            port: 8080            scheme: HTTP
          initialDelaySeconds: 30          timeoutSeconds: 5          periodSeconds: 10          successThreshold: 1          failureThreshold: 5#也可以用这种方法   #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常   #  command:   #    - cat   #    - /tmp/health   #也可以用这种方法   #tcpSocket: # 通过tcpSocket检查健康  #  port: number         ports:          - name: http # 名称            containerPort: 8080 # 容器开发对外的端口             protocol: TCP # 协议      imagePullSecrets: # 镜像仓库拉取密钥        - name: harbor-certification
      affinity: # 亲和性调试        nodeAffinity: # 节点亲和力          requiredDuringSchedulingIgnoredDuringExecution: # pod 必须部署到满足条件的节点上            nodeSelectorTerms: # 节点满足任何一个条件就可以            - matchExpressions: # 有多个选项,则只有同时满足这些逻辑选项的节点才能运行 pod              - key: beta.kubernetes.io/arch
                operator: In
                values:                - amd64



service.yaml

apiVersion: v1 # 指定api版本,此值必须在kubectl api-versions中 kind: Service # 指定创建资源的角色/类型 metadata: # 资源的元数据/属性  name: demo # 资源的名字,在同一个namespace中必须唯一  namespace: default # 部署在哪个namespace中  labels: # 设定资源的标签    app: demo
spec: # 资源规范字段  type: ClusterIP # ClusterIP 类型  ports:    - port: 8080 # service 端口      targetPort: http # 容器暴露的端口      protocol: TCP # 协议      name: http # 端口名称  selector: # 选择器    app: demo


ingress.yaml

# test-ingress-myapp.yaml# ingress规则中,要指定需要绑定暴露的svc名称apiVersion: extensions/v1beta1
kind: Ingress
metadata:  name: demo
  namespace: default
spec:  rules:  - host: demo.local 
    http:      paths:      - path: /
        backend:          serviceName: demo
          servicePort: 80


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 Kubernetes Cloud Native
一文搞懂云原生架构
目前,每个 IT 资源或产品都作为服务提供。而且伴随云计算的滚滚浪潮,云原生(CloudNative)的概念应运而生,云原生很火,火得一塌糊涂,都0202年了,如果还不懂云原生,那真的out了。因此,云原生软件开发成为每个企业的关键要求,无论其规模和性质如何。在加入云计算潮流之前,了解什么是云原生架构以及如何为云原生应用程序需求设计正确的架构非常重要。
一文搞懂云原生架构
|
存储 Kubernetes Linux
helm 简介及基本使用
helm 简介及基本使用
3785 0
helm 简介及基本使用
|
缓存 Kubernetes API
Kubernetes Operator 开发教程
# 1. 概述 我们将 CRD, Controller, Webhook 三者合起来叫 Operator。一个 Operator 工程一般必须包含 CRD 和 Controller,Admission 是可选的。如果说 Kubernetes 是 "操作系统" 的话,Operator 是 Kubernetes 的第一层应用,它部署在 Kubernetes 里,使用 Kubernetes "扩展资源
11243 1
Kubernetes Operator 开发教程
|
人工智能 算法 数据可视化
AI Earth ——开发者模式案例7:植被覆盖度提取
AI Earth ——开发者模式案例7:植被覆盖度提取
284 9
|
调度 Perl 容器
开源工具GPU Sharing:支持Kubernetes集群细粒度
问题背景 全球主要的容器集群服务厂商的Kubernetes服务都提供了Nvidia GPU容器调度能力,但是通常都是将一个GPU卡分配给一个容器。这可以实现比较好的隔离性,确保使用GPU的应用不会被其他应用影响;对于深度学习模型训练的场景非常适合,但是如果对于模型开发和模型预测的场景就会比较浪费。
18244 0
|
安全 Unix Linux
【C/C++ 文件 管理】深入探索Linux 平台 C++中的文件权限不足时的解决方案
【C/C++ 文件 管理】深入探索Linux 平台 C++中的文件权限不足时的解决方案
1028 0
|
Python
雨痕大神的《学习笔记系列》
雨痕大神的《学习笔记》可以在他的GitHub(https://github.com/qyuhen/book)下载,7000+的Star,足以证明认可度。 笔记系列陆陆续续在出版,已出版的有: 《Python 3学习笔记(上卷)》https://www.
4089 0
|
Kubernetes jenkins Java
基于Jenkins和Argocd实现CI/CD(一)
基于Jenkins和Argocd实现CI/CD
基于Jenkins和Argocd实现CI/CD(一)
|
缓存 架构师 Java
java架构师的技术要求
java架构师的技术要求
310 0
|
存储 芯片
内存条和主板的关系是什么?底层原理是什么?
内存条和主板的关系是什么?底层原理是什么?
1794 0