k8s之包管理器Helm

helm的作用就是通过打包的方式,把deployment service ingress这些打包在一块,一键式的部署服务。类似yum官方提供的一个类似与安装仓库的功能,可以实现一键化部署应用。

Helm的三个重要概念

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

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

●Repository(仓库):Charts 仓库,用于集中存储和分发 Charts。Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。

Helm在k8s集群中的部署

将Helm安装在master01节点上

//在github中下载所需版本的二进制 Helm client 安装包

https://github.com/helm/helm/tags

tar -zxvf helm-v3.6.0-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin/helm

helm version

添加helm的自动补全功能

vim /etc/bashrc

source <(helm completion bash)

使用 helm 安装 Chart

###helm添加chat的语法格式:

helm repo add chart仓库名 chart仓库地址

###添加常用的chart仓库############

#一个开源项目的仓库

helm repo add bitnami https://charts.bitnami.com/bitnami

#微软chart仓库,推荐使用,内容基本与官方仓库保持一致

helm repo add stable http://mirror.azure.cn/kubernetes/charts

#阿里chart仓库,应有尽有

helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

#官方仓库,国内网络问题,不太推荐应用

helm repo add incubator https://charts.helm.sh/incubator

对chart仓库的基本使用

1.更新和查看 charts 列表

helm repo update

helm repo list

2.查看某chart仓库的可用chart列表

//查看 stable 仓库可用的 charts 列表

helm search repo stable

3.删除指定的chart仓库

//eg:因为官方仓库使用起来太慢,删除 incubator 仓库

helm repo remove incubator
4.查看 chart 信息

helm show chart stable/mysql #查看指定 chart 的基本信息

helm show all stable/mysql #获取指定 chart 的所有信息

安装 chart

helm install my-redis bitnami/redis [-n default] #指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace

helm install bitnami/redis --generate-name #不指定 release 的名字时,需使用 --generate-name 随机生成一个名字

对chart的基本管理

1.查看所有的release

helm ls

helm list

2.查看指定的 release 状态

helm status my-redis

3.删除指定的release

helm uninstall my-redis

Helm的自定义模板

charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。

在镜像仓库中拉取chart,查看chart的包结构

#拉取chart 到本地目录(现在所在的目录中)

helm pull stable/mysql

#对该拉取的chart压缩包进行解压

tar xf mysql-1.6.9.tgz

自定义创建一个chart

1.使用命令行创建生成一个模板

helm create nginx

tree nginx

cat nginx/templates/deployment.yaml

2.进行模板文件的修改,生成自定义chart

vim nginx/Chart.yaml

apiVersion: v2

name: nginx #chart名字

description: A Helm chart for Kubernetes

type: application #chart类型,application或library

version: 0.1.0 #chart版本

appVersion: 1.16.0 #application部署版本

vim nginx/values.yaml

replicaCount: 1

image:

repository: nginx

pullPolicy: IfNotPresent

tag: "latest" #设置镜像标签

imagePullSecrets: []

nameOverride: ""

fullnameOverride: ""

serviceAccount:

create: true

annotations: {}

name: ""

podAnnotations: {}

podSecurityContext: {}

fsGroup: 2000

securityContext: {}

capabilities:

drop:

- ALL

readOnlyRootFilesystem: true

runAsNonRoot: true

runAsUser: 1000

service:

type: ClusterIP

port: 80

ingress:

enabled: true #开启 ingress

className: ""

annotations: {}

kubernetes.io/ingress.class: nginx

kubernetes.io/tls-acme: "true"

hosts:

paths:

  • path: /

pathType: Prefix #指定ingress路径类型

tls: []

- secretName: chart-example-tls

hosts:

- chart-example.local

resources:

limits:

cpu: 100m

memory: 128Mi

requests:

cpu: 100m

memory: 128Mi

autoscaling:

enabled: false

minReplicas: 1

maxReplicas: 100

targetCPUUtilizationPercentage: 80

targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

3.进行chart打包

//打包 chart

helm lint nginx #检查依赖和模版配置是否正确

helm package nginx #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz

4.利用自定义chart包进行k8s资源部署

helm install nginx ./nginx --dry-run --debug #使用 --dry-run 参数验证 Chart 的配置,并不执行安装

helm install nginx ./nginx -n default #部署 chart,release 版本默认为 1

或者

helm install nginx ./nginx-0.1.0.tgz

#可根据不同的配置来 install,默认是 values.yaml

helm install nginx ./nginx -f ./nginx/values-prod.yaml

5.部署ingress

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

kubectl apply -f mandatory.yaml

kubectl apply -f service-nodeport.yaml

kubectl get pod,svc -n ingress-nginx

kubectl get ingress

进行客户机测试:

vim /etc/hosts

192.168.73.107 www.test.com

6.进行修改变动,进行chart的升级更新

//修改为 NodePort 访问后,升级

vim nginx/values.yaml

service:

