目录

一、Helm 简介

1、What is Helm?

2、What Problems did Helm solve?

3、Why Teams Love Helm

1. 管理复杂的应用集合

2. 容易升级

3. 企业内部共享

4. 回滚

4、Helm 相关概念

1. chart

2. Release

3. Tiller Server

4. Helm

5. Repoistory

5、Helm 架构

二、使用Helm

1、Helm 基本操作

1. 安装helm

2. 使用helm

三、Chart简介

1、描述

2、目录名就是 Chart 的名字

四、Chart模板的使用

1、Chart.yaml文件

1. 准备NFS

2. 创建PV

2、Helm 部署mysql

1.安装mysql

2. 查看


一、Helm 简介

1、What is Helm?

1. Helm Charts 是 Kubernetes项目中的一个子项目,该子项目现在托管在github上(https://github.com/kubernetes/helm),目的是提供Kubernetes 的包管理平台

    Helm 能够帮你管理 Kubernetes 的应用集合 

    Helm Charts 能够帮你定义、安装、升级最复杂的Kubernetes 应用集合

官网: Helm

2. Helm Charts 很容易创建,做版本化,共享和发布

    最新版本的Helm 由CNCF 进行维护

    目前在业界已经有大量的公司在使用Helm,其中包括谷歌,微软,Bitnami等大型企业

2、What Problems did Helm solve?

        在K8s 中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源共同协作。

比如安装一个WordPress,用到了一些K8s 的一些资源对象,

包括Deployment、Service、Secret、pv、pvc来提供持久化服务。

并且WordPress 数据时存储在mariadb里面的,需要mariadb 启动就绪后才能启动WordPress。这些k8s资源过于分散,不方便管理,通过kubectl来管理它们将会十分麻烦

所以在k8s中可以使用 Helm 部署一个应用来解决以下几个问题:

        1. 如何统一管理、配置和更新这些分散的k8s 的应用资源文件

        2. 如何分发和复用一套应用模板

        3. 将应用的一系列资源当做一个软件包管理

3、Why Teams Love Helm

1. 管理复杂的应用集合

Charts 能够描述最复杂的应用,提供可重复,幂等性的安装,以及提供统一的认证中心服务

2. 容易升级

为团队提供实时的镜像升级,以及自定义 webhook,解决镜像升级的痛点(可以用helm搭建私有镜像仓库)

3. 企业内部共享

Charts 能够很容易的进行版本化、共享,

在企业内部提供私有Helm 仓库服务,解决了从官方源拉镜像速度慢的痛点

4. 回滚

使用 Helm 可以方便的进行应用的回滚,回到之前的Release 版本

4、Helm 相关概念

1. chart

Helm的打包格式叫做chart,所谓 chart 就是一系列文件,它描述了一组相关的k8s集群资源

2. Release

是chart的部署实例,一个chart 在一个Kubernetes 集群上可以有多个 release

3. Tiller Server

是Helm 的服务端。Tiller 负责接收Helm的请求,与k8s的 apiserver 交互,根据chart 来生成一个release 并管理 release

4. Helm

是一个命令行工具,通过gRPC 协议与Tiller Server 进行交互,主要提供了增删改查 chart、release 和 repository 相关的功能

5. Repoistory

Helm chart 的仓库,Helm 客户端通过HTTP协议来访问存储库中chart 的索引文件和压缩包

5、Helm 架构

1. Helm 客户端Go 编写的,用gRPC协议套件与 Tiller 进行交互

2. Tiller 服务器Go编写的,提供了一个gRPC服务器与客户端连接,使用kubenet客户端与kubernetes 通信,目前该库使用REST + JSON

3. Tiller 服务器把信息存储在kubernetes 中内置的ConfigMaps上,不需要自己的数据库

二、使用Helm

1、Helm 基本操作

1. 安装helm

①. 默认官方提供的方式如果不科学上网无法安装

$ curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null #下载签名并导入
$ sudo apt-get install apt-transport-https --yes #安装支持https
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list             #导入仓库
$ sudo apt-get update          #更新仓库
$ sudo apt-get install helm    #安装helm

②. 使用wget方式去github下载安装(以其中一个版本为例)

可在如下网址寻找需要的版本:Releases · helm/helm (github.com)

$ sudo wget https://get.helm.sh/helm-v3.10.1-linux-amd64.tar.gz #下载安装包
$ tar -zxvf helm-v3.10.1-linux-amd64.tar.gz #解压
$ sudo mv linux-amd64/helm /usr/local/bin/
$ chmod +x /usr/local/bin/helm #为helm增加执行权限
$ helm version    #查看版本
version.BuildInfo{Version:"v3.10.1", GitCommit:"9f88ccb6aee40b9a0535fcc7efea6055e1ef72c9", GitTreeState:"clean", GoVersion:"go1.18.7"}

'默认helm没有补全功能,加入以下命令可完成补全'
source <(helm completion bash)

参考资料: Helm | Installing Helm

2. 使用helm

$ helm version                #查看版本
$ helm search hub wordpress   #hub为公共库

$ helm repo add kaiyuan http://mirror.kaiyuanshe.cn/kubernetes/charts/    #添加仓库,开源社区为例
$ helm repo update            #更新仓库列表
$ helm repo list              #查看仓库
$ helm search repo mysql      #搜索mysql相关

$ helm install kaiyuan/mysql --generate-name #安装musql,生成随机名
$ helm list                   #查看
$ helm uninstall mysql-1653395570    #默认包无法直接使用,先卸载

参考资料: Helm | Using Helm

三、Chart简介

1、描述

Helm的打包格式叫做chart,所谓chart就是一系列文件,它描述了一组相关的k8s集群资源

 

2、目录名就是 Chart 的名字

1. Chart.yaml                包含Chart的基本信息,包括版本、名称(必选)等

2. README.md            可选文件,使用文档

3. templates                  k8s资源的 yaml 模板文件,Helm会将values.yaml 中的参数值注入                                          到模板中生成标准的yaml文件

查阅README.md文件相关需求

## Prerequisites
 19  
 20 - Kubernetes 1.10+ with Beta APIs enabled
 21 - PV provisioner support in the underlying infrastructure    
'提示需求必须要有PV,所以之前pod为pending状态'

文件中介绍的变量可以用value(大量)方式 也可以用--set方式(少量)

参考资料: Helm | Using Helm 

四、Chart模板的使用

1、Chart.yaml文件

提供Charts 相关的各种元数据,他是一个Charts 必备的核心文件

查看命令说明

$ helm inspect values kaiyuan/mysql | less

1. 准备NFS

$ sudo mkdir -m 777 /nfs_{a..b}
$ sudo tee /etc/exports <<EOF
/nfs_a *(rw,no_root_squash)
/nfs_b *(rw,no_root_squash)
EOF
$ sudo apt -y install nfs-kernel-server
$ sudo systemctl enable nfs-server --now
$ showmount -e
Export list for k8s-master:
/nfs_b *
/nfs_a *

2. 创建PV

$ kubectl apply -f- <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pva
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /nfs_a
    server: 192.168.147.102
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pvb
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /nfs_b
    server: 192.168.147.102
EOF
$ kubectl get persistentvolume -o wide
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE   VOLUMEMODE
pva    8Gi        RWO            Recycle          Available                                           41s   Filesystem
pvb    8Gi        RWO            Recycle          Available                                           41s   Filesystem

参考资料:持久卷 | Kubernetes

                  卷 | Kubernetes

2、Helm 部署mysql

1.安装mysql

$ helm install test kaiyuan/mysql

2. 查看

$ kubectl get pods | grep mysql
test-mysql-f4b787c8f-sfrxp                1/1     Running                  0                  2m58s

$ kubectl get pvc    #再次查看PVC已经绑定
NAME         STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-mysql   Bound    pva      8Gi        RWO                           7m12s

$ helm status test #查看test信息
NAME: test
LAST DEPLOYED: Thu Oct 13 06:50:02 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
test-mysql.default.svc.cluster.local

To get your root password run:

    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default test-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) '可以查看密码'

To connect to your database:

1. Run an Ubuntu pod that you can use as a client:

    kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il #进入pod

2. Install the mysql client:

    $ apt-get update && apt-get install mysql-client -y    #安装mysql

3. Connect using the mysql cli, then provide your password:
    $ mysql -h test-mysql -p    #进入mysql

To connect to your database directly from outside the K8s cluster:
    MYSQL_HOST=127.0.0.1
    MYSQL_PORT=3306

    # Execute the following command to route the connection:
    kubectl port-forward svc/test-mysql 3306

    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
$ kubectl get secret --namespace default test-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
yuOWs8lXGo

$ kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
If you don't see a command prompt, try pressing enter.'

root@ubuntu:/# mysql -h test-mysql -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 952
Server version: 5.7.30 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