1 Helm

1.1 前言

Helm的官方网站Helm的github地址 在没有使用Helm之前,向kubernetes部署应用,我们依次需要编写deployment、service、ingress等yaml文件,然后还需要依次进行部署,步骤比较繁琐。随着项目的微服务化,复杂的应用在容器中部署以及管理显得较为复杂。因此Helm通过打包的方式生成Char模板,然后install Char模板生成release,支持发布的版本管理和控制,很大程度上简化了kubernetes应用的部署和管理。



1.2 Helm的简单介绍

Helm的本质就是让k8s的应用管理(Deployment、Service)可配置,能够动态生成。通过动态生成k8s资源清单文件,然后调用kubectl命令自动执行k8s资源部署。

我们可以将Helm看作Kubernetes下的apt-get/yum。Helm是Deis 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。

对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。对于使用者而言,使用Helm后不用需要了解Kubernetes的yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用,同时进行少量的配置即可。

除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。

Helm还可以结合Jenkins进行CI、CD进行自动化、流水线构建项目,可以将我们大量重复的步骤省略,节约时间。

Helm的作用有以下几点:

  • 快速安装常用应用:许多大公司都有helm仓库,为我们提供了许多优质的应用,可以直接拉取安装,如快速部署Redis集群、安装Jenkins等。
  • 多环境部署:通常我们需要多套环境,如开发环境、测试环境、生产环境等,helm可以通过模板+变量的形式实现快速部署。
  • 运维与开发隔离:运维人员治理k8s资源,写部署模板及默认设置;开发职员只需要提供少量设置即可,把精力主要集中在开发上。


1.3 Helm的下载和安装

1.3.1 Helm的下载

进入到helm的github地址 ,点击tags

harmonyOs 的源码很简单 helm源码_docker


点击最新版本进行下载

harmonyOs 的源码很简单 helm源码_harmonyOs 的源码很简单_02


Installation and Upgrading下选择Linux amd64版本进行下载 如果谷歌浏览器下载的速度太慢,可以尝试使用迅雷下载。


1.3.2 Helm的安装

下载完成之后将压缩包上传到k8s-master01中,进行解压

[root@k8s-master01 ~]# tar -zxvf helm-v3.3.3-linux-amd64.tar.gz 
linux-amd64/
linux-amd64/helm
linux-amd64/LICENSE
linux-amd64/README.md
#将helm命令移动到/usr/bin目录下
[root@k8s-master01 ~]# mv linux-amd64/helm /usr/bin/

检测是否安装成功

[root@k8s-master01 ~]# helm version
version.BuildInfo{Version:"v3.3.3", GitCommit:"55e3ca022e40fe200fbc855938995f40b2a68ce0", GitTreeState:"clean", GoVersion:"go1.14.9"}

到此Helm的安装结束,Helm的安装还是非常简单的。



1.3 Helm的基本原理

1.3.1 基本概念

Helm中有四大基本概念:helm客户端、Char、Repository、Release

  • helm客户端:主要是命令行,负责管理本地的Charts、repositories,发送Chart,实例安装、查询、卸载等操作。
  • Chart:是创建一个应用的信息集合,包括各种Kubernetes对象的配置模板、参数定义、依赖关系、文档说明等,形成一个压缩包.tar。Char是应用部署的自包含逻辑单元。可以将Chart想象成apt、yum中的软件安装包,同时Char模板可以发布到专门的repository。
  • Repository: Chart仓库。类似于docker的镜像仓库,可以使用Harbor作为Chart的仓库。
  • Release:release是Chart运行的实例,使用helm install命令在Kubernetes集群中部署的Chart就生成了一个Release。一个Chart能够多次安装到同一个集群,每次安装都是一个Release。Release基于名称空间进行隔离。


1.3.2 基本原理

Helm3的架构

harmonyOs 的源码很简单 helm源码_docker_03


Helm Client一般而言是命令行工具,使用helm添加完Char仓库repository之后,然后执行helm install repo_name/char_name release_name命令。helm客户端会去Char仓库查找是否存在Char模板,如果存在就下载下来。然后helm客户端根据Char模板以及参数,动态生成资源清单文件,helm client使用本地的kube config配置文件去连接k8s集群,然后调用k8s集群提供的api,创建或者是删除资源。至此通过操作helm客户端就完成了k8s上资源的创建和销毁。


1.4 Helm的基本使用

1.4.1 设置helm和kubernetes的自动补全

设置helm命令自动补全
为了方便helm命令的使用,helm提供了自动补全功能,如果使用bash请执行:

source <(helm completion bash)

若没有下载自动补全命令,请先下载,然后重启系统

yum install bash-completion -y

如果仅仅执行上述命令是不能达到我们预期的,当新开一个 bash 终端后是不能自动补全的,这就需要我们再做些配置,具体的就是将上述命令写到 /etc/profile 或者 ~/.bashrc 文件下。

#将source <(helm completion bash)追加到.bashrc文件中。
[root@k8s-master01 ~]# echo "source <(helm completion bash)" >> ~/.bashrc

如果你是用的是xshell,将当前shell窗口断开连接

harmonyOs 的源码很简单 helm源码_linux_04

Connection closed.

Disconnected from remote host(k8s-master01) at 19:11:29.

重新连接

harmonyOs 的源码很简单 helm源码_kubernetes_05

