Bootstrap

Helm的资源安装和基本使用

目录

一.Helm的出现

二.Helm工具

1.部署helm

2.helm可用命令介绍

三.chart

1.添加、查看、删除存储库

2.查找chart、查看chart信息、安装chart等

3.安装chart后产生的release

四.安装mysql举例

1.固定chart安装

2.自定义chart安装


 

一.Helm的出现

在前面的k8s部署pod等资源的学习中,多数通过yaml文件进行部署,最多的也就部署七八个yaml文件共同搭配,但是像一些应用需要几十个yaml文件一起生效那么我们写起来、改起来并且配起来的复杂度就变高了,我们就需要一个工具去将这些资源整合成我么要部署的应用从而可以更方便地部署这个应用并实现yanl文件高可用减少复杂度,这种情况下就需要用到helm(类似于yum/dnf)。

二.Helm工具

helm一个命令行客户端工具(需要自行安装的),主要用于 Kubernetes 应用 chart (后面会提及)的创建、打包、发布和管理等

1.部署helm

下载包并解压将helm文件拷贝或移动/usr/local/bin下并配置命令补全

链接:https://pan.baidu.com/s/1NuckrYWQJJrsph3oBFcCpw 
提取码:dg3o

[root@k8s-master ~]# wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz
[root@k8s-master ~]# tar -zxvf helm-v3.12.3-linux-amd64.tar.gz
[root@k8s-master linux-amd64]# ll
total 49428
-rwxr-xr-x 1 1001 docker 50597888 Aug 11  2023 helm
-rw-r--r-- 1 1001 docker    11373 Aug 11  2023 LICENSE
-rw-r--r-- 1 1001 docker     3397 Aug 11  2023 README.md
[root@k8s-master linux-amd64]# cp helm /usr/local/bin/
[root@k8s-master linux-amd64]# helm completion bash > ~/.helmrc
[root@k8s-master linux-amd64]# source ~/.helmrc
[root@k8s-master linux-amd64]# helm version
version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}

2.helm可用命令介绍

#helm --help
Usage:
  helm [command]
​
Available Commands:
  completion  为指定的shell生成自动补全脚本
  create      创建一个指定了名称的chart
  dependency  管理chart依赖
  env         Helm客户端环境信息
  get         下载release,可接all、hooks、manifest、notes、values
               all-获取所有已安装的release的信息。名称、状态、版本等
               hooks-获取指定 release 的 pre-install、post-install、pre-delete 和 post-delete 钩子的信息
               manifest-获取指定 release 的 Kubernetes 资源清单(manifest)。这个选项会显示 Helm chart 渲染后生成的所有 Kubernetes 资源清单,包括 Deployment、Service、ConfigMap 等资源的详细配置
               notes-获取指定 release 的笔记(notes)。这个选项会显示与 Helm chart 关联的任何备注或说明,通常包括有关如何访问应用程序、配置细节或其他相关信息
               values-获取指定 release 的配置值(values)。这个选项会显示 Helm chart 中定义的所有配置值,包括默认值和用户自定义的配置值,帮助了解release内的配置
  help        获取对后面命令的帮助
  history     获取发布历史
  install     安装一个chart
  lint        检查图表中可能存在的问题
  list        列出release
  package     将chart目录存档
  plugin      安装、列出或卸载Helm插件
  pull        从远程仓库下载chart并解压
  push        将chart推到远程
  registry    从注册表登录或注销
  repo        添加、列表、删除、更新和索引chart存储库
  rollback    版本回滚
  search      查找chart,可用hub或repo
  show        查看chart详细信息,可用all、chart、readme、values
  status      显示已命名版本的状态
  template    本地呈现模版
  test        运行测试
  uninstall   卸载release
  upgrade     更新release
  verify      验证给定路径上的图表是否已签名且有效
  version     查看版本信息

三.chart

用来描述k8s资源的文件集合,接下来进行配置chart资源存储库(对于资源库主要使用helm repo)和chart的一些操作。这里又设计到一个概念release(基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个release,将在 k8s 中创建出真实运行的资源对象。)

1.添加、查看、删除存储库

[root@k8s-master helm]# helm repo add stable http://mirror.azure.cn/kubernetes/charts
#微软
[root@k8s-master helm]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#阿里云
[root@k8s-master helm]# helm repo list
NAME    URL                                                   
stable  http://mirror.azure.cn/kubernetes/charts              
aliyun  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@k8s-master helm]# helm search repo stable  #列出改存储库中所有的资源清单
​
[root@k8s-master helm]# helm repo list    #删除指定名称存储库
NAME    URL                                                   
stable  http://mirror.azure.cn/kubernetes/charts              
aliyun  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
bitnami https://charts.bitnami.com/bitnami                
[root@k8s-master helm]# helm repo remove bitnami
"bitnami" has been removed from your repositories
[root@k8s-master helm]# helm repo list
NAME    URL                                                   
stable  http://mirror.azure.cn/kubernetes/charts              
aliyun  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

2.查找chart、查看chart信息、安装chart等