type: NodePort

port: 80

nodePort: 30080

ingress:

enabled: false

vim nginx/templates/service.yaml

apiVersion: v1

kind: Service

metadata:

name: {{ include "nginx.fullname" . }}

labels:

{{- include "nginx.labels" . | nindent 4 }}

spec:

type: {{ .Values.service.type }}

ports:

  • port: {{ .Values.service.port }}

targetPort: http

protocol: TCP

name: http

nodePort: {{ .Values.service.nodePort }} #指定 nodePort

selector:

{{- include "nginx.selectorLabels" . | nindent 4 }}

升级 release,release 版本加 1

helm upgrade nginx nginx

7.自定义chart的版本回滚 (根据release版本)

helm history nginx #查看 release 版本历史

helm rollback nginx 1 #回滚 release 到版本1

#通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。

Helm 的私有仓库-Habor

前面介绍了Habor作为docker镜像的私有仓库,其实Habor还可以成为Helm的私有仓库,用来存放打包好的chart包

具体部署步骤

1.在新主机上安装habor和docker-compose(前提是已经安装好docker)

//安装 harbor

#上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录

cd /opt

cp docker-compose /usr/local/bin/

chmod +x /usr/local/bin/docker-compose

tar zxf harbor-offline-installer-v1.9.1.tgz

cd harbor/

vim harbor.yml

hostname: 192.168.73.108

harbor_admin_password: Harbor12345 #admin用户初始密码

data_volume: /data #数据存储路径,自动创建

chart:

absolute_url: enabled #在chart中启用绝对url

log:

level: info

local:

rotate_count: 50

rotate_size: 200M

location: /var/log/harbor #日志路径

#安装带有 Clair service 和 chart 仓库服务的 Harbor

./install.sh --with-clair --with-chartmuseum

2.在helm主机上安装好push插件

#在线安装

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

#离线安装

wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz

mkdir -p ~/.local/share/helm/plugins/helm-push

tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push

helm repo ls

3.在habor主机创建项目,在helm主机添加chart仓库

打开浏览器:访问http://192.168.73.108,新建项目

在helm主机上进行操作 :

#添加仓库

helm repo add harbor http://192.168.73.108/chartrepo/chart_repo --username=admin --password=Harbor12345

#注:这里的 repo 的地址是<Harbor URL>/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。

4.进行推送拉取测试

#推送 chart 到 harbor 中

cd /opt/helm

helm push nginx-0.1.0.tgz harbor

拉取chart包测试:

注意:第一次拉取私有仓库chart包时,需要先进行helm repo update 更新helm仓库源

rm -f nginx-0.1.0.tgz

mkdir repo.bak

mv nginx/ ./repo.bak

#因为harbor仓库是第一次使用,需要先对仓库源进行更新

helm repo update

helm pull harbor/nginx

Helm的命令总结

1.Helm的常用命令总结

helm #查看helm基本操作命令

helm version #查看helm的版本

helm env #查看环境变量

helm create chartName #创建chart目录(含基本配置文件和目录)

helm package chartDir #将chart目录打包

helm template chartName #渲染template目录下的模板文件(即将这些模板文件的字段内容用values.yaml填充,然后直接输出到终端)

helm search repo keyword #根据关键字检索chart包

helm search hub keyword

#上面2个命令仅仅在第3个字段有区别,repo表示在本地所添加的仓库中进行检索;hub表示在Helm Hub中进行检索。

helm list #查看发布到k8s中的chart对应的release

helm push chart.tgz repoName 上传chart到chart仓库

例:helm push demo.tgz harbor-10.30.12.211 --username=admin --password=Harbor12345

#有些仓库是有账号密码验证的,所以需要加上账号、密码的参数(比如Harbor提供的chart仓库功能,可参考下面的私有仓库搭建先搭建一个私有仓库出来,再进行仓库相关命令的测试)

命令:helm pull repoName/keyword #从chart仓库中拉取chart到本地

例:helm pull harbor-10.30.12.211/demo

#harbor-10.30.12.211/demo的结构是本地起的仓库名/chart包的名字前缀,只要在harbor-10.30.12.211仓库中含有demo为前缀的chart包,就会被下载到本地

helm lint chartName #检查chart包中的文件内容是否正确(即该chart包去k8s中是否能够成功安装部署)

#包可以是chart目录、chart压缩包

helm install releaseName chartName #将chart包发布到k8s集群中安装部署

#releaseName为release的名字,chartName为chart包名,chart可以是未打包的chart,也可以是打包的chart,也可以是仓库中的chart。【chart和release的关系可以大致理解为程序和进程的关系,一个是静态的,一个是动态的】

helm install chartName --generate-name

#可以不指定release的名字,只需要指定--generate-name即可随机生成一个名字

#创建完后可以使用helm list查看是否有对应的release

helm uninstall releaseName #将部署到k8s中的release卸载掉

