Kubernetes的包管理工具Helm

版权声明: https://blog.csdn.net/Andriy_dangli/article/details/86649496

简介

Helm是一个管理Kubernetes的chart包的工具,像centos7中的yum命令管理rpm包一样。

使用Helm:

  • 发现使用helm管理的chart软件包部署应用到kubernetes集群
  • 通过chart共享应用
  • 创建可重复的kubernetes应用程序
  • 灵活管理kubernetes manifests files
  • 管理helm软件包的版本发布

Helm相关的概念

  • Helm:helm的client端,主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
  • Tiller:helm的server端,用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
  • Chart:一个 Chart 是一个 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。把它想像为一个自制软件,一个 Apt dpkg 或一个 Yum RPM 文件的 Kubernetes 环境里面的等价物。
  • Repository:一个 Repository 是 Charts 收集和共享的地方。它就像 yum仓库,保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
  • Release:一个 Release 是处于 Kubernetes 集群中运行的 Chart 的一个实例。一个 chart 通常可以多次安装到同一个群集中。每次安装时,都会创建一个新 release 。比如像一个 MySQL chart。如果希望在群集中运行两个数据库,则可以安装该 chart 两次。每个都有自己的 release,每个 release 都有自己的 release name。

Helm工作原理

在这里插入图片描述
Chart Install 过程:

  1. Helm从指定的目录或者tgz文件中解析出Chart结构信息
  2. Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
  3. Tiller根据Chart和Values生成一个Release
  4. Tiller将Release发送给Kubernetes用于生成Release

Chart Update过程:

  1. Helm从指定的目录或者tgz文件中解析出Chart结构信息
  2. Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
  3. Tiller生成Release并更新指定名称的Release的History
  4. Tiller将Release发送给Kubernetes用于更新Release

Chart Rollback过程:

  1. Helm将要回滚的Release的名称传递给Tiller
  2. Tiller根据Release的名称查找History
  3. Tiller从History中获取上一个Release
  4. Tiller将上一个Release发送给Kubernetes用于替换当前Release

安装部署

1、Helm客户端安装

# 下载二进制文件
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux-amd64.tar.gz
# 解压:
tar -zxf helm-v2.12.2-linux-amd64.tar.gz
# 拷贝helm执行文件
mv linux-amd64/helm /usr/bin/

2、安装Helm服务端Tiller

# stable-repo-url是存放chart包的仓库
helm init --upgrade --tiller-image fishead/gcr.io.kubernetes-helm.tiller:v2.11.0 --stable-repo-url http://10.0.0.91:18088/

卸载tiller:helm reset -f && rm -rf /root/.helm

常用操作

1、设置helm命令自动补全

source <(helm completion bash)
echo "source <(helm completion bash)" >> ~/.bashrc

2、查看仓库

helm repo list
    NAME  	URL                                             
    stable	https://kubernetes-charts.storage.googleapis.com
    local 	http://127.0.0.1:8879/charts

3、update仓库

helm repo update
    Hang tight while we grab the latest from your chart repositories...
    ...Skip local chart repository
    ...Successfully got an update from the "stable" chart repository
    Update Complete. ⎈ Happy Helming!⎈

4、删除仓库

helm repo remove stable

5、添加仓库

# 不需要认证
helm repo add stable https://kubernetes-charts.storage.googleapis.com
# 需要认证
helm repo add andriy http://chartmuseum:[email protected]:28088

6、查看仓库中的chart

helm search

7、安装第一个chart应用

# 安装mariadb
helm install stable/mariadb
# 查看chart应用的release信息
helm status pruning-buffoon

8、查看已经安装的chart

helm list
    NAME           	REVISION	UPDATED                 	STATUS  	CHART              	APP VERSION	NAMESPACE
    gauche-dingo   	1       	Wed Jan 23 15:41:43 2019	FAILED  	nginx-ingress-1.1.5	0.21.0     	default  
    pruning-buffoon	1       	Wed Jan 23 15:45:29 2019	DEPLOYED	mariadb-5.5.0      	10.1.37    	default

9、删除chart应用

helm delete gauche-dingo
	release "gauche-dingo" deleted

10、更新应用

  • 更新Chart.yaml中的应用版本
    apiVersion: v1
    appVersion: "1.0"
    description: A Helm chart for Kubernetes
    name: nginx
    version: 0.2.0
  • 更新values.yaml中应用的镜像版本
    # Default values for nginx.
    # This is a YAML-formatted file.
    # Declare variables to be passed into your templates.
    
    replicaCount: 1
    
    image:
      repository: nginx
      tag: alpine
      pullPolicy: IfNotPresent
    
    nameOverride: ""
    fullnameOverride: ""
    
    service:
      type: ClusterIP
      port: 80
    
    ingress:
      enabled: false
      annotations: {}
        # kubernetes.io/ingress.class: nginx
        # kubernetes.io/tls-acme: "true"
      paths: []
      hosts:
        - chart-example.local
      tls: []
      #  - secretName: chart-example-tls
      #    hosts:
      #      - chart-example.local
    
    resources: {}
      # We usually recommend not to specify default resources and to leave this as a conscious
      # choice for the user. This also increases chances charts run on environments with little
      # resources, such as Minikube. If you do want to specify resources, uncomment the following
      # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
      # limits:
      #  cpu: 100m
      #  memory: 128Mi
      # requests:
      #  cpu: 100m
      #  memory: 128Mi
    
    nodeSelector: {}
    
    tolerations: []
    
    affinity: {}
  • 打包应用,并移动到指定位置
    helm package nginx/
    
    mv nginx-0.2.0.tgz /opt/data/chartmuseum/
  • 更新chart仓库
    helm repo index --url http://chartmuseum:[email protected]:28088 .
    
    helm repo update
  • 升级应用
    helm upgrade chart-test andriy/nginx --version=0.2.0
  • 查看应用历史版本
    helm history chart-test
  • 回退应用
    helm rollback chart-test 1

