13.k8s包管理工具helm的基本使用

2022-04-13 分类:k8s 阅读(467) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.Helm概述

1.为什么需要Helm

    由于Kubernetes缺少对发布的应用版本管理和控制,使得部署的应用维护和更新等面临诸多的太挑战。主要面临以下问题:
        (1)如何将这些服务作为一个整体管理?
        (2)这些资源文件如何高效复用?
        (3)不支持应用级别的版本管理?

2.Helm介绍

Helm是Kubernetes的包管理工具,就像Linux下的包管理器,如centos系统的yum,Ubuntu系统的apt等,可以方便将之前打包好的yaml文件部署到Kubernetes上。

helm有以下几个重要概念:
    helm:
        一个命令行客户端工具,主要用于kubernetes应用chart的创建,打包,发布和管理。
    chart:
        应用描述,一系列用于描述K8S资源相关文件的集合。
    Release:
        基于Chart的部署实体,一个chart被Helm运行后将会生成对应的一个release;将在K8S中创建出真实运行的资源对象。

3.Helm版本介绍

Helm目前有两个版本,即V2和V3。
    2019年11月Helm团队发布V3版本,相比v2版本最大变化是将Tiller删除,并大部分代码重构。
    helm v3相比helm v2还做了很多优化,比如不同命名空间资源同名的情况在v3版本是允许的,我们在生产环境中使用建议搭建使用v3版本,不仅仅是因为它版本功能较强,而且相对来说也更加稳定了。
    官方地址:
        https://helm.sh/docs/intro/install/
    github地址:
        https://github.com/helm/helm/releases

4.Helm的工作流程概述

helm有以下几个核心功能:
    (1)将变量从"value.yaml"文件中获取,并渲染到chart模板文件中;
    (2)chart模板文件对应的是一系列yaml文件,会基于这些yaml清单来部署应用到kuberntes集群;
    (3)helm也有其对应的Chart仓库,这些公共仓库是一些其他开发或者运维人员编写好的chart,如果他们写的chart在我们工作中能用到就是最好的了;

2.Helm客户端部署

1.下载helm二进制软件包

    使用heml很简单,你只需要下载一个二进制客户端包即可,会通过kubeconfig配置(通常位置在"$HOME/.kube/config")来连接kubernetes集群。
    如下图所示,我们下载最新的helm软件包,下载地址为:"https://github.com/helm/helm/releases"

2.解压helm二进制软件包并配置环境变量

[root@k8s-master helm]# mkdir -pv /helm
[root@k8s-master helm]# tar zxf helm-v3.7.1-linux-amd64.tar.gz -C /helm
[root@k8s-master helm]# ln -sv /helm/linux-amd64/helm /usr/bin/
[root@k8s-master helm]# helm version

3.helm可用命令概述

completion:
        生成命令补全的功能。使用"source <(helm completion bash)"
    create:
        创建一个chart并指定名称。
    dependency:
        管理chart依赖关系。
    env:
        查看当前客户端的helm环境变量信息。
    get:
        下载指定版本的扩展信息。
    help:
        查看帮助信息。
    history:
        获取发布历史记录。
    install:
        安装chart。
    lint:
        检查chart中可能出现的问题。
    list:
        列出releases信息。
    package:
        将chart目录打包到chart存档文件中。
    plugin:
        安装、列出或卸载Helm插件。
    pull:
        从存储库下载chart并将其解包到本地目录。
    repo:
        添加、列出、删除、更新和索引chart存储库。
    rollback:
        将版本回滚到以前的版本。
    search:
        在chart中搜索关键字。
    show:
        显示chart详细信息。
    status:
        显示已有的"RELEASE_NAME"状态。
    template:
        本地渲染模板。
    test:
        运行版本测试。
    uninstall:
        卸载版本。
    upgrade:
        升级版本。
    verify:
        验证给定路径上的chart是否已签名且有效
    version:
        查看客户端版本