[root@k8s-master helm]# helm search repo stable/mysql   #可以指定存储库也可以不指定
[root@k8s-master helm]# helm search repo mysql
​
[root@k8s-master helm]# helm show chart stable/mysql    #查看具体某个chart的信息
apiVersion: v1
appVersion: 5.7.30
deprecated: true
description: DEPRECATED - Fast, reliable, scalable, and easy to use open-source relational
  database system.
home: https://www.mysql.com/
icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
keywords:
- mysql
- database
- sql
name: mysql
sources:
- https://github.com/kubernetes/charts
- https://github.com/docker-library/mysql
version: 1.6.9
​
[root@k8s-master helm]# helm install my-mysql stable/mysql  
#安装chart,格式为helm install 安装到本机的名称 (存储库)/chart名称
​
[root@k8s-master helm]# helm status my-mysql   #获取发布状态,这里面的额信息会告诉你的安装完成后如何获取所需参数,如安装的mysql机会提示你获取临时登录密码和外部访问方式等
​
[root@k8s-master helm]# helm show values stable/mysql   #使用此命令查看安装完成后需要配置的PV等,如mysql的就需要你配置一个8Gi的PV,因为你安装过后会产生一个pvc,但是缺少pv,你要创建好合适的pv并且和pvc成功绑定后,pod和svc才能正常使用
## Persist data to a persistent volume
persistence:
  enabled: true
  ## database data Persistent Volume Storage Class
  ## If defined, storageClassName: <storageClass>
  ## If set to "-", storageClassName: "", which disables dynamic provisioning
  ## If undefined (the default) or set to null, no storageClassName spec is
  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
  ##   GKE, AWS & OpenStack)
  ##
  # storageClass: "-"
  accessMode: ReadWriteOnce
  size: 8Gi
  annotations: {}

3.安装chart后产生的release

[root@k8s-master helm]# helm list
NAME        NAMESPACE   REVISION    UPDATED                                 STATUS      CHART       APP VERSION
my-mysql    default     1           2024-03-17 10:07:52.665967704 +0800 CST deployed    mysql-1.6.9 5.7.30     

四.安装mysql举例

1.固定chart安装

(1)安装mysql

 [root@k8s-master helm]# helm install db stable/mysql
 To get your root password run:
    #获取临时登录密码
    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default my-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
​
2. Install the mysql client:
​
    $ apt-get update && apt-get install mysql-client -y
​
3. Connect using the mysql cli, then provide your password:
    $ mysql -h my-mysql -p
​
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/my-mysql 3306
​
    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
    #外部连接方式

(2)查看pod和svc状态

[root@k8s-master helm]# kubectl  get pods,svc
NAME                           READY   STATUS    RESTARTS   AGE
pod/my-mysql-b6999b8b5-h6vlr   0/1     Pendding   0         22m
​
NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP    4h23m
service/my-mysql     ClusterIP   10.106.24.9   <none>        3306/TCP   4h22m
​
#pod处于Pendding状态,describe一下pod查看问题所在,如下这种问题就是缺少存储等条件
Warning FailedScheduling 2m default-scheduler 0/4 nodes are available:
4 pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are
available: 3 Preemption is not helpful for scheduling.
​
#查看有没有pvc请求,然后进去查看到是有一个8Gi的pvc的(也可用通过上面提到的使用helm show values stable/mysql查看到),但是我们现在并没有pv去给他绑定,所以先创建一个符号需求的pv,查看绑定状态
[root@k8s-master helm]# kubectl get pvc my-mysql -o yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    meta.helm.sh/release-name: my-mysql
    meta.helm.sh/release-namespace: default
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
  creationTimestamp: "2024-03-17T02:07:53Z"
  finalizers:
  - kubernetes.io/pvc-protection
  labels:
    app: my-mysql
    app.kubernetes.io/managed-by: Helm
    chart: mysql-1.6.9
    heritage: Helm
    release: my-mysql
  name: my-mysql
  namespace: default
  resourceVersion: "1478"
  uid: e6456c1d-f4ea-44e3-9372-6fd875d81e9f
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  volumeMode: Filesystem
  volumeName: mysql
status:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 8Gi
  phase: Bound
​
[root@k8s-master helm]# cat mysql-pv.yaml    #pvc和pv已绑定
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql
spec:
  capacity:
    storage: 8Gi 
  accessModes:
  - ReadWriteOnce
  nfs:
    path: /root/helm/share
    server: 192.168.2.150
[root@k8s-master helm]# ll
total 15660
-rw-r--r-- 1 root    root   16028423 Aug 11  2023 helm-v3.12.3-linux-amd64.tar.gz
drwxr-xr-x 2    1001 docker       50 Aug 11  2023 linux-amd64
-rw-r--r-- 1 root    root        191 Mar 17 10:13 mysql-pv.yaml
drwxr-xr-x 5 polkitd root        314 Mar 17 14:59 share
[root@k8s-master helm]# cat /etc/exports
/root/helm/share 192.168.2.0/24(rw,no_root_squash)
​
[root@k8s-master helm]# kubectl  get pvc,pv
NAME                             STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/my-mysql   Bound    mysql    8Gi        RWO                           4h29m
​
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS   REASON   AGE
persistentvolume/mysql   8Gi        RWO            Retain           Bound    default/my-mysql                           4h23m
​
​
[root@k8s-master helm]# kubectl  get pods    #pod运行起来了
NAME                       READY   STATUS    RESTARTS   AGE
my-mysql-b6999b8b5-h6vlr   1/1     Running   0          4h30m

