kubernetes helm(软件库)

发布时间:2024年01月09日

写在前面:如有问题,以你为准,

目前24年应届生,各位大佬轻喷,部分资料与图片来自网络

内容较长,页面右上角目录方便跳转

介绍

为什么需要 Helm ?

  • Kubernetes 上的应用对象,都是由特定的资源描述组成,包括 Deployment、Service 等,都保存在各自的文件中或者集中写在一个配置文件,然后通过

kubectl apply -f 部署。

  • 如果应用只由一个或几个这样的服务组成,上面的部署方式就足够了。
  • 但是对于一个复杂的应用,会有很多类似上面的资源描述文件,如:微服务架构应用,组成应用的服务可能多达几十、上百个,如果有更新或回滚应用的需求,可能要修改和维护所涉及到大量的资源文件,而这种组织和管理应用的方式就显得力不从心了。并且由于缺少对发布过的应用进行版本管理和控制,使得 Kubernetes 上的应用维护和更新面临诸多的挑战,主要面临以下的问题:
    • ① 如何将这些服务作为一个整体管理?
    • ② 这些资源文件如何高效复用?
    • ③ 应用级别的版本如何管理?

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

官网:Helm

查看 Helm 和对应支持的 Kubernetes 版本

Helm本质就是让K8s的应用管理(Deployment,Service等)可配置,能动态生成。通过动态生成K8s资源清单文件(deployment.yaml,service.yaml)。然后调用Kubectl自动执行K8s资源部摆

Helm是官方提供的类似于YUM的包管理器,是部署环境的流程封装。Helm有两个重要的概念:chart和release

· chart 是创建一个应用的信总集合,包括各种Kubernetes对象的配置程板、参数定义、依赖关系。文档说明等。chart是应用部署的自包含逻辑单元。可以将chart想象成apt,yum中的软件安装包

· release 是chart的运行实例,代表了一个正在运行的应用。当chart被安装到Kubernetes集群,就生成一个release。chart能够多次安装到同一个集群,每次安装都是一个release

helm:是一个命令行客户端工具 chart:把yaml打包,是yaml集合 release:基于chart部署实体,应用级别的版本管理 安装包中会有的文件 templates 目录 其中包括所有需要部署的资源 values.yaml 用于自定义全局变量,比如修改生成服务中的labels,yaml高效复用有解释 Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。 可以类比 Docker 来理解,Chart 就类似于 Docker 中的镜像(Docker 中的镜像就是一系列文件的集合,Chart 也是一系列文件的集合),Repository(仓库)就类似于 Docker Hub,Release 就类似于 Docker 中的容器(可以根据镜像 run 多个容器)

Helm v3 变化

2019年11月13日,He1m团队发布He1mv3的第一个稳定版本。

该版本主要变化如下:

架构变化:

1:最明显的变化是Tiller的删除

2:release 可以在不同的命名空间重用

3:将chart 推送到 docker 仓库中

部署

Releases · helm/helm · GitHub

[root@master helm]# tar -xf helm-v3.11.2-linux-amd64.tar.tar
[root@master helm]# ls
helm-v3.11.2-linux-amd64.tar.tar  linux-amd64
[root@master helm]# cd linux-amd64/
[root@master linux-amd64]# ls
helm  LICENSE  README.md
[root@master linux-amd64]# cp helm /bin/

helm 命令补全

helm completion bash | sudo tee /etc/bash_completion.d/helm > /dev/null、
source /usr/share/bash-completion/bash_completion

完整 chart 实操(重点)

helm create mychat

vim values.yaml

# snj-2023-3-15
namespace: study

deployment:
  replicas: 2
  pod_labels: test-nginx
  image: nginx
  imageTag: 1.17.1
  containerPort: 80
service:
  type: NodePort
  port: 80
  protocol: TCP
  targetPort: 80

vim templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-helm-deployment-{{ .Release.Revision}}
  namespace: {{ .Values.namespace }}
  labels:
    name: {{ .Release.Name }}-helm-deployment