4.配置helm命令自动补全

helm completion bash > .helmrc && echo "source .helmrc" >> .bashrc 
source .bashrc

3.Helm工具创建chart

1.Chart的组织结构

chart是一个组织在文件目录中的集合。目录名称就是chart名称(没有版本信息)。

因而描述WordPress的chart可以存储在"wordpress/"目录中。以官方的"wordpress"为例,其包含以下文件内容:
	Chart.yaml
  		一个包含chart的信息。
  		
  	LICENSE
  		包含chart许可证的纯文本文件。
  	
	README.md
  		一个可读的自述文件,通常是给用户看的,以便于用户更加了解该Chart的使用。
  	
	values.yaml
  		定义此chart的默认配置值。
  		
  	values.schema.json  
  		用于在values.yaml文件上施加结构的JSON模式

	charts/
    	包含此Chart的任何图表(chart)的目录。
    	
    crds/
  		自定义资源定义

	templates/         
		模板目录,与values.yaml中的值组合使用,将用来生成Kubernetes清单文件。
	
	templates/NOTES.txt 
		包含简短用法说明的纯文本文件。
		
		
参考链接:
	https://helm.sh/docs/topics/charts/#the-chart-file-structure
	https://helm.sh/zh/docs/topics/charts/#chart-%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84

2.使用helm管理chart的生命周期

(1)创建一个名为"linux"的Chart(默认部署的是nginx 1.16)
[root@k8s-master helm]# mkdir chart
[root@k8s-master helm]# cd chart/
[root@k8s-master chart]# helm create linux 
(2)创建kubernetes命名空间
[root@k8s-master chart]# kubectl create namespace helm 
(3)部署自定义的Chart
[root@k8s-master chart]# helm install my-web01 ./linux -n helm 
(4)查看releases信息和Pod信息
[root@k8s-master chart]# helm list -n helm 
[root@k8s-master chart]# kubectl get pods -n helm  -o wide 
(5)卸载自定义的Chart
[root@k8s-master chart]# helm uninstall my-web01 -n helm 
温馨提示:
    一旦我们卸载了一个Chart,这意味着其创建的K8S资源也将被随之删除,因此生产环境中谨慎操作!

3.使用helm部署wordpress应用-未使用变量文件

###创建一个名为" linux"的Chart
[root@k8s-master helm]# mkdir chart
[root@k8s-master helm]# cd chart/
[root@k8s-master chart]# helm create linux 
###删除模板文件
[root@k8s-master chart]# rm -rf
###自定义部署chart后的提示信息
[root@k8s-master linux]# > values.yaml 
[root@k8s-master linux]# echo "Welcome to my Wordpress" > templates/NOTES.txt
[root@k8s-master linux]# cat Chart.yaml
apiVersion: v2
name: linux
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.0"
#将模板文件放到templates目录下
[root@k8s-master linux]# cd templates/
[root@k8s-master templates]# cat > deployment-mysql.yaml <<EOF
> apiVersion: extensions/v1beta1
> kind: Deployment
> metadata:
>   name: mysql
>   namespace: kube-system
> spec:
>   replicas: 1
>   template:
>     metadata:
>       labels:
>         app: mysql
>     spec:
>       containers:
>       - name: mysql
>         image: mysql:5.7
>         ports:
>         - containerPort: 3306
>         env:
>         - name: MYSQL_ROOT_PASSWORD
>           value: somewordpress
>         - name: MYSQL_DATABASE
>           value: wordpress
>         - name: MYSQL_USER
>           value: wordpress
>         - name: MYSQL_PASSWORD
>           value: wordpress
> EOF
[root@k8s-master templates]# cat > svc-mysql.yaml <<EOF
> apiVersion: v1
> kind: Service   #简称svc
> metadata:
>   name: musql-svc
>   namespace: kube-system
> spec:
>   type: ClusterIP
>   ports:
>     - port: 3306
>       targetPort: 3306    #pod port
>   selector:
>     app: mysql
> EOF
[root@k8s-master templates]# cat > deployment-wordpress.yaml <<EOF
> apiVersion: extensions/v1beta1
> kind: Deployment
> metadata:
>   name: wordpress
> spec:
>   replicas: 1
>   template:
>     metadata:
>       labels:
>         app: wordpress
>     spec:
>       containers:
>       - name: wordpress
>         image: wordpress:latest
>         ports:
>         - containerPort: 80
>         env:
>         - name: WORDPRESS_DB_HOST
>           value: musql-svc.kube-system.svc.cluster.local
>         - name: WORDPRESS_DB_USER
>           value: wordpress
>         - name: WORDPRESS_DB_PASSWORD
>           value: wordpress
> EOF
[root@k8s-master templates]# cat  >  svc-wordpress.yaml  <<EOF
> apiVersion: v1
> kind: Service   #简称svc
> metadata:
>   name: wordpress-svc
> spec: 
>   type: NodePort
>   ports:
>     - port: 80
>       nodePort: 31001
>       targetPort: 80   #pod port
>   selector:
>     app: wordpress
> EOF
###安装咱们自定义的chart
[root@k8s-master templates]# cd ../../
[root@k8s-master chart]# helm install wordpress linux/ -n helm
###查看安装是否成功

