目 录CONTENT

文章目录

Kubeadm管理k8s集群系列10-helm使用介绍

cplinux98
2022-09-06 / 0 评论 / 0 点赞 / 112 阅读 / 3,145 字 / 正在检测是否收录...

00:文章简介

kubernetes中的helm使用介绍。

本文涉及软件版本:

  • helm
    • v3.8.1
  • kubernetes
    • v1.23.4
  • harbor
    • v2.3.2-6b6c21da
  • nexus
    • 3.37.3-02
  • os
    • Ubuntu 20.04 LTS

01:helm介绍

官方网站:https://helm.sh/

官方文档:https://helm.sh/zh/docs

helm的功能:

  • 和yum、apt的工作方式类似,负责给k8s安装软件
  • 它的仓库里定义了安装部署软件的资源清单文件,叫做Chart
  • helm可以对应用程序进行升级和回滚

对于k8s平台中部署应用来说,主要需要一下内容:

  • image
    • container镜像
  • 资源定义文件
    • Deployment、Service、hpa等
  • 专用文件
    • 配置文件、证书等

1.1:Helm组成

  • Chart
    • 一个helm程序包,只包含了运行k8s应用程序的资源定义模板文件和专用文件
  • Repository
    • Charts仓库,https/http服务器
  • Release
    • 对Chart中的模板属性,通过Config赋值后,生成特定的Chart
    • 特定的Chart,部署于目标集群上的一个实例

1.2:v2版本-程序架构

  • helm
    • 客户端
    • 运行于k8s集群之外
    • 管理本地的Chart仓库,管理Chart
    • 与Tiller服务器交互,发送Chart,实现安装、查询、卸载等操作
  • Tiller
    • 服务端
    • 运行于k8s集群内部
    • 监听来自Helm client的请求,
      • 通过chart及其配置进行构建发布,
      • 安装chart到k8s集群,并跟踪随后的发布
      • 通过k8s交互升级或卸载chart

image-20220330155659163

v2流程解析

  1. 部署一个稳定运行的k8s集群,能在管理k8s的主机上部署helm
  2. 用户在客户端主机上,定制各种Chart资源和config资源,上传到专用的仓库(本地或远程)
  3. helm客户端向Tiller发出部署请求,如果本地有Chart用本地的,否则从仓库获取
  4. Tiller与k8s集群的api-server发送请求
  5. api-server通过集群内部机制部署应用,需要依赖镜像的时候,从专门的镜像仓库服务中获取
  6. 基于helm部署好的应用实例,在k8s集群中,我们称之为release(发布版本)

1.3:v3版本-程序架构

在v2版本中,需要在客户端上部署tiller来维护release相关的信息,有点太重量级了,所以在v3版本中,剔除了专门的tiller,而是像calico一样借助api-server将数据存储到etcd中。

image-20220330160446547

1.4:helm与kustomize

  • helm
    • 定位:k8s的包管理工具
    • 通过将应用抽象成Chart来管理,专注于应用的操作、复杂性管理
  • kustomize
    • 定位:k8s原生配置管理
    • 关注于k8s api对象的管理

1.5:helm与operator

  • helm
    • 仅仅是部署
  • operator
    • 部署是功能之一
    • 核心功能是确保应用程序符合k8s的api资源管理规范的基础上,通过代码级别的控制,确保应用能够按照用户所定义的期望状态进行执行

02:部署helm v3

下载和解压

cd /usr/local
wget https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz
tar -xf helm-v3.8.1-linux-amd64.tar.gz 
mv linux-amd64 helm-v3.8.1
ln -s helm-v3.8.1 helm
cd helm
rm -f LICENSE README.md 

配置环境变量

/etc/profile.d/helm.sh

#!/bin/bash
# set helm env
export PATH=$PATH:/usr/local/helm/
chmod +x /etc/profile.d/helm.sh
source /etc/profile.d/helm.sh

测试

helm -h
helm version

03:仓库管理

仓库可以按照自己的网络环境来选择,推荐使用国内可以访问的 az-stable bitnami prometheus-community的源。

3.1:添加仓库源

# 官方源
helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm repo add incubator https://kubernetes-incubator.storage.googleapis.com
# 国内可以访问的源
helm repo add az-stable http://mirror.azure.cn/kubernetes/charts/
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

3.2:查看仓库

root@master01:~# helm repo list
NAME            URL                                      
az-stable       http://mirror.azure.cn/kubernetes/charts/
bitnami         https://charts.bitnami.com/bitnami

3.3:更新仓库属性信息

helm repo update

3.4:搜索Chart

有两种搜索方式

  • hub
    • 在官方的Artifact或自己私有的hub中搜索
  • repo
    • 自己添加的源