spec:
  replicas: {{.Values.deployment.replicas}}
  selector:
    matchLabels:
      app: {{ .Values.deployment.pod_labels }}
  template:
    metadata:
      labels:
        app: {{.Values.deployment.pod_labels}}
    spec:
      containers:
      - name: {{.Values.deployment.image}}
        image: {{.Values.deployment.image}}:{{.Values.deployment.imageTag}}
        ports:
        - containerPort: {{.Values.deployment.containerPort}}

vim templates/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-helm-service-{{ .Release.Revision}}
  namespace: {{.Values.namespace}}
spec:
  selector:
    app: {{.Values.deployment.pod_labels}}
  type: NodePort
  ports:
  - port: {{.Values.service.port}}
    protocol: {{.Values.service.protocol}}
    targetPort: {{.Values.service.targetPort}}
[root@master helm]# helm install snjhelm-deploy mychat/
NAME: snjhelm-deploy
LAST DEPLOYED: Wed Mar 15 02:52:03 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

[root@master helm]# kubectl get deploy,svc,pod -n study
NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/snjhelm-deploy-helm-deployment-1   2/2     2            2           118s

NAME                                    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/snjhelm-deploy-helm-service-1   NodePort   10.108.22.53   <none>        80:32010/TCP   118s

NAME                                                    READY   STATUS    RESTARTS   AGE
pod/snjhelm-deploy-helm-deployment-1-756dcb987f-c4jqr   1/1     Running   0          118s
pod/snjhelm-deploy-helm-deployment-1-756dcb987f-kws96   1/1     Running   0          118s

[root@master helm]# curl master:32010
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
....

升级和回滚

将镜像升级为1.17.2

# 修改 values.yaml 文件
imageTag: 1.17.2
# 当前版本为 1
[root@master mychat]# helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
snjhelm-deploy  default         1               2023-03-15 06:57:19.980287774 -0400 EDT deployed        mychat-0.1.0    1.16.0
# 使用helm upgrade 升级
[root@master helm]# helm upgrade snjhelm-deploy mychat/ -f mychat/values.yaml
Release "snjhelm-deploy" has been upgraded. Happy Helming!
NAME: snjhelm-deploy
LAST DEPLOYED: Wed Mar 15 06:59:12 2023
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
[root@master helm]# helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
snjhelm-deploy  default         2               2023-03-15 06:59:12.06664233 -0400 EDT  deployed        mychat-0.1.0    1.16.0
[root@master helm]# kubectl get deploy,svc,pod -n study
NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/snjhelm-deploy-helm-deployment-2   2/2     2            2           65s
# 可以看到尾部从1变为了2,因为template中使用了内置对象
NAME                                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/snjhelm-deploy-helm-service-2   NodePort   10.107.84.190   <none>        80:31593/TCP   65s

NAME                                                   READY   STATUS    RESTARTS   AGE
pod/snjhelm-deploy-helm-deployment-2-b5565d58b-lt852   1/1     Running   0          65s
pod/snjhelm-deploy-helm-deployment-2-b5565d58b-mhqgg   1/1     Running   0          65s
[root@master helm]# kubectl get pod -n study snjhelm-deploy-helm-deployment-2-b5565d58b-lt852 -o yaml | grep image
  - image: nginx:1.17.2
    imagePullPolicy: IfNotPresent
    image: nginx:1.17.2
    imageID: docker-pullable://nginx@sha256:5411d8897c3da841a1f45f895b43ad4526eb62d3393c3287124a56be49962d41

将实例回滚