#卸载完后使用helm list查看relDemo是否被删除了,同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部删除干净

helm upgrade releaseName chartName #将部署到k8s中的release升级,即相当于应用升级

#relName指定一个release,该release对应一个k8s中的应用,chartName指定一个chart包,整个过程为直接使用指定的chart包替换部署release。就helm而言release还是原来那个,不过对应的chart包被替换了。对k8s而言,仅仅是将原先资源删除,然后用新的chart包创建资源。

#使用helm list查看release的CHART字段是否更新,同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部更新(看名字、运行时间)

helm rollback releaseName revision #将release回退到前一个或若干个版本(k8s中会同步回退)

#revision为第几个版本,1表示第一个版本,2表示第二个版本,以此类推。通常回滚会搭配helm history releaseName使用,通过该命令查看所有的关于本release的发布历史,然后选择回退到哪个版本

#回滚成功后使用helm list查看该release的CHART和APP VERSION是否更新(具体得看chart中的chart.yaml中的version和appVersion有没有相应的修改),同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部更新(看名字、运行时间)

helm history releaseName #查看release的发布历史(包括安装、升级、回滚)

helm status releaseName #查看release的基本信息

2.查看chart包的操作命令

helm show chart chartName #查看chart包中的chart.yaml文件内容

#chart包可以是本地的未打包的chart目录(即helm create 创建出来的chart目录),也可以是打包的chart压缩包(由helm package打包),也可以是保存在仓库中的chart包

helm show values chartName #查看chart包中的values.yaml文件内容

#包同上有3种选择

helm show readme chartName #查看chart包中README文件内容

#包同上有3种选择

helm show all chartName #查看chart包中chart.yaml、values.yaml、README文件内容

#包同上有3种选择

3.查看release指定内容(与helm show作用、格式相同)

helm get notes releaseName #查看release的说明信息(相当于chart中的NOTES.TXT)

helm get manifest releaseName #查看release在k8s中创建出来的资源

helm get hooks releaseName #查看release的回调创建资源

helm get values releaseName #查看release的values配置

helm get all releaseName #查看上述所有内容

4.helm plugin ------ 插件管理

helm plugin list #查看本地安装好的插件 (插件管理)

helm plugin install pluginURL #安装插件

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

#最后的url地址为插件的下载地址,可参考 https://github.com/chartmuseum/helm-push

helm plugin uninstall pluginName #卸载插件

helm plugin update pluginName #更新插件,将插件升级到最新版本

#在下载插件的时候会保存插件及其下载地址,更新的时候使用原本的下载地址直接下载最新版本替换

5.helm repo ------ 仓库管理

helm repo list #(仓库管理)查看添加的chart仓库,可在这些chart仓库中拉取chart(实际上就相当于一个应用的安装包)

helm repo add repoName repoURL #本地添加chart仓库

例:helm repo add abc http://mirror.azure.cn/kubernetes/charts/

#repoName是你自己起的一个名字,用来代表这个repoURL,后续操作仓库的命令中直接用repoName来代替repoURL,只要指定了repoName,就表示要去操作repoName指向的repoURL的仓库

helm repo remove repoName #本地删除chart仓库

helm repo update #将本地所添加的chart仓库的最新信息缓存到本地

#helm search命令是检索某仓库中的chart包,假设仓库中一开始是没有所指定的chart包,所以helm search是检索不到的。这时候如果将chart包上传至该仓库,本地需要执行一遍helm repo update以更新本地的缓存数据才能检索到该指定的chart,因为helm search就是读取本地缓存数据的

helm repo index repoDir --url=repoURL #根据指定仓库目录下的chart包生成index.yaml索引文件

例:helm repo index repo --url=http://192.168.73.108:8080/

#repoDir指定一个仓库的目录,该目录用来存放chart包及索引文件index.yaml。url指定仓库的访问路径,生成的索引文件中会以该url为地址前缀拼接上chart包名作为chart包的访问路径

相关推荐
小O_好好学16 分钟前
CentOS 7文件系统
linux·运维·centos
哲伦贼稳妥40 分钟前
一天认识一个硬件之机房地板
运维·网络·经验分享·其他
john_hjy1 小时前
11. 异步编程
运维·服务器·javascript
x晕x1 小时前
Linux dlsym符号查找疑惑分析
linux·运维·服务器
活跃的煤矿打工人1 小时前
【星海saul随笔】Ubuntu基础知识
linux·运维·ubuntu
later_rql2 小时前
k8s-集群部署1
云原生·容器·kubernetes
北京智和信通2 小时前
云平台和虚拟化智慧运维监控,全面提升故障感知与处置能力
运维·虚拟化·云平台·虚拟机监控
fasewer2 小时前
第五章 linux实战-挖矿 二
linux·运维·服务器
楚灵魈3 小时前
[Linux]从零开始的网站搭建教程
linux·运维·服务器
小小不董3 小时前
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
linux·运维·服务器·数据库·php·dba