4.使用helm部署nginx应用-使用变量文件

###创建一个名为"nginx"的Chart
[root@k8s-master chart]# helm create nginx
###自定义"values.yaml"文件
[root@k8s-master nginx]# cat values.yaml 
school: ["北京","上海","深圳"]
replicas: 3
image: "nginx"
imageTag: "1.13"
###删除无用的文件
[root@k8s-master nginx]# rm -rf templates/*
[root@k8s-master nginx]# cat NOTES.txt 
北京欢迎您......[ 博客地址: https://www.buyao007.icu/ ]
我去过的城市: {{ .Values.school }}, image: [{{ .Values.image }}:{{ .Values.imageTag }}]
###创建资源的配置文件并引用"values.yaml"文件中的变量
[root@k8s-master nginx]# cd templates/
[root@k8s-master templates]# cat > myweb-deployment.yaml << EOF
> apiVersion: apps/v1
> kind: Deployment
> metadata:
>   # 注意哈,此处的".Release.Name"我们并没有在"../values.yaml"文件中定义,该变量表示的是我们在部署chart时指定Release的名称
>   name: {{ .Release.Name }}-deployment
>   namespace: helm
> spec:
>   # 此处我引用的是"../values.yaml"文件中的"replicas"变量
>   replicas: {{ .Values.replicas }}
>   selector:
>     matchLabels:
>       app: mynginx
>   template:
>     metadata:
>       labels:
>         app: mynginx
>     spec:
>       containers:
>       - name: web
>         # 此处我引用的是"../values.yaml"文件中的变量
>         image: {{ .Values.image }}:{{ .Values.imageTag }}
> EOF
[root@k8s-master templates]# cat > myweb-service.yaml << EOF
> apiVersion: v1
> kind: Service
> metadata:
>   name: {{ .Release.Name }}-service
>   namespace: helm
> spec:
>   ports:
>   - port: 80
>     protocol: TCP
>     targetPort: 80
>   selector:
>     app: mynginx
>   type: NodePort
> EOF
###部署服务
[root@k8s-master templates]# cd ../../
[root@k8s-master chart]# helm install web-nginx nginx/ -n helm

5.使用"--dry-run"选项并未真正部署!它会列出要执行的yaml文件内容!

[root@k8s-master chart]# helm  install nginx nginx/ -n helm --dry-run

4.Helm工具升级与回滚Chart的Release

1.基于helm升级Chart的Release概述

为了实现Chart复用,可动态传参修改"values.yaml"文件中的变量值,有以下两种方式:
	--values,-f:
		基于yaml配置文件方式升级Release。
		例如:"helm upgrade  -f values.yaml myweb02 nginx"
	--set:
		基于命令行方式升级Release。例如:"helm upgrade --set imageTag=1.18 myweb02 oldboyedu-nginx"
    如下图所示,对比了基于yaml配置文件和基于命令行方式升级Release的差别。

2.使用helm基于yaml配置文件方式升级Nginx应用

[root@k8s-master nginx]# cat values.yaml 
school: ["北京","上海","深圳"]
replicas: 3
image: "nginx"
imageTag: "1.14"###修改版本为1.14
[root@k8s-master nginx]# helm upgrade -n helm web-nginx ../nginx/

3.使用helm基于命令行方式升级Nginx应用

[root@k8s-master nginx]# helm upgrade --set imageTag=1.15    -n helm web-nginx ../nginx

4.Helm工具回滚Chart的Release

###查看某个Chart的历史发布版本信息
[root@k8s-master nginx]# helm history -n helm web-nginx
###回滚到上一个版本
[root@k8s-master nginx]# helm rollback -n helm web-nginx
###回滚到指定的版本
[root@k8s-master nginx]# helm rollback -n helm web-nginx 1

5.Helm工具公共Chart仓库管理

1.主流的Chart仓库概述

国内Chart仓库,可以直接使用他们制作好的包:
        官方仓库:
            https://hub.kubeapps.com/charts/incubator
        微软仓库:
            http://mirror.azure.cn/kubernetes/charts/
        阿里云仓库:
            https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    添加仓库的方式:
        helm repo list
            查看现有的仓库信息,默认情况下是没有任何仓库地址的
        helm repo add azure http://mirror.azure.cn/kubernetes/charts/ 
            此处我们将微软云的仓库添加到咱们的helm客户端仓库
        helm repo update  
            我们也可以更新仓库信息

2.手动添加微软云和阿里云Chart仓库

(1)未添加存储库之前,先查看仓库信息
helm repo list

(2)添加微软云的Chart仓库repositories
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
(3)添加阿里云的Chart仓库 repositories
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

(4)再次查看仓库信息
helm repo list

(5)更新仓库信息
helm repo update
温馨提示:
	当我们成功添加了存储库后记得更新一下

6.Helm工具私有Chart仓库管理

1.使用docker部署Chartmuseum私有Chart仓库

(1)创建数据持久化目录
mkdir -pv /data/chartmuseum

(2)启动chartmuseum容器
docker container run -d \
  -p 8080:8080 \
  -e DEBUG=1 \
  -e STORAGE=local \
  -e STORAGE_LOCAL_ROOTDIR=/charts \
  -v /data/chartmuseum:/charts \
  --restart always \
  chartmuseum/chartmuseum:latest

(3)使用curl工具访问下接口,没有报错就行,当前仓库内容还是空的
curl http://10.0.0.11:8080/api/charts
推荐阅读:
	https://github.com/helm/chartmuseum

2.准备helm及离线chart,推送到私有库

[root@k8s-master chartmuseum]# helm pull aliyun/redis
[root@k8s-master chartmuseum]# helm pull aliyun/mysql
[root@k8s-master chartmuseum]# curl http://10.0.0.11:8080/api/charts###发现已经有数据了

3.添加私有的仓库并上传自己的chart

[root@k8s-master chartmuseum]# helm repo add sfy-helm http://10.0.0.11:8080/
(1)将自定义的Chart进行打包
[root@k8s-master nginx]# helm package ../nginx/
(2)修改权限,否则执行下一条命令时会报错""
[root@k8s-master nginx]# chmod -R 777 /data
(3)使用 helm cm-push 插件上传自定义Chart
[root@k8s-master nginx]# yum -y install git
[root@k8s-master nginx]# helm plugin install https://gitee.com/jasonyin2020/helm-push.git
[root@k8s-master nginx]# helm cm-push nginx-0.1.0.tgz sfy-helm

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1