[root@master helm]# helm rollback snjhelm-deploy
Rollback was a success! Happy Helming!
[root@master helm]# helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
snjhelm-deploy  default         3               2023-03-15 07:02:54.964646589 -0400 EDT deployed        mychat-0.1.0    1.16.0
[root@master helm]# helm history snjhelm-deploy
REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION
1               Wed Mar 15 06:57:19 2023        superseded      mychat-0.1.0    1.16.0          Install complete
2               Wed Mar 15 06:59:12 2023        superseded      mychat-0.1.0    1.16.0          Upgrade complete
3               Wed Mar 15 07:02:54 2023        deployed        mychat-0.1.0    1.16.0          Rollback to 1

基本操作

chart 存储库

添加存储库

helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://apphub.aliyuncs.com

配置国内源

  • 阿里云仓库(https://kubernetes.oss cn hangzhou.aliyuncs.com/charts)
  • 官方仓库(Kubeapps | Home )官方 chart 仓库,国内 可能无法访问。
  • 微软仓库(Index of /kubernetes/charts/ charts/)这个仓库推荐,基本上官网有的 chart这里都有国内可能无法访问。
  • 某些服务会有自己的存储库,去查服务安装文档

查看配置的存储库

helm repo list
helm search repo stable

删除存储库:

helm repo remove aliyun

更新存储库

helm repo update

创建 chart

# mychat 包名,会在当前目录下创建一个目录
helm create mychat
[root@master mysql]# helm create mychart
Creating mychart
[root@master mysql]# ls
config.yaml  mychart

[root@master mysql]# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
# templates 目录下的资源可以自定义,一定要有charts,Chart.yaml,templates

基本示例(创建与安装)

删除自创模板文件

[root@master mysql]# cd mychart/
[root@master mychart]# ls
charts  Chart.yaml  templates  values.yaml
[root@master mychart]# cd templates/
[root@master templates]# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
[root@master templates]# rm -rf *
[root@master templates]# ls # 为空

[root@master templates]# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "snj hello world"
[root@master mysql]# helm install myconfigmap mychart/
NAME: myconfigmap
LAST DEPLOYED: Mon Mar 13 03:20:42 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master mysql]# helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
myconfigmap     default         1               2023-03-13 03:20:42.957495566 -0400 EDT deployed        mychart-0.1.0   1.16.0
[root@master mysql]# helm get manifest myconfigmap
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "snj hello world"
[root@master mysql]# kubectl get configmap
NAME                DATA   AGE
kube-root-ca.crt    1      38d
mychart-configmap   1      2m19s

引用变量(内置对象)(高效复用)

[root@master mychart]# cat templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: {{ .Values.MY_YALUE }}
# {{ .Release.Name }}    
    # 在 yaml 中 {{}} 是引用变量
    # 最前面的 . 从作用域最顶层命名空间开始
    #   即:在顶层命名空间中开始查找Release对象,再查找Name对象
    # 就是通过内置对象获取内置对象的变量值(Release的名称)作为拼接configmap的名字
# {{ .Values.MY_YALUE }}
    # 引用 valuse.yaml 文件中的MY_YALUE值
    # 在 valuse.yaml 有定义

修改 valuse.yaml

[root@master mychart]# cat values.yaml
MY_YALUE: TEST-2

安装与查看

[root@master mysql]# helm install snj-2 mychart/
NAME: snj-2
LAST DEPLOYED: Mon Mar 13 04:09:38 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master mysql]# helm list
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART          APP VERSION
snj-2   default         1               2023-03-13 04:09:38.892606241 -0400 EDT deployed        mychart-0.1.0  1.16.0
[root@master mysql]# kubectl get configmaps
NAME               DATA   AGE
kube-root-ca.crt   1      38d
snj-2-configmap    1      19s
[root@master mysql]# kubectl describe configmaps snj-2-configmap
Name:         snj-2-configmap
Namespace:    default
Labels:       app.kubernetes.io/managed-by=Helm
Annotations:  meta.helm.sh/release-name: snj-2
              meta.helm.sh/release-namespace: default

Data
====
myvalue:
----
TEST-2

BinaryData
====

Events:  <none>

子 chart