root@master01:~# helm search --help
Available Commands:
  hub         search for charts in the Artifact Hub or your own hub instance
  repo        search repositories for a keyword in charts

从自定义仓库中搜索redis

helm search repo redis

image-20220330203837538

3.5:查看chart的所有信息

可以查看到关于该chart的所有信息

helm show all bitnami/redis

3.6:查看chart的其他信息

  all         show all information of the chart
  chart       show the chart's definition
  crds        show the chart's CRDs
  readme      show the chart's README
  values      show the chart's values

3.7:获取chart文件

helm pull bitnami/redis
# redis-16.7.0.tgz

04:应用管理

chart的安装方式主要分为2种

  • 本地chart
    • 指定本地chart目录: helm install /path/to/chart_dir
    • 指定本地chart压缩包:helm install chart_name.tgz
  • 仓库中的chart
    • 默认远程仓库:helm install repo/chart_name
    • 指定仓库:helm install web_address:port/url/to/chart_name.tgz
    • 远程仓库本质上是将打包后的chart作为静态文件托管到了web服务器上

4.1:安装应用

helm install release_name repo_name/chart_name
# 可以使用--set 来设置模板中的变量,与value中设置一样,--set优先

4.2:卸载应用

helm uninstall release_name

4.3:创建应用

helm create app
# 在当前目录创建一个app目录
root@master01:~# tree app
app    		# chart name 根据create后名字生成
├── charts
├── Chart.yaml  # 声明文件,存放当前Chart的名称、版本等基本信息,便于用户在仓库里浏览检索
├── templates   # 存放各种资源清单文件
│   ├── deployment.yaml
│   ├── _helpers.tpl   # 定制的模板功能文件,包含各种需要根据"值结果"进行调整的功能
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt      # install完成后,显示在终端上面的模板
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml        # 存放各种定制的变量值,使用yaml格式语法

示例文件:app/templates/serviceaccount.yaml