Type `help' to learn how to use Xshell prompt.
[c:\~]$ 

Connecting to 192.168.1.180:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Sun Sep 27 19:09:01 2020 from 192.168.1.1
#按下tab,看到helm已经出现了
[root@k8s-master01 ~]# he
head     helm     help     hexdump

可以看到helm自动补全生效了。

设置kubectl的自动补全

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



1.4.2 Helm的命令详解

查看helm的命令帮助

[root@k8s-master01 ~]# helm --help
Usage:
  helm [command]

Available Commands:
  completion  generate autocompletions script for the specified shell
  create      create a new chart with the given name
  dependency  manage a chart's dependencies
  env         helm client environment information
  get         download extended information of a named release
  help        Help about any command
  history     fetch release history
......

Flags:
      --add-dir-header                   If true, adds the file directory to the header
      --alsologtostderr                  log to standard error as well as files
      --debug                            enable verbose output
  -h, --help                             help for helm
      --kube-apiserver string            the address and the port for the Kubernetes API server
      --kube-context string              name of the kubeconfig context to use
      --kube-token string                bearer token used for authentication
      --kubeconfig string                path to the kubeconfig file
......
Use "helm [command] --help" for more information about a command.

从上面可以看到Helm的命令有三类,分别对应repo、Chart、release。

repo:

  • helm repo list 列举出添加的repository仓库
  • helm repo add [RepoName] [RepoUrl] 添加仓库
  • helm repo update 更新仓库

Chart:

  • helm search 查找可用的Chart模板
  • helm pull, fetch [chart URL | repo/chartname] 下载指定的Chart包到本地
  • helm install
  • helm create 创建自己的Chart模板
  • helm lint PATH 检查自定义的Chart模板是否正确
  • helm package 打包Chart,一般是一个压缩包文件
  • helm show, inspect [command] 查看关于chart的信息,如定义信息、README和values.yaml文件内容 [command]包含all、chart、readme、values等资源

release: release基于namespace进行隔离

  • helm list, ls 列出已经部署的Release
  • helm delete [RELEASE] 删除一个Release。
  • helm status [RELEASE] 查看指定的Release信息。
  • helm upgrade 升级某个Release。
  • helm rollback [RELEASE] [REVISION] 回滚Release到指定发布版本。
  • helm get values [RELEASE] 查看Release的配置文件值。
  • helm history [RELEASE] 查看某个release的升级记录


1.4.2 对repo的基本操作

查看helm repo命令的帮助文档

[root@k8s-master01 ~]# helm repo -h
Usage:
  helm repo [command]

Available Commands:
  add         add a chart repository
  index       generate an index file given a directory containing packaged charts
  list        list chart repositories
  remove      remove one or more chart repositories
  update      update information of available charts locally from chart repositories
  1. 添加一个Char仓库

命令格式:helm repo add [NAME] [URL] [flags]

一般而言建议添加谷歌官方的Char仓库,不建议添加阿里云的Char仓库。因为阿里云的Char仓库非常老,很少更新,很多Char模板都没有。

[root@k8s-master01 ~]# helm repo add stable https://kubernetes-charts.storage.googleapis.com
"stable" has been added to your repositories
[root@k8s-master01 ~]# helm repo add azure http://mirror.azure.cn/kubernetes/charts/
"azure" has been added to your repositories
  1. 查看添加的repo
[root@k8s-master01 ~]# helm repo list
NAME     	URL                                                                    
stable   	https://kubernetes-charts.storage.googleapis.com/
azure    	http://mirror.azure.cn/kubernetes/charts/
  1. 删除某个仓库

helm repo remove [REPO1 [REPO2 …]] [flags] 可以批量删除添加的repo

[root@k8s-master01 ~]# helm repo remove azure
"azure" has been removed from your repositories
#查看添加的仓库是否被删除
[root@k8s-master01 ~]# helm repo list 
NAME     	URL                                                                           
stable   	https://kubernetes-charts.storage.googleapis.com
  1. 更新Char仓库
[root@k8s-master01 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈

一般而言添加完仓库之后,最好执行一下该命令。等待大概1分钟后更新完成。



1.4.3 对Char模板的操作

  1. 搜索repo中的Chart模板

命令格式: helm search repo [repo_name/]chart_name
其中repo_name是可选的,如果不写就是在所有仓库中查找对应的Chart模板
写了repo_name就在指定的repo中查找对应的Chart模板

下面查找wordpress这个Chart模板

[root@k8s-master helm]# helm search repo azure/wordpress
NAME            CHART VERSION   APP VERSION     DESCRIPTION
azure/wordpress 9.0.3           5.3.2           DEPRECATED Web publishing platform for building...
[root@k8s-master helm]# helm search repo wordpress
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
apphub/wordpress        8.1.3           5.3.2           Web publishing platform for building blogs and ...
azure/wordpress         9.0.3           5.3.2           DEPRECATED Web publishing platform for building...
stable/wordpress        9.0.3           5.3.2           DEPRECATED Web publishing platform for building...
  1. 下载repo中的Chart模板

命令格式: helm pull, fetch [chart URL | repo/chartname]

下面下载azure/wordpress这个Chart模板

[root@k8s-master helm]# helm pull azure/wordpress
[root@k8s-master helm]# ll
总用量 12136
drwxr-xr-x 3 root root       25 1月   7 11:03 chart
-rw-r--r-- 1 root root 12378363 6月  23 2021 helm-v3.5.4-linux-amd64.tar.gz
-rw-r--r-- 1 root root    41859 1月   7 14:52 wordpress-9.0.3.tgz

会将对应的Chart模板下载到本地磁盘上

  1. 查看Chart模板的详细信息,如readme、values等

命令格式: helm show command

[root@k8s-master helm]# helm show all azure/wordpress
apiVersion: v1
appVersion: 5.3.2
dependencies:
- condition: mariadb.enabled
  name: mariadb
  repository: https://kubernetes-charts.storage.googleapis.com/
  tags:
  - wordpress-database
  version: 7.x.x
deprecated: true
...

该命令会查看Chart的所用信息如values、readme、description等内容

  1. 自定义Chart模板、打包Chart模板

命令格式: helm create chart_name
                helm package

接下来创建一个名为nginx-myapp的Chart模板,本质上是创建了一系列的文件和文件夹。

[root@k8s-master01 helm]# helm create nginx-myapp
Creating nginx-myapp
[root@k8s-master01 helm]# ll
总用量 0
drwxr-xr-x 4 root root 88 9月  27 19:35 nginx-myapp
#如果没tree命令,可以先进行下载
[root@k8s-master01 helm]# yum install -y tree
[root@k8s-master01 helm]# tree
.
└── nginx-myapp
    ├── charts
    ├── Chart.yaml
    ├── templates
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── hpa.yaml
    │   ├── ingress.yaml
    │   ├── NOTES.txt
    │   ├── serviceaccount.yaml
    │   ├── service.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml

4 directories, 10 files

可以看到在当前路径下创建了一个nginx-myapp的文件夹。同时使用tree命令查看nginx-myapp文件夹中的内容。

下面详细解释和说明这些文件和文件夹

  • .helmignore 类似于gitignore文件,忽略部分提交的文件,该文件可以省略。
  • charts:目录里存放这个chart依赖的所有子chart。
  • Chart.yaml:用于描述这个 Chart的基本信息,包括名字、描述信息以及版本等。
  • Templates: 文件夹里面存放所有yaml模板文件。
  • deployment.yaml 核心资源订单文件,包括定义工作负载、镜像等。
  • _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用。
  • hpa.yaml:自动扩容和缩容的文件,一般不使用。
  • ingress.yaml:定义ingress资源的文件。
  • NOTES.txt :用于介绍Chart帮助信息,helm install部署后展示给用户。例如:如何使用这个 Chart、列出缺省的设置等。
  • serviceaccount.yaml:pod的访问api-server服务的凭证。
  • service.yaml:定义pod的访问方式的资源文件。
  • values.yaml :用于存储 templates 目录中模板文件中用到变量的值。核心文件

接下来使用helm lint chart_directory_path命令检测Chart模板语法是否正确

[root@k8s-master helm]# helm lint nginx-myapp/
==> Linting nginx-myapp/
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed

正确无误后,使用helm package chart_directory命令生成压缩包--version参数可以指定生成Chart模板的版本,如果不设置就是Chart.yaml中定义得version版本号

[root@k8s-master helm]# helm package nginx-myapp/ --version 2.0.0
Successfully packaged chart and saved it to: /root/k8s/helm/nginx-myapp-2.0.0.tgz
[root@k8s-master helm]# ll
总用量 12140
drwxr-xr-x 3 root root       25 1月   7 11:03 chart
-rw-r--r-- 1 root root 12378363 6月  23 2021 helm-v3.5.4-linux-amd64.tar.gz
drwxr-xr-x 4 root root       93 1月   7 15:25 nginx-myapp
-rw-r--r-- 1 root root     3604 1月   7 15:36 nginx-myapp-2.0.0.tgz
-rw-r--r-- 1 root root    41859 1月   7 14:52 wordpress-9.0.3.tgz

关于Chart模板语法可以参照官方文档Chart模板指南



1.4.4 对release的操作

  1. 接下来我们基于刚才打包生成的Chart模板生成release

命令格式:helm install [NAME] [CHART] [flags]
flags常见参数有

  • -f或者–values 后面跟上配置文件的路径,覆盖Chart模板中的value.yaml文件中的值
  • –set 覆盖Chart模板中的value.yaml文件中的值,例如–set k1=v1 --set k2=v2
  • -n 将release创建在哪个namespace下
  • –dry-run或者–debug 打印输出所有定义的资源清单文件,不创建相应的k8s资源
[root@k8s-master helm]# helm install mynginx nginx-myapp-2.0.0.tgz --set image.repository=wangyanglinux/myapp --set image.tag=v1
NAME: mynginx
LAST DEPLOYED: Fri Jan  7 16:08:52 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
2. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "/name=nginx-myapp,/instance=mynginx" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

解释说明:

  • 上面的命令创建了一个名为mynginx的release,同时使用--set参数覆盖image.repository和image.tag这两个参数的值
  • 后面输出的内容是NOTES文件中的内容

关于可以配置哪些value,可以使用helm show values命令查看Chart模板中可配置选项

[root@k8s-master helm]# helm show values nginx-myapp-2.0.0.tgz
# Default values for nginx-myapp.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: ""

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

......
  1. 查看release的状态

如果后面仍然想看NOTES文件中的内容可以使用helm status命令,同时可以查看release的状态

命令格式:helm status RELEASE_NAME [flags]

[root@k8s-master helm]# helm status mynginx
NAME: mynginx
LAST DEPLOYED: Fri Jan  7 16:21:39 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
5. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "/name=nginx-myapp,/instance=mynginx" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
  1. 对于release的列举、升级、回滚和删除
  • 对于release的列举

命令格式:helm ls, list [flags]

[root@k8s-master helm]# helm ls
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
mynginx default         1               2022-01-07 16:21:39.351601019 +0800 CST deployed        nginx-myapp-2.0.0       1.16.0

可以看到刚才创建的myngix这个release,默认是创建在default名称空间下
查看一下helm创建的k8s资源

[root@k8s-master helm]# kubectl get pod,deploy,rs -o wide
NAME                                       READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
pod/mynginx-nginx-myapp-66cc857687-hx5w2   1/1     Running   0          12m   10.244.1.4   k8s-node01   <none>           <none>

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS    IMAGES                   SELECTOR
deployment.apps/mynginx-nginx-myapp   1/1     1            1           12m   nginx-myapp   wangyanglinux/myapp:v1   /instance=mynginx,/name=nginx-myapp

NAME                                             DESIRED   CURRENT   READY   AGE   CONTAINERS    IMAGES                   SELECTOR
replicaset.apps/mynginx-nginx-myapp-66cc857687   1         1         1       12m   nginx-myapp   wangyanglinux/myapp:v1   /instance=mynginx,/name=nginx-myapp,pod-template-hash=66cc857687

接下来我们访问一下这个pod,上面的命令中的ip为10.244.1.4

[root@k8s-master helm]# curl 10.244.1.4/hostname.html
mynginx-nginx-myapp-66cc857687-hx5w2
[root@k8s-master helm]# curl 10.244.1.4
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

分别访问得到了hostname和镜像的版本是v1

  • 升级release

命令格式:helm upgrade [RELEASE] [CHART] [flags]
常见的flags参数

  • –install 如果release没有被创建过就创建
  • –description 可以添加一些描述信息,为什么进行升级,在helm history命令中查看description描述信息
  • –create-namespace 如果--install参数被设置了,当对应的namespace不存在时,直接创建
  • –dry-run 进行调试,并不真正执行
  • –set 更新values.yaml文件中的值,例如–set k1=v1 --set k2=v2
  • -f, --values 使用文件中的值更新values.yaml文件中的值

接下来更新镜像版本

[root@k8s-master helm]# helm upgrade mynginx nginx-myapp-2.0.0.tgz --set image.repository=wangyanglinux/myapp --set image.tag=v2 --description "镜像版本升级到v2"
Release "mynginx" has been upgraded. Happy Helming!
NAME: mynginx
LAST DEPLOYED: Fri Jan  7 16:48:25 2022
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "/name=nginx-myapp,/instance=mynginx" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
[root@k8s-master helm]# helm ls
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
mynginx default         2               2022-01-07 16:48:25.089320961 +0800 CST deployed        nginx-myapp-2.0.0       1.16.0
[root@k8s-master helm]# kubectl get pod -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
mynginx-nginx-myapp-66cc857687-qbwn2   1/1     Running   0          49s   10.244.1.4   k8s-node02   <none>           <none>
mynginx-nginx-myapp-769787d8db-mjt2b   0/1     Running   0          10s   10.244.1.5    k8s-node01   <none>           <none>
[root@k8s-master helm]# kubectl get pod -o wide
NAME                                   READY   STATUS        RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
mynginx-nginx-myapp-66cc857687-qbwn2   0/1     Terminating   0          54s   10.244.1.4   k8s-node02   <none>           <none>
mynginx-nginx-myapp-769787d8db-mjt2b   1/1     Running       0          15s   10.244.1.5    k8s-node01   <none>           <none>
[root@k8s-master helm]# curl 10.244.1.5/hostname.html
mynginx-nginx-myapp-769787d8db-mjt2b
[root@k8s-master helm]# curl 10.244.1.5/
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

可以看到镜像的版本变成了v2

使用helm history命令查看release的版本

[root@k8s-master helm]# helm history mynginx
REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Fri Jan  7 16:47:46 2022        superseded      nginx-myapp-2.0.0       1.16.0          Install complete
2               Fri Jan  7 16:48:25 2022        superseded      nginx-myapp-2.0.0       1.16.0          镜像版本升级到v2

DESCRIPTION列中就是--description参数中定义的内容

  • 回滚release
    处于某些业务需求需要回滚release到指定的版本

命令格式:helm rollback [REVISION] [flags]
其中REVISION可以在release升级历史记录中查找,执行helm history命令即可

回滚mynginx这个release到REVISION 1

[root@k8s-master helm]# helm rollback mynginx 1
Rollback was a success! Happy Helming!
[root@k8s-master helm]# helm status mynginx
NAME: mynginx
LAST DEPLOYED: Fri Jan  7 17:18:10 2022
NAMESPACE: default
STATUS: deployed
REVISION: 3
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "/name=nginx-myapp,/instance=mynginx" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
[root@k8s-master helm]# helm history mynginx
REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Fri Jan  7 17:14:06 2022        superseded      nginx-myapp-2.0.0       1.16.0          Install complete
2               Fri Jan  7 17:14:19 2022        superseded      nginx-myapp-2.0.0       1.16.0          镜像版本升级到v2
3               Fri Jan  7 17:18:10 2022        deployed        nginx-myapp-2.0.0       1.16.0          Rollback to 1
[root@k8s-master helm]# kubectl get pod -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
mynginx-nginx-myapp-66cc857687-sdf4c   1/1     Running   0          32s   10.244.1.4   k8s-node02   <none>           <none>
[root@k8s-master helm]# curl 10.244.1.4
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master helm]# helm get values mynginx
USER-SUPPLIED VALUES:
image:
  repository: wangyanglinux/myapp
  tag: v1

解释说明:

  • helm rollback mynginx 1命令,将mynginx这个release回滚到REVISION 1,同时可以看到新的REVISION版本是3,并不是1
  • helm history mynginx命令,看到REVISION 3的DESCRIPTION描述是Rollback to 1
  • 重新访问pod,发现镜像版本是v1
  • helm get values mynginx命令是查看配置的值

接下来是删除操作

  • 删除release

命令格式:helm uninstall, un, delete, del RELEASE_NAME […] [flags]

下面删除mynginx这个release

[root@k8s-master helm]# helm uninstall mynginx
release "mynginx" uninstalled
[root@k8s-master helm]# helm ls
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION
[root@k8s-master helm]# helm ls --uninstalled
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION
[root@k8s-master helm]# kubectl get pod
No resources found in default namespace.



2 使用Helm部署常见的应用

前面已经介绍了Helm的概念、安装、基本使用,接下来就用Helm安装几个常见的应用,一起来感受下Helm强大的功能。

2.1 部署、测试nfs-client-provisioner

之前创建的PV都是静态PV,是提前创建好的PV,可供PVC进行绑定。如果每次都要手动创建PV,那样太麻烦了。
我们可以创建一个StorageClass,然后在定义PVC时,声明使用自定义的StorageClass,然后根据PVC动态地创建PV。PVC然后去绑定PV,这样就省去了每次需要手工创建PV的麻烦。



2.1.1 安装NFS服务器

在k8s-master01上安装nfs服务器

#在k8s-master01节点安装NFS服务器
[root@k8s-master01 helm]# yum install -y nfs-common nfs-utils  rpcbind
[root@k8s-master01 helm]# mkdir /nfs && chmod 777 /nfs
[root@k8s-master01 helm]# chown nfsnobody /nfs
[root@k8s-master01 helm]# cat > /etc/exports << EOF
/nfs *(rw,no_root_squash,no_all_squash,sync)
EOF
#启动nfs
[root@k8s-master01 helm]# systemctl start rpcbind && systemctl start nfs-server
#设置开启自启
[root@k8s-master01 helm]# systemctl enable rpcbind && systemctl enable nfs-server

在k8s-node01、k8s-node02安装客户端工具

[root@k8s-node01 helm]# yum install -y nfs-utils
[root@k8s-node01 helm]# systemctl start nfs-utils && systemctl enable nfs-utils



2.1.2 部署nfs-client-provisioner动态创建PV

在日常学习kubernetes时,经常需要使用把一些数据(例如:数据库、日志等)存储起来,不随着容器的删除而丢失,也就是说一些pod需要持久化存储。对于需要持久化的工作负载可以声明一个pvc,然后需要有合适的pv可供绑定。现在可以使用helm部署nfs-client-provisioner,可以根据pvc(在资源清单中需要storeageClass定义为nfs-client-provisioner)动态地创建pv。存储卷的实现有很多种,此处选择比较容易实现的NFS作为存储。

可以访问 nfs-client-provisioner地址里面有关于配置的详细说明。

安装nfs-client-provisioner

[root@k8s-master01 helm]# helm install nfs-client-provisioner stable/nfs-client-provisioner --set nfs.server=x.x.x.x --set nfs.path=/xxxx --set storageClass.defaultClass=true

上面的命令创建一个release实例、配置nfs-server地址、挂载的路径、设置为默认的class

查看创建的nfs-client-provisioner

[root@k8s-master01 nfs-client-provisioner]# helm list
NAME                  	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART                       	APP VERSION
nfs-client-provisioner	default  	1       	2020-09-23 15:04:48.690645046 +0800 CST	deployed	nfs-client-provisioner-1.2.9	3.1.0

查看storageclass

[root@k8s-master01 nfs]# kubectl get sc
NAME                   PROVISIONER                            AGE
nfs-client (default)   cluster.local/nfs-client-provisioner   63m

这里default的含义是当定义pvc时,不声明storageClassName时,就会使用默认的default。

查看nfs-client-provisioner对应的Pod

[root@k8s-master01 nfs-client-provisioner]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-6999f4847d-ck52d   1/1     Running   0          34m



2.1.3 测试能否根据pvc动态创建pv

创建一个pvc检测能否动态创建pv,并且绑定到pv中

[root@k8s-master01 nfs]# cat > test-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-nfs-pvc
spec:
  accessModes:
  - ReadWriteMany
  storageClassName: nfs-client
  resources:
    requests:
      storage: 1Gi
EOF

storageClassName: 需要定义为刚刚创建的nfs-client。这里不写也可以,因为已经将default设置为了nfs-client。

创建pvc,查看能否动态创建pv,pvc能够绑定到对应的pv上。

[root@k8s-master01 nfs]# kubectl apply -f test-pvc.yaml 
persistentvolumeclaim/test-nfs-pvc created
[root@k8s-master01 nfs]# kubectl get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE
persistentvolume/pvc-f5207723-c172-4076-bedb-f603115230eb   1Gi        RWX            Delete           Bound    default/test-nfs-pvc   nfs-client              6s

NAME                                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/test-nfs-pvc   Bound    pvc-f5207723-c172-4076-bedb-f603115230eb   1Gi        RWX            nfs-client     6s

这里动态创建了一个pv,可以看到PVC处于Bound的状态。
查看/nfs文件夹下的内容。这里的/nfs为使用helm创建nfs-client的release实例时设置的nfs.path的值

[root@k8s-master01 nfs]# ls -l /nfs
总用量 0
drwxrwxrwx 2 root root 6 9月  23 16:03 default-test-nfs-pvc-pvc-f5207723-c172-4076-bedb-f603115230eb

文件夹的格式为<namespace-name>-<pvc-name>-<pv-name>-<uuid>



2.2 部署kubernetes-dashboard

kubernetes-dashboard可以认为是k8s的web可视化界面。它的功能较为简单,只是将原有命令行的操作,变成按钮的点击,并没有提高多少生产力。有另外更加强大的k8s的发行版,例如kubesphere等。使用kubesphere可以进行生产级别的K8S部署和使用,内含多租户管理、DevOps 系统、丰富的可观察性等。



2.2.1 拉取镜像

由于kubelet拉取镜像经常超时,所以k8s-node01和k8s-node02提前拉取镜像

在k8s-node01机器上进行操作,从阿里云拉取镜像的命令

[root@k8s-node01 ~]# docker pull /google_containers/kubernetes-dashboard-amd64:v1.10.1

重新打标签

[root@k8s-node01 ~]# docker tag /google_containers/kubernetes-dashboard-amd64:v1.10.1 /kubernetes-dashboard-amd64:v1.10.1

将镜像打成tar包

[root@k8s-node01 ~]# docker save -o dashboard.tar /kubernetes-dashboard-amd64:v1.10.1

将tar包复制到k8s-node02。这里需要在/etc/hosts文件中配置ip和host的映射关系

[root@k8s-node01 ~]# scp ./dashboard.tar root@k8s-node02:/root
root@k8s-node02's password: 
dashboard.tar

登录到k8s-node02,加载镜像

[root@k8s-node01 ~]# ssh root@k8s-node02
root@k8s-node02's password: 
Last login: Fri Sep 18 17:20:20 2020 from 192.168.1.1
[root@k8s-node02 ~]# pwd
/root
[root@k8s-node02 ~]# ls
anaconda-ks.cfg  dashboard.tar  ingress-controller.tar  init.log  kuadm-image.sh  kubeadm-config.yaml  kubeadm-init.log  kubernetes.conf
## 加载镜像
[root@k8s-node02 ~]# docker load -i dashboard.tar 
Loaded image: /kubernetes-dashboard-amd64:v1.10.1
[root@k8s-node02 ~]# docker images
REPOSITORY                                                       TAG                 IMAGE ID            CREATED             SIZE
......
/kubernetes-dashboard-amd64                            v1.10.1             f9aed6605b81        21 months ago       122MB
......
## 退出
[root@k8s-node01 ~]# exit



2.2.2 helm安装dashboard

下载dashboard的Chart模板,并且解压Chart模板

[root@k8s-master01 dashboard]# helm fetch stable/kubernetes-dashboard
[root@k8s-master01 dashboard]# ls
kubernetes-dashboard-0.6.0.tgz
[root@k8s-master01 dashboard]# tar -zxvf kubernetes-dashboard-0.6.0.tgz
kubernetes-dashboard/Chart.yaml

进入到kubernetes-dashboard文件夹下

[root@k8s-master01 dashboard]# cd kubernetes-dashboard
[root@k8s-master01 kubernetes-dashboard]# ll
总用量 16
-rwxr-xr-x 1 root root  393 1月   1 1970 Chart.yaml
-rwxr-xr-x 1 root root 6513 1月   1 1970 README.md
drwxr-xr-x 2 root root  189 9月  20 20:00 templates
-rwxr-xr-x 1 root root 2435 1月   1 1970 values.yaml

编辑dashboard的配置文件

[root@k8s-master01 kubernetes-dashboard]# cat > k8s-dashboard.yaml << EOF
image:
  repository: /kubernetes-dashboard-amd64  
  tag: v1.10.1
ingress:  
  enabled: true  
  hosts:    
    -   
  annotations:
    /ssl-redirect: "true"    
    /backend-protocol: "HTTPS"  
  tls:    
    - secretName: frognew-com-tls-secret      
      hosts:      
      - 
rbac:  
  clusterAdminRole: true
EOF

安装dashboard

[root@k8s-master01 kubernetes-dashboard]# helm install kubernetes-dashboard stable/kubernetes-dashboard --namespace kube-system -f ./k8s-dashboard.yaml
NAME: kubernetes-dashboard
LAST DEPLOYED: Sun Sep 20 20:03:37 2020
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
*********************************************************************************
*** PLEASE BE PATIENT: kubernetes-dashboard may take a few minutes to install ***
*********************************************************************************
From outside the cluster, the server URL(s) are:
     https://

这里建议使用ingress暴露服务的方式,进行访问。查看一下ingress-nginx的service

[root@k8s-master01 kubernetes-dashboard]# kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.108.159.146   <none>        80:30080/TCP,443:30443/TCP   7d21h

这里在window的hosts文件中添加一个记录。node01或者是node02的ip

打开浏览器访问dashboard,输入https://:30443进行访问
提示不安全,继续访问,进入到登录页面,选择token的方式

到k8s-master01中查看token的值

[root@k8s-master01 kubernetes-dashboard]# kubectl describe secret $(kubectl get secret -n kube-system | grep kubernetes-dashboard-token | awk '{print $1}') -n kube-system
Name:         kubernetes-dashboard-token-x7tlt
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/: kubernetes-dashboard
              kubernetes.io/service-account.uid: 1e4c7bb5-63a6-4f47-b2dd-83350cf3f815

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi14N3RsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFlNGM3YmI1LTYzYTYtNGY0Ny1iMmRkLTgzMzUwY2YzZjgxNSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.DOhRd3jwuTl-2_WVxT5OnNLQ7u7HgYyML1E75EzKTVI12EN6x2jdtIsubCeZpRnFmjNtcd5zDCEHeE4-4tVzZouysuo9bOTCJagdXJHqSoBEYrIX8uzjoU4RAILo9r5sieZmkjFmzcCUwARC2AR9fovcwwjoThqa2jvkO9amlouXaiU6cD-SoCi-d3YkMILcB9CHBhthi-RRg71YNsV4_its7gKsvzJU2ZKmPJu2WXp4GLk5r1aR5mzyG6TamBx32RoYHQj0j3RRu4LnULMYAZO_TTlspQgS_feXFViEO4ziZr3CxX9odUAB_Nlbhmpfe3yiiEz8OaWd5_H1YMn-xQ

复制到输入框中

harmonyOs 的源码很简单 helm源码_docker_06


点击登录进入到管理控制台

harmonyOs 的源码很简单 helm源码_harmonyOs 的源码很简单_07


到此dashboard安装完毕。


2.3 部署metrics-server

Metrics-Server是集群核心监控数据的聚合器。通俗地说,它存储了集群中各节点的监控数据,并且提供了API以供分析和使用。
Metrics-Server主要是为了后面的prometheus和HPA服务的。

先将metrics-server的Char模板下载下来

[root@k8s-master01 metrics-server]# helm fetch stable/metrics-server
[root@k8s-master01 metrics-server]# ll
总用量 12
-rw-r--r-- 1 root root 5349 9月  23 19:56 metrics-server-2.11.2.tgz

使用helm安装

#这里先编写一个配置文件
[root@k8s-master01 metrics-server]# cat > metrics-server.yaml << EOF 
args:
- --logtostderr
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
EOF

使用Char模板创建一个release

#使用 --set key1=value1 的方式覆盖values.yaml文件中的内容
#由于谷歌镜像仓库的镜像无法下载,这里使用阿里云的镜像仓库
[root@k8s-master01 metrics-server]# helm install metrics-server metrics-server-2.11.2.tgz -n kube-system --set image.repository=/google_containers/metrics-server-amd64 -f metrics-server.yaml 
NAME: metrics-server
LAST DEPLOYED: Wed Sep 23 20:10:56 2020
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
NOTES:
The metric server has been deployed. 

In a few minutes you should be able to list metrics using the following
command:

  kubectl get --raw "/apis//v1beta1/nodes"

查看创建的release,对应的Pod。release是基于名称空间进行隔离的。查看是需要带上对应的namespace

[root@k8s-master01 metrics-server]# helm list -n kube-system
NAME                	NAMESPACE  	REVISION	UPDATED                                	STATUS  	CHART                      	APP VERSION
kubernetes-dashboard	kube-system	1       	2020-09-18 17:35:25.467888884 +0800 CST	deployed	kubernetes-dashboard-1.11.1	1.10.1     
metrics-server      	kube-system	1       	2020-09-23 20:10:56.294380547 +0800 CST	deployed	metrics-server-2.11.2      	0.3.6      
#查看对应的Pod
[root@k8s-master01 metrics-server]# kubectl get pod -n kube-system
NAME                                    READY   STATUS    RESTARTS   AGE
......
metrics-server-6b5d9d4c9-nqdbg          0/1     Running   0          24s
......
#运行推荐的命令
[root@k8s-master01 metrics-server]# kubectl get --raw "/apis//v1beta1/nodes"
{"kind":"NodeMetricsList","apiVersion":"/v1beta1","metadata":{"selfLink":"/apis//v1beta1/nodes"},"items":[]}

使用metrics-server

#查看node的资源(内存、cpu)的使用情况
[root@k8s-master01 metrics-server]# kubectl top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master01   97m          4%     1350Mi          35%       
k8s-node01     41m          1%     641Mi           11%       
k8s-node02     51m          1%     634Mi           11%       
#查看Pod的cpu、内存的使用情况
[root@k8s-master01 metrics-server]# kubectl top pod --all-namespaces
NAMESPACE       NAME                                      CPU(cores)   MEMORY(bytes)   
......
default         nfs-client-provisioner-6999f4847d-ck52d   4m           9Mi             
......



2.4 部署Harbor仓库

Harbor的github地址

Harbor仓库的安装方式有两种。

  • docker + docker compose。
  • helm

既然学习了helm,那么就使用helm安装harbor仓库。

这里有一些前提条件

  • Kubernetes cluster 1.16+
  • Helm 2.10.0+

如果k8s的版本低于1.16可以查看之前的文章使用kubeadm升级k8s集群 Helm如果是2.X升级到3.X非常简单,下载压缩包,解压即可使用了。



2.4.1添加harbor的repo仓库、更新harbor的repo仓库

[root@k8s-master01 harbor]# helm repo add harbor https://helm.goharbor.io
"goharbor" has been added to your repositories
[root@k8s-master01 harbor]# helm repo list
NAME    	URL                                             
stable  	https://kubernetes-charts.storage.googleapis.com
harbor	https://helm.goharbor.io                        
[root@k8s-master01 harbor]# helm repo update 
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "harbor" chart repository



2.4.2 搜索和下载harbor仓库的Char模板

[root@k8s-master01 harbor]# helm search repo harbor/harbor
NAME           	CHART VERSION	APP VERSION	DESCRIPTION                                       
harbor/harbor	1.5.0        	2.1.0      	An open source trusted cloud native registry th...
[root@k8s-master01 harbor]# helm fetch harbor/harbor 
[root@k8s-master01 harbor]# ll
总用量 44
-rw-r--r-- 1 root root 44741 9月  28 10:12 harbor-1.5.0.tgz



2.4.3 安装harbor

可以查看harbor的详细配置

主要有Service、Persistent Volume、TLS证书相关的配置

[root@k8s-master01 harbor]# helm install harbor harbor-1.5.0.tgz --set expose.type=nodePort --set expose.tls.enabled=false --set externalURL=http://192.168.1.180:30002
NAME: harbor
LAST DEPLOYED: Mon Sep 28 10:34:00 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at http://192.168.1.180:30002
For more details, please visit https:///goharbor/harbor

这里解释一下参数的含义

  • expose.type=nodePort 这里使用nodePort的方式暴露服务
  • expose.tls.enabled=false 不使用https的方式访问
  • externalURL=http://192.168.1.180:30002 可供外部访问的地址。ip为k8s中node的ip
  • 这里还有一些默认值例如 persistence.enabled 是否开启持久化存储。默认是true。前面安装了nfs-clinet 这个默认的StorageClass。可以根据PVC,动态生成PV。如果没有安装,可以设置为false。
  • 另外harbor还有许多功能性的组件例如redis、Database。可以使用外部的,如果使用外部的,需要进行相应的配置。
  • harborAdminPassword 可以设置harbor的初始化密码。默认是Harbor12345

查看创建的harbor release

[root@k8s-master01 harbor]# helm list
NAME      	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART                       	APP VERSION
harbor    	default  	1       	2020-09-28 10:34:00.943649278 +0800 CST	deployed	harbor-1.5.0                	2.1.0         
kubeadm  kubectl  kubelet  
[root@k8s-master01 harbor]# kubectl get pod
NAME                                                READY   STATUS              RESTARTS   AGE
......
harbor-harbor-chartmuseum-78f6898f58-xt9kw          0/1     ContainerCreating   0          21s
......

最好是现将相关的镜像在k8s-node01和k8s-node02节点下载下来,因为kubelet拉取镜像经常失败。如果kubelet拉取镜像失败,需要删除Pod,k8s会自动重启相应的Pod。

等待一段时间后Harbor所有相关的Pod都处于Running状态,且已经就绪,就可以访问harbor仓库了。



2.4.4 使用harbor仓库

打开浏览器,输入刚才设置的externalURL http://192.168.1.180:30002/

harmonyOs 的源码很简单 helm源码_dashboard_08

用户名是admin,密码是Harbor12345。

新建一个项目test_char 这里的项目可以理解为仓库。

harmonyOs 的源码很简单 helm源码_harmonyOs 的源码很简单_09

新建一个用户

harmonyOs 的源码很简单 helm源码_docker_10


添加test_char仓库到Helm的repo中

[root@k8s-master01 helm]# helm repo add test_char http://192.168.1.180:30002/chartrepo/test_char
"char_harbor" has been added to your repositories
[root@k8s-master01 helm]# helm repo list
NAME       	URL                                             
stable     	https://kubernetes-charts.storage.googleapis.com
harbor     	https://helm.goharbor.io                        
char_harbor	http://192.168.1.180:30002/chartrepo            
[root@k8s-master01 helm]# helm repo update 
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "test_push_char" chart repository
...Successfully got an update from the "harbor" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈

如果想要将本地的chart模板push到harbor的chart仓库中,需要先下载push插件。

下载push的插件

[root@k8s-master01 helm]# helm plugin install https:///chartmuseum/helm-push
Downloading and installing helm-push v0.8.1 ...
https:///chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz

这里如果插件的压缩包始终下载不下来,可以使用将url复制到迅雷进行下载
然后上传到k8s-master01中,先进行解压

[root@k8s-master01 plugin]# tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz 
LICENSE
plugin.yaml
bin/helmpush
[root@k8s-master01 plugin]# ll
总用量 9520
drwxr-xr-x 2 root root       22 9月  28 23:33 bin
-rw-r--r-- 1 root root  9729851 9月  28 21:48 helm-push_0.8.1_linux_amd64.tar.gz
-rw-r--r-- 1  501 games   11357 12月 17 2019 LICENSE
-rw-r--r-- 1  501 games     395 12月 17 2019 plugin.yaml

然后添加插件

[root@k8s-master01 plugin]# helm plugin install .
#提示插件已经存在,先删除插件,重新添加
Error: plugin already exists
[root@k8s-master01 plugin]# helm plugin ls
NAME	VERSION	DESCRIPTION                      
push	0.8.1  	Push chart package to ChartMuseum
[root@k8s-master01 plugin]# helm plugin uninstall push 
Uninstalled plugin: push
[root@k8s-master01 plugin]# helm plugin install .
sh: scripts/install_plugin.sh: 没有那个文件或目录
Error: plugin install hook for "push" exited with error
#这里添加成功
[root@k8s-master01 plugin]# helm plugin ls
NAME	VERSION	DESCRIPTION                      
push	0.8.1  	Push chart package to ChartMuseum

接下来测试push的功能,将之前下载的metrics-server的Char模板推到char仓库中

[root@k8s-master01 metrics-server]# helm push metrics-server-2.11.2.tgz test_char --username admin --password=Harbor12345
Pushing metrics-server-2.11.2.tgz to test_push_char...
Done.

去Harbor的仓库中查看Char是否上传成功

harmonyOs 的源码很简单 helm源码_dashboard_11


这里看到Chart模板已经推送成功。

但是怎么从Char仓库下载指定的Char模板呢?

  1. 首先更新repo仓库
  2. 搜索Char模板时指定Char仓库
  3. 下载Char模板时指定Chart仓库

是不是和拉取docker的镜像很类似啊。

[root@k8s-master01 metrics-server]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "test_char" chart repository
...Successfully got an update from the "harbor" chart repository
[root@k8s-master01 metrics-server]# helm search repo test_push_char/metrics-server
NAME                         	CHART VERSION	APP VERSION	DESCRIPTION                                       
test_push_char/metrics-server	2.11.2       	0.3.6      	Metrics Server is a cluster-wide aggregator of ...
[root@k8s-master01 metrics-server]# helm pull test_char/metrics-server
[root@k8s-master01 metrics-server]# ll
总用量 12
-rw-r--r-- 1 root root 5356 9月  28 23:52 metrics-server-2.11.2.tgz

到此Harbor安装和简单使用到这里就结束了。



2.5 部署prometheus

harmonyOs 的源码很简单 helm源码_docker_12