需要注意子 chart 的重要细节:

  • 子chart被认为是“独立的”,意味着子chart从来不会显示依赖它的父chart。
  • 因此,子chart无法访问父chart的值。
  • 父chart可以覆盖子chart的值。
  • Helm有一个

全局值 的概念,所有的chart都可以访问

查看 chart

# 查看 weave 安装包
helm search repo weave # 在所有仓库中查找 chart
helm search aliyun weave # 从指定 chart 仓库地址查找 chart

# 检查chart(目录、文件或URL)并显示所有的内容(values.yaml, Chart.yaml, README)
helm show all [Chart_Name]
# 检查chart(目录、文件或URL)并显示Chart.yaml文件的内容
helm show chart [Chart_Name]
# 检查chart(目录、文件或URL)并显示values.yaml文件的内容
helm show values [Chart_Name]
# 检查chart(目录、文件或URL)并显示README文件内容
helm show readme [Chart_Name] [flags]


# 查看已经安装的包
helm list
    -n 是指定命名空间
    -A 是所有命名空间
[root@master helm]# helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
snjhelm-deploy  default         3               2023-03-15 07:02:54.964646589 -0400 EDT deployed        mychat-0.1.0    1.16.0
# NAMESPACE 显示的是install chart 时候指定的命名空间,不代表资源部署的命名空间
# 包的详细信息
helm status weave

安装 chart

# 安装 mysql
helm install [NAME] [CHART] 
helm install db1 stable/mysql
    # 指定命名空间
    helm install db1 -n study stable/mysql
# 安装本地
helm install db1 /root/mysql
# 查看已部署的release templates 部署文件
helm get manifest db1
  • 每执行一次 install 命令,就会形成一个 release 。
    • 每当您执行?helm install?的时候,都会创建一个新的发布版本。 所以一个chart在同一个集群里面可以被安装多次,每一个都可以被独立的管理和升级
  • mysql 是有状态的应用,如果要想执行成功,必须设置持久化存储,并设置默认的动态供应
[root@master helm]# helm install db1 stable/mysql
WARNING: This chart is deprecated
NAME: db1
LAST DEPLOYED: Mon Mar 13 02:34:38 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
db1-mysql.default.svc.cluster.local

To get your root password run:

    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default db1-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 db1-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/db1-mysql 3306

    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
[root@master helm]# kubectl get pod
NAME                         READY   STATUS    RESTARTS      AGE
db1-mysql-85f9dbd684-m9r28   0/1     Pending   0             14s
nginx                        1/1     Running   1 (22h ago)   3d18h
[root@master helm]# kubectl get deployments.apps
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
db1-mysql   0/1     1            0           73s
[root@master helm]# helm list
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART          APP VERSION
db1     default         1               2023-03-13 02:34:38.844361003 -0400 EDT deployed        mysql-1.6.9    5.7.30

注意上面的示例是因为没有pvc而启动不起来

安装方式

  • helm install 命令可以从多个来源安装:
  • ① chart 存储库。
  • ② 本地 chart 压缩包。
  • ③ chart 目录。
  • ④ 完整的 URL。

从本地 chart 压缩包安装 chart

helm install db mysql-1.6.9.tgz
helm install db http://mirror.azure.cn/kubernetes/charts/mysql-1.6.9.tgz

安装测试

helm install <release-name> <本地目录或repo源> --debug --dry-run

卸载 chart

[root@master helm]# helm uninstall db1
release "db1" uninstalled

拉取 chart

来取可以对vlues和template进行修改和自定义

# 拉取下来的包是压缩包,可以使用下面的参数来解压
# --untar 表示下载并解压,当前目录
helm pull stable/mysql --untar
# --version 指定版本,上面那个不指定即为最新版本
helm pull stable/mysql --version --untar

查看 release ?实例

# 查看已经安装的包,查看 release 列表
helm list
    -n 是指定命名空间
    -A 是所有命名空间