{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "app.serviceAccountName" . }}
  labels:
    {{- include "app.labels" . | nindent 4 }}
  {{- with .Values.serviceAccount.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
{{- end }}

变量相关语法

  • {{- if .Values.serviceAccount.create -}}
    • 如果在项目目录下存在Values文件,并且里面的serviceAccount部分的create属性为true,执行下面的操作
    • {{- 表达式 -}},横杠(-)表示去掉表达式输出结果前面和后面的空格,可以使用单个
    • Values前面的点(.) 代表全局作用域=项目根目录
    • 中间的点是对象中属性的引用方式
  • include “xxxxx” .
    • 由templates/_helpers.tpl中提供
  • .Values.xxxxx
    • 由values.yaml提供
  • {{- with .Values.serviceAccount.annotations }}
    • with语法代表修改内容
  • {{- toYaml . | nindent 4 }}
    • toYaml 表示将数据转换为yaml格式
    • nindent 4,表示不局限于4行
    • indent 4 ,表示格式化转换为4行

模板相关文档:https://helm.sh/zh/docs/chart_template_guide/getting_started/

4.4:打包应用

helm package ./app
# Successfully packaged chart and saved it to: /root/app-0.1.0.tgz

05:私有helm仓库搭建

5.1:使用harbor承载helm仓库

harbor是可以当作helm的仓库来使用的,但默认没有开启,需要手动开启一下

# 进入harbor目录
docker-compose stop
# 重新安装并开启插件
./install.sh --with-chartmuseum

配置好后,可以在项目管理界面创建一个专用项目 cphelm

在helm配置主机上安装helm-push插件

helm plugin install https://github.com/chartmuseum/helm-push
help plugin list

添加repo

helm repo add harbor https://harbor.linux98.com/chartrepo/cphelm --username=cpli --password=A12345678a

推送chart

helm cm-push app harbor
也可以使用 --version="1.2.3" 添加版本信息

推送chart包

helm cm-push redis-16.7.0.tgz harbor

image-20220330220045954

image-20220330220059234

拉取chart

helm repo update
helm pull harbor/redis
helm pull harbor/app

harbor对比nexus的优点是可以在仓库管理界面查看概要、依赖、取值(values)信息

image-20220331004755953

image-20220331004740244

5.2:使用nexus承载helm仓库

创建blob存储

image-20220330221858313

创建Repositories helm(hosted)

image-20220330222057418

copy 创建好的仓库源地址

http://192.168.31.202:8081/repository/myhelm/

添加repo

helm repo add nexus http://username:password@192.168.31.202:8081/repository/myhelm
http://192.168.31.202:8081/service/rest/v1/components?repository=myhelm

打包chart

helm package ./app
# Successfully packaged chart and saved it to: /root/app-0.1.0.tgz

上传chart包

这里需要使用nexus的api接口进行上传

image-20220330223643089

可以点击接口,使用try it out 按钮来获取api接口的url地址

image-20220330223759857

这里我们使用curl来上传一下

curl -v -F file=@app-0.1.0.tgz -u username:password http://192.168.31.202:8081/service/rest/v1/components?repository=myhelm

查看上传结果

image-20220330223951652

下载chart

helm repo update
helm search repo -l app | grep nexus
helm pull nexus/app

06:安装Chart实践

安装一个redis chart来测试一下,默认的redis chart使用的是持久存储,但我们的环境中暂时没有持久存储,我们需要将持久存储关闭一下

helm install my-redis bitnami/redis --set master.persistence.enabled=false --set replica.persistence.enabled=false

安装成功后,会弹出基于NOTE.txt文件的提示信息

image-20220330225607318

查看pod状态

kubectl get pods

image-20220330231940797

pod中的image是远程仓库的chart中的设置的image,不是本地的,拉取可能会很困难

查看已经部署的release

helm list

image-20220330232012866

07:自定义Chart实践

需求:制作一个nginx网站首页,可以根据values中的值改变index.html中的文本。

7.1:创建chart应用

helm create my-nginx

7.2:修改Chart.yaml文件

参考地址:https://helm.sh/zh/docs/topics/charts/

nginx最新稳定版为1.20.2

my-nginx/Chart.yaml

apiVersion: v2  # chart API版本
name: my-nginx  # chart名字,要与目录名保持一致
description: A Helm chart for Kubernetes  # 描述信息
type: application  # chart类型
version: 0.1.0  # 当前chart版本
appVersion: "1.20.2"  # 包含的app软件版本
maintainers: # (可选)
  - name: lcp # 维护者名字 (每个维护者都需要)
    email: cplinux98@gmail.com  # 维护者邮箱 (每个维护者可选)
    url: www.linux98.com # 维护者URL (每个维护者可选)

7.3:修改deployment文件模板

在spec.template.spec.containers 下 imagePullPolicy下面增加,用来定制nginx首页

          env:
          - name: USERNAME
            value: {{ .Values.Username }}
          lifecycle:
            postStart:
              exec:
                command: ["/bin/sh", "-c", "echo $USERNAME > /usr/share/nginx/html/index.html"]

7.4:在vulues文件中配置变量

my-nginx/values.yaml

只展示需要修改的部分

Username: "hello linux98!"

replicaCount: 3

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "1.20.2"

7.5:安装chart应用

安装前可以使用lint选项来检查chart是否有错误

root@master01:~/mykube/helm# helm lint my-nginx
==> Linting my-nginx
[INFO] Chart.yaml: icon is recommended

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

测试没问题,就可以安装了

helm install test-nginx my-nginx

image-20220331002225309

查看service地址并访问测试

root@master01:~/mykube/helm# kubectl get pods
NAME                                   READY   STATUS    RESTARTS      AGE
test-nginx-my-nginx-6cc7c8c5c9-5thts   1/1     Running   0             42s
test-nginx-my-nginx-6cc7c8c5c9-thxmx   1/1     Running   0             42s
test-nginx-my-nginx-6cc7c8c5c9-zwxz2   1/1     Running   0             42s
root@master01:~/mykube/helm# kubectl get svc
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes            ClusterIP   10.96.0.1        <none>        443/TCP    9d
test-nginx-my-nginx   ClusterIP   10.105.142.235   <none>        80/TCP     54s
root@master01:~/mykube/helm# curl 10.105.142.235
hello linux98!

可以看到pod和svc的命名都是前面都是: release_name-chart_name

使用变量再次部署一个

helm install test-nginx-env my-nginx --set Username="hello cplinux98!"

测试结果

root@master01:~/mykube/helm# kubectl get svc | grep test-nginx-env
test-nginx-env-my-nginx   ClusterIP   10.109.111.185   <none>        80/TCP     20s
root@master01:~/mykube/helm# curl 10.109.111.185
hello cplinux98!

7.6:卸载chart应用

helm uninstall test-nginx-env

7.7:升级chart应用

这里升级可以选择新版本chart,也可以对当前运行中的chart版本里面的变量进行替换后重新部署

helm upgrade --set Username="hello linux98-v2!" test-nginx my-nginx && kubectl get pods -w

等待pod进行滚动更新后,查看结果

root@master01:~/mykube/helm# curl  10.105.142.235
hello linux98-v2!

7.8:提交chart应用到私有仓库

helm cm-push my-nginx harbor

查看仓库

image-20220331003934922

需要程序说明的,可以在chart根目录创建README.md文件,以存放说明信息。

image-20220331004355998

0

评论区