Chart详解

1、Chart目录结构

examples/
  Chart.yaml          # Yaml文件,用于描述Chart的基本信息,包括名称版本等
  LICENSE             # [可选] 协议
  README.md           # [可选] 当前Chart的介绍
  values.yaml         # Chart的默认配置文件
  requirements.yaml   # [可选] 用于存放当前Chart依赖的其它Chart的说明文件
  charts/             # [可选]: 该目录中放置当前Chart依赖的其它Chart
  templates/          # [可选]: 部署文件模版目录,模版使用的值来自values.yaml和由Tiller提供的值
  templates/NOTES.txt # [可选]: 放置Chart的使用指南

2、Chart.yaml文件

name: [必须] Chart的名称
version: [必须] Chart的版本号,版本号必须符合 SemVer 2:http://semver.org/
description: [可选] Chart的简要描述
keywords:
  -  [可选] 关键字列表
home: [可选] 项目地址
sources:
  - [可选] 当前Chart的下载地址列表
maintainers: # [可选]
  - name: [必须] 名字
    email: [可选] 邮箱
engine: gotpl # [可选] 模版引擎,默认值是gotpl
icon: [可选] 一个SVG或PNG格式的图片地址

3、requirements.yaml文件

dependencies:
  - name: example
    version: 1.2.3
    repository: http://example.com/charts
  - name: Chart名称
    version: Chart版本
    repository: 该Chart所在的仓库地址

Chart支持两种方式表示依赖关系,可以使用requirements.yaml或者直接将依赖的Chart放置到charts目录中。

4、template目录

templates目录中存放了Kubernetes部署文件的模版。

# db.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: deis-database
  namespace: deis
  labels:
    heritage: deis
spec:
  replicas: 1
  selector:
    app: deis-database
  template:
    metadata:
      labels:
        app: deis-database
    spec:
      serviceAccount: deis-database
      containers:
        - name: deis-database
          image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}}
          imagePullPolicy: {{.Values.pullPolicy}}
          ports:
            - containerPort: 5432
          env:
            - name: DATABASE_STORAGE
              value: {{default "minio" .Values.storage}}

模版语法扩展了 golang/text/template的语法:

# 这种方式定义的模版,会去除test模版尾部所有的空行
{{- define "test"}}
模版内容
{{- end}}
 
# 去除test模版头部的第一个空行
{{- template "test" }}

用于yaml文件前置空格的语法:

# 这种方式定义的模版,会去除test模版头部和尾部所有的空行
{{- define "test" -}}
模版内容
{{- end -}}
 
# 可以在test模版每一行的头部增加4个空格,用于yaml文件的对齐
{{ include "test" | indent 4}}

5、创建自己的Chart

helm create nginx
tree nginx/
    nginx/
    |-- charts					# 依赖的chart
    |-- Chart.yaml				# 定义Chart的版本及名称
    |-- templates				# 配置模板信息
    |   |-- deployment.yaml		 # kubernetes deployment objects
    |   |-- _helpers.tpl		 # 用于修改kubernetes objects配置模板
    |   |-- ingress.yaml		
    |   |-- NOTES.txt			# Helm的提示信息
    |   |-- service.yaml		# kubernetes service
    |   `-- tests
    |       `-- test-connection.yaml
    `-- values.yaml				# kubernetes deployment 的配置信息

3 directories, 8 files

6、部署Chart到kubernetes中

# 进入到chart的目录
helm install .

可以通过kubernetes get pod获取Pod IP,curl Pod_IP可以测试不是的nginx应用

7、打包分享你创建的Chart

helm package .
helm package nginx --save=false

8、将Chart发布到本地Repository

# 将打包好的chart包防放置私有库的存储位置
mv nginx-0.1.0.tgz /opt/data/chartmuseum/
# 更新index.html文件
helm repo index --url http://chartmuseum:[email protected]:28088 .
# 更新repo
helm repo update
# 查找发布的chart
helm search nginx
    NAME                       	CHART VERSION	APP VERSION	DESCRIPTION                        
    andriy/nginx               	0.1.0        	1.0        	A Helm chart for Kubernetes       
    local/nginx                	0.1.0        	1.0        	A Helm chart for Kubernetes
# 使用发布的chart部署应用到kubernetes
helm install --name=chart-test andriy/nginx --namespace=test

9、搭建私有的Chart Repository

docker run -d --name=chartmuseum -p 28088:8080 -e PORT=8080 -e DEBUG=1 -e STORAGE="local" -e STORAGE_LOCAL_ROOTDIR="/data" -e BASIC_AUTH_USER="chartmuseum" -e BASIC_AUTH_PASS="chartmuseum" -v /opt/data/chartmuseum:/data chartmuseum/chartmuseum

猜你喜欢

转载自blog.csdn.net/Andriy_dangli/article/details/86649496