# 包的详细信息
helm status weave

状态包括:
    最后部署时间
    发布版本所在的k8s命名空间
    发布状态(可以是: unknown, deployed, uninstalled, superseded, failed, uninstalling, pending-install, pending-upgrade 或 pending-rollback)
    发布版本修订
    发布版本描述(可以是完成信息或错误信息,需要用--show-desc启用)
    列举版本包含的资源,按类型排序
    最后一次测试套件运行的详细信息(如果使用)
    chart提供的额外的注释

升级 release 实例


helm upgrade release实例名 chart名--set imageTag=1.19
    # 指定release名和chart名进行相关set设置的升级
helm upgrade release实例名 chart名-f/.../mychart/values.yaml
    # 指定release示例名和chart名和values.yaml文件升级
示例:
helm upgrade test-release-nginx mychart--set imageTag=1.19
# 更新 values.yaml 的 imageTag 变量
helm upgrade test-release-nginx mychart -f /root/mychart/values.yaml 
# 更新 整个 values.yaml

回滚 release 实例

helm rollback release实例名
 # 指定release实例名,回滚到上一个版本
helm rollback release实例名 版本号
 
# 指定release实例名,回滚到指定版本,注意版本号是release的版本号,不是镜像版本号
# release的版本号 回滚也会增加一次版本号
示例:
helm rollback web-nginx
helm rollback web-nginx 1.17.10

获取历史 release 实例

helm history release实例名
示例:
helm history test
#test为release 实例名
[root@master helm]# helm history snjhelm-deploy
REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION
1               Wed Mar 15 06:57:19 2023        superseded      mychat-0.1.0    1.16.0          Install complete
2               Wed Mar 15 06:59:12 2023        superseded      mychat-0.1.0    1.16.0          Upgrade complete
3               Wed Mar 15 07:02:54 2023        deployed        mychat-0.1.0    1.16.0          Rollback to 1
# DESCRIPTION 这是可以看到是怎么产生这次版本的

常用命令

命令

描述

create

创建一个chart并指定名字

dependency

管理chart依赖

get

下载一个release。可用的子命令:all、hooks、manifest、notes、values。

history

获取release历史。

install

安装一个chart。

list

列出release。

package

将chart目录打包到chart存档文件中。

pull

从远程仓库中下载chart并解压到本地。比如:helm install stable/mysql --untar。

repo

添加、列出、移除、更新和索引chart仓库。可用的子命令:add、index、list、remove、update。

rollback

从之前的版本回退。

search

根据关键字搜索chart。可用的子命令:all、chart、readme、values。

show

查看chart的详细信息。可用的子命令:all、chart、readme、values。

status

显示已命名版本的状态。

template

本地呈现模板。

uninstall

卸载一个release。

upgrade

更新一个release。

version

查看Helm客户端版本。

自定义values配置选项(values.yaml)

使用 -f

上面已经安装了weave包,从中可以看到 values.yaml 文件,也可以进行导出

helm show values stable/mysql > config.yaml
1、在values.yam1定义变量和值
2、在具体yaml文件,获取定义变量值
yaml文件大体有几个地方不同的
    * image
    * tag
    * label
    * port
    * replicas

也可以直接进行覆盖

-- 修改部分
persistence:
  enabled: true
  accessMode: ReadWriteOnce
  size: 8Gi

mysqlUser: "k8s"
mysqlPassword: "123456"
mysqlDatabase: "k8s"

引用修改后的vlues.yaml

helm install db stable/mysql -f config.yaml

修改完可以进行测试

helm install  web2 mychart --dry-run=client 

使用 --set

修改其中的存储类,且修改完后进行安装

helm install db --set persistence.storageClass="nfs-client" stable/mysql

helm pull

或者安装的时候指定目录

# --untar 表示下载并解压,当前目录
helm pull stable/mysql --untar

文章来源:https://blog.csdn.net/weixin_48297181/article/details/135410975
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。