(3)获取临时密码并进入pod测试是否能够登录  

[root@k8s-master helm]# kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
dwcyEybl7l
​
[root@k8s-master helm]# kubectl  get pods,svc 
NAME                           READY   STATUS    RESTARTS   AGE
pod/my-mysql-b6999b8b5-h6vlr   1/1     Running   0          4h34m
​
NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP    4h35m
service/my-mysql     ClusterIP   10.106.24.9   <none>        3306/TCP   4h34m
[root@k8s-master helm]# kubectl exec -it my-mysql-b6999b8b5-h6vlr -- /bin/bash 
Defaulted container "my-mysql" out of: my-mysql, remove-lost-found (init)
root@my-mysql-b6999b8b5-h6vlr:/# mysql -uroot -p'dwcyEybl7l'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3245
Server version: 5.7.30 MySQL Community Server (GPL)
​
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
​
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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
​
mysql>
​
​
[root@k8s-master helm]# kubectl  get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
my-mysql-b6999b8b5-h6vlr   1/1     Running   0          4h37m   10.244.36.65   k8s-node1   <none>           <none>
#在k8s-node1这个node上进行登录测试
[root@k8s-node1 ~]# mysql -h 10.106.24.9 -P3306 -uroot -p   #使用my-mysql的clusterip+端口
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3226
Server version: 5.7.30 MySQL Community Server (GPL)
​
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
​
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
​
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

(4)集群外部navicat也可登录的配置测试

[root@k8s-master helm]# kubectl edit svc my-mysql  #将svc的type改为NodePort,如果还有特定端口需求请自行添加指定端口号
service/my-mysql edited
[root@k8s-master helm]# kubectl  get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP          4h42m
my-mysql     NodePort    10.106.24.9   <none>        3306:31641/TCP   4h41m

使用k8s-node1的宿主机地址+nodeport映射的端口号登录

 d88dbab2622c421db6b5ac15dd088fae.png

04e88c683a834bfb9730cf9dc1603075.png

2.自定义chart安装

通过-f指定yaml配置文件或者在命令行通过set来设定安装前你需要指定的参数,请注意,以下的my-mysql-config.yaml等内容都是可以在helm show values stable/mysql中查询到的

(1)同样是定义好nfs共享存储信息和所需pv

[root@k8s-master helm]# tail -1 /etc/exports
/root/helm/share1 192.168.2.0/24(rw,no_root_squash)
[root@k8s-master helm]# kubectl  apply -f mysql-pv.yaml 
persistentvolume/mysql created
[root@k8s-master helm]# kubectl  get pv 
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mysql   8Gi        RWO            Retain           Available                                   10s

(2)创建好要自定义的参数等

[root@k8s-master helm]# cat my-mysql-config.yaml 
persistence:
  enabled: true
  accessMode: ReadWriteOnce
  size: 8Gi
mysqlUser: "sulibao"
mysqlPassword: "sulibao"
mysqlRootPassword: "sulibao"
mysqlDatabase: "k8s"
​
[root@k8s-master helm]# helm install my-mysql -f my-mysql-config.yaml stable/mysql  #pod直接运行成功
[root@k8s-master helm]# kubectl  get pods,svc
NAME                            READY   STATUS    RESTARTS   AGE
pod/my-mysql-56856b55c7-cj76j   1/1     Running   0          60s
​
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP    5h6m
service/my-mysql     ClusterIP   10.103.197.187   <none>        3306/TCP   60s

(3)进入pod测试配置的参数是否正确

[root@k8s-master helm]# kubectl exec -it my-mysql-56856b55c7-cj76j -- /bin/bash
Defaulted container "my-mysql" out of: my-mysql, remove-lost-found (init)
​
root@my-mysql-56856b55c7-cj76j:/# mysql -uroot -psulibao
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.7.30 MySQL Community Server (GPL)
​
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
​
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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| k8s                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)
​
mysql> select user from mysql.user;
+---------------+
| user          |
+---------------+
| root          |
| sulibao       |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
5 rows in set (0.01 sec)
​
mysql> 

(4)此外是可以通过set来进行替换参数的

如上使用yaml文件进行安装的就可以改为这样

[root@k8s-master helm]# helm install my-mysql \
> --set persistence.enabled=true \
> --set persistence.size=8Gi \
> --set mysqlUser="sulibao" \
> --set mysqlPassword="sulibao" \
> --set mysqlRootPassword="sulibao" \
> --set mysqlDatabase="k8s" stable/mysql

 

;