什么是Helm
Helm是一个为K8s进行包管理的工具。Helm将yaml作为一个整体管理并实现了这些yaml的高效复用,就像Linux中的yum或apt-get,它使我们能够在K8s中方便快捷的安装、管理、卸载K8s应用。
Helm基于go模板语言,用户只要提供规定的目录结构和模板文件。在真正部署时Helm模板引擎便可以将其渲染成真正的K8s资源配置文件,并按照正确的顺序将它们部署到节点上。
Helm中有三个重要概念,分别为Chart、Repository和Release。
Chart代表中Helm包。它包含在K8s集群内部运行应用程序,工具或服务所需的所有资源定义。可以类比成yum中的RPM。
Repository就是用来存放和共享Chart的地方,可以类比成Maven仓库。
Release是运行在K8s集群中的Chart的实例,一个Chart可以在同一个集群中安装多次。Chart就像流水线中初始化好的模板,Release就是这个“模板”所生产出来的各个产品。
Helm作为K8s的包管理软件,每次安装Charts 到K8s集群时,都会创建一个新的 release。你可以在Helm 的Repository中寻找需要的Chart。Helm对于部署过程的优化的点在于简化了原先完成配置文件编写后还需使用一串kubectl命令进行的操作、统一管理了部署时的可配置项以及方便了部署完成后的升级和维护。
Helm的架构
Helm客户端使用REST+JSON的方式与K8s中的apiserver进行交互,进而管理deployment、service等资源,并且客户端本身并不需要数据库,它会把相关的信息储存在K8s集群内的Secrets中。
Helm的目录结构
★ templates/ 目录包含了模板文件。Helm会通过模板渲染引擎渲染所有该目录下的文件来生成Chart,之后将收集到的模板渲染结果发送给K8s。
★ values.yaml 文件对于模板也非常重要。这个文件包含了对于一个Chart的默认值 。这些值可以在用户执行Helm install 或 Helm upgrade时指定新的值来进行覆盖。
★ Chart.yaml 文件包含对于该Chart元数据描述。这些描述信息可以在模板中被引用。
★ _helper.tpl 包含了一些可以在Chart中进行复用的模板定义。
★ 其他诸如deployment.yaml、service.yaml、ingress.yaml文件,就是我们用于生成K8s配置文件的模板,Helm默认会按照如下的顺序将生成资源配置发送给K8s:
Namespace -> NetworkPolicy -> ResourceQuota -> LimitRange -> PodSecurityPolicy --> PodDisruptionBudget -> ServiceAccount -> Secret -> SecretList -> ConfigMap -> StorageClass -> PersistentVolume -> PersistentVolumeClaim -> CustomResourceDefinition -> ClusterRole -> ClusterRoleList -> ClusterRoleBinding -> ClusterRoleBindingList -> Role -> RoleList -> RoleBinding -> RoleBindingList -> Service -> DaemonSet -> Pod -> ReplicationController -> ReplicaSet -> Deployment -> HorizontalPodAutoscaler -> StatefulSet -> Job -> CronJob -> Ingress -> APIService
helm3 安装部署
由于国外很多镜像网站国内无法访问,例如gcr.io ,建议使用阿里源,https://developer.aliyun.com/hub 。
目前helm3已经不依赖于tiller,Release 名称可在不同 ns 间重用。
安装helm
Helm3 不需要安装tiller,下载到 Helm 二进制文件直接解压到 $PATH 下就可以使用了。
https://github.com/helm/
cd /opt && wget https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
wget https://mirrors.huaweicloud.com/helm/v3.13.2/helm-v3.13.2-linux-amd64.tar.gz
mkdir tmp
tar xf helm-v3.13.2-linux-amd64.tar.gz -C ./tmp
cp tmp/linux-amd64/helm /usr/local/bin/
helm version --short
rm -rf tmp
helm version
v3.13.2+g2a2fb3b
Helm补全
在当前shell会话中加载自动补全:
source <(helm completion bash)
为每个新的会话加载自动补全,执行一次:
vi /etc/profile
source <(kubectl completion bash)
source <(helm completion bash) # 增加改行内容
source /etc/profile
Helm验证
helm version
version.BuildInfo{Version:"v3.13.2", GitCommit:"2a2fb3b98829f1e0be6fb18af2f6599e0f4e8243", GitTreeState:"clean", GoVersion:"go1.20.10"}
配置国内helm源
查看当前
helm repo list
添加阿里源
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
其它源
helm repo add bitnami https://charts.bitnami.com/bitnami
删除 incubator 仓库:
helm repo remove incubator
更新chart仓库:
helm repo update
查找软件
https://artifacthub.io/packages/helm/bitnami/mysql
搜索需指定 repo|hub
helm search repo memcached
从指定 chart 仓库地址搜索 chart:
helm search repo aliyun | grep 名称
找出大于指定版本chart,不能找app版本
helm search repo mysql –version ^1.0
查看具体信息
helm show chart aliyun/mysql
使用helm3安装应用举例
helm search hub guestbook
helm install guestbook apphub/guestbook
下载并解压到当前目录
helm pull bitnami/redis –untar
helm命令帮助
completion # 为指定的shell生成自动完成脚本(bash或zsh)
create # 创建一个具有给定名称的新 chart
delete # 从 Kubernetes 删除指定名称的 release
dependency # 管理 chart 的依赖关系
fetch # 从存储库下载 chart 并(可选)将其解压缩到本地目录中
get # 下载一个命名 release
help # 列出所有帮助信息
history # 获取 release 历史
home # 显示 HELM_HOME 的位置
init # 在客户端和服务器上初始化Helm
inspect # 检查 chart 详细信息
install # 安装 chart 存档
lint # 对 chart 进行语法检查
list # releases 列表
package # 将 chart 目录打包成 chart 档案
plugin # 添加列表或删除 helm 插件
repo # 添加列表删除更新和索引 chart 存储库
reset # 从集群中卸载 Tiller
rollback # 将版本回滚到以前的版本
search # 在 chart 存储库中搜索关键字
serve # 启动本地http网络服务器
status # 显示指定 release 的状态
template # 本地渲染模板
test # 测试一个 release
upgrade # 升级一个 release
verify # 验证给定路径上的 chart 是否已签名且有效
version # 打印客户端/服务器版本信息
dep # 分析 Chart 并下载依赖
指定value.yaml部署一个chart
helm install –name els1 -f values.yaml stable/elasticsearch
升级一个chart
helm upgrade –set mysqlRootPassword=passwd db-mysql stable/mysql
helm upgrade go2cloud-api-doc go2cloud-api-doc/
回滚一个 chart
helm rollback db-mysql 1
删除一个 release
helm delete –purge db-mysql
只对模板进行渲染然后输出,不进行安装
helm install/upgrade xxx –dry-run –debug
列出仓库中chart
helm search repo bitnami
helm search repo aliyun
Helm Chart实战安装redis
helm search repo redis
将 redis chart 拉到本地
helm pull aliyun/redis
helm pull bitnami/redis
tar -xvf redis-18.4.0.tgz
cat redis/values.yaml
查看镜像地址
cat redis/values.yaml |grep -C 3 image:
registry: repo.k8s.local/docker.io
repository: bitnami/redis
tag: 7.2.3-debian-11-r1
--
## image: your-image
## imagePullPolicy: Always
## ports:
## - name: portname
--
## image: your-image
## imagePullPolicy: Always
## command: ['sh', '-c', 'echo "hello world"']
##
--
## image: your-image
## imagePullPolicy: Always
## ports:
## - name: portname
--
## image: your-image
## imagePullPolicy: Always
## command: ['sh', '-c', 'echo "hello world"']
##
--
image:
registry: repo.k8s.local/docker.io
repository: bitnami/redis-sentinel
tag: 7.2.3-debian-11-r1
--
image:
registry: repo.k8s.local/docker.io
repository: bitnami/redis-exporter
tag: 1.55.0-debian-11-r2
--
image:
registry: repo.k8s.local/docker.io
repository: bitnami/os-shell
tag: 11-debian-11-r91
--
image:
registry: repo.k8s.local/docker.io
repository: bitnami/os-shell
tag: 11-debian-11-r91
准备私仓镜像
docker pull bitnami/redis:7.2.3-debian-11-r1
docker pull bitnami/redis-sentinel:7.2.3-debian-11-r1
docker pull bitnami/redis-exporter:1.55.0-debian-11-r2
docker pull bitnami/os-shell:11-debian-11-r91
docker tag docker.io/bitnami/redis:7.2.3-debian-11-r1 repo.k8s.local/docker.io/bitnami/redis:7.2.3-debian-11-r1
docker tag docker.io/bitnami/redis-sentinel:7.2.3-debian-11-r1 repo.k8s.local/docker.io/bitnami/redis-sentinel:7.2.3-debian-11-r1
docker tag docker.io/bitnami/redis-exporter:1.55.0-debian-11-r2 repo.k8s.local/docker.io/bitnami/redis-exporter:1.55.0-debian-11-r2
docker tag docker.io/bitnami/os-shell:11-debian-11-r91 repo.k8s.local/docker.io/bitnami/os-shell:11-debian-11-r91
docker push repo.k8s.local/docker.io/bitnami/redis:7.2.3-debian-11-r1
docker push repo.k8s.local/docker.io/bitnami/redis-sentinel:7.2.3-debian-11-r1
docker push repo.k8s.local/docker.io/bitnami/redis-exporter:1.55.0-debian-11-r2
docker push repo.k8s.local/docker.io/bitnami/os-shell:11-debian-11-r91
修改镜像为私仓地址
cat redis/values.yaml | grep ‘registry: docker.io’
cat redis/values.yaml | grep ‘registry: ‘
sed -n "/registry: docker.io/{s/docker.io/repo.k8s.local\/docker.io/p}" redis/values.yaml
sed -i "/registry: docker.io/{s/docker.io/repo.k8s.local\/docker.io/}" redis/values.yaml
安装
选择集群模式
支持
- 独立模式
- 主从模式
- 哨兵模式
- 集群模式
独立模式
cat redis/values.yaml |grep architecture:
sed -rn '/architecture: /{s/architecture: (.*)/architecture: standalone/p}' redis/values.yaml
sed -ri '/architecture: /{s/architecture: (.*)/architecture: standalone/}' redis/values.yaml
主从模式
cat redis/values.yaml |grep architecture:
sed -rn '/architecture: /{s/architecture: (.*)/architecture: replication/p}' redis/values.yaml
sed -ri '/architecture: /{s/architecture: (.*)/architecture: replication/}' redis/values.yaml
设置副本数量
默认为3个,这里改2个
cat redis/values.yaml |grep replicaCount:
sed -rn '/replicaCount: /{s/replicaCount: (.*)/replicaCount: 2/p}' redis/values.yaml
sed -ri '/replicaCount: /{s/replicaCount: (.*)/replicaCount: 2/}' redis/values.yaml
选择Service类型
bitnami/redis默认使用clusterIP模式,如需外部访问可开NodePort
cat redis/values.yaml |grep "service:"
master:
service:
type: NodePort
replica:
service:
type: NodePort
修改存储StorageClass和密码
动态pv创建请参考前期存储文章
cat redis/values.yaml |grep "storageClass:"
sed -rn '/storageClass: /{s/storageClass: (.*)/storageClass: "managed-nfs-storage"/p}' redis/values.yaml
sed -ri '/storageClass: /{s/storageClass: (.*)/storageClass: "managed-nfs-storage"/}' redis/values.yaml
vi redis/values.yaml
storageClass: "managed-nfs-storage"
配置(可选):配置密码
cat redis/values.yaml |grep "password:"
sed -rn '/password: /{s/password: (.*)/password: "123456"/p}' redis/values.yaml
sed -ri '/password: /{s/password: (.*)/password: "123456"/}' redis/values.yaml
vi redis/values.yaml
password: "123456"
查看值
helm show values ./redis|grep replicaCount:
先检查语法
helm lint ./redis
==> Linting ./redis
1 chart(s) linted, 0 chart(s) failed
安装到test命名空间
这里使用主从模式安装
helm install luo-redis ./redis -n test –create-namespace
NAME: luo-redis
LAST DEPLOYED: Mon Dec 4 09:54:42 2023
NAMESPACE: test
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis
CHART VERSION: 18.4.0
APP VERSION: 7.2.3
** Please be patient while the chart is being deployed **
Redis® can be accessed on the following DNS names from within your cluster:
luo-redis-master.test.svc.cluster.local for read/write operations (port 6379)
luo-redis-replicas.test.svc.cluster.local for read-only operations (port 6379)
To get your password run:
export REDIS_PASSWORD=$(kubectl get secret --namespace test luo-redis -o jsonpath="{.data.redis-password}" | base64 -d)
To connect to your Redis® server:
1. Run a Redis® pod that you can use as a client:
kubectl run --namespace test redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image repo.k8s.local/docker.io/bitnami/redis:7.2.3-debian-11-r1 --command -- sleep infinity
Use the following command to attach to the pod:
kubectl exec --tty -i redis-client \
--namespace test -- bash
2. Connect using the Redis® CLI:
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h luo-redis-master
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h luo-redis-replicas
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace test svc/luo-redis-master 6379:6379 &
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1 -p 6379
查看
kubectl get all -n test
kubectl get pod -n test
kubectl get pods,svc -n test -owide
kubectl get pv,pvc -n test
kubectl describe pvc redis-data-luo-redis-master-0
删pvc
kubectl patch pvc redis-data-luo-redis-master-0 -p '{"metadata":{"finalizers":null}}' -n test
kubectl patch pvc redis-data-luo-redis-replicas-0 -p '{"metadata":{"finalizers":null}}' -n test
kubectl delete pvc redis-data-luo-redis-master-0 --grace-period=0 --force -n test
kubectl delete pvc redis-data-luo-redis-replicas-0 --grace-period=0 --force -n test
kubectl describe pod luo-redis-master-0 -n test
kubectl logs -f luo-redis-master-0 -n test
kubectl describe luo-redis-replicas-0 -n test
升级
helm upgrade luo-redis ./redis -n test
查看历史
helm history luo-redis
回退到指定版本
helm rollback luo-redis 3
删除
helm delete luo-redis -n test
查看数据文件
在nfs上查看
cd /nfs/k8s/dpv/test-redis-data-luo-redis-master-0-pvc-9d72c5b3-4cc4-444c-89f5-20487ed694d6
ll appendonlydir/
total 8
-rw-r--r--. 1 1001 root 88 Dec 4 09:54 appendonly.aof.1.base.rdb
-rw-r--r--. 1 1001 root 0 Dec 4 09:54 appendonly.aof.1.incr.aof
-rw-r--r--. 1 1001 root 88 Dec 4 09:54 appendonly.aof.manifest
客户端访问redis
方式一 没有redis-cli
按安装后的提示步骤创建客户端后连入redis master 查看信息
role:master
connected_slaves:3
slave0:ip=luo-redis-replicas-0.luo-redis-headless.test.svc.cluster.local,port=6379,state=online,offset=560,lag=1
slave1:ip=luo-redis-replicas-1.luo-redis-headless.test.svc.cluster.local,port=6379,state=online,offset=560,lag=1
slave2:ip=luo-redis-replicas-2.luo-redis-headless.test.svc.cluster.local,port=6379,state=online,offset=560,lag=1
kubectl -n test describe pod redis-client
kubectl scale deployment/redis-client -n test --replicas=0
kubectl delete pod redis-client -n test
方式二 有redis-cli
kubectl exec -it redis-master-0 -n redis -- redis-cli -h redis-master -a $(kubectl get secret --namespace redis redis -o jsonpath="{.data.redis-password}" | base64 -d)
调度redis从机
我们有2个node但pod有3个,并且部署在同一node上
kubectl get pods,svc -n test -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/luo-redis-master-0 1/1 Running 0 42m 10.244.2.99 node02.k8s.local <none> <none>
pod/luo-redis-replicas-0 1/1 Running 0 42m 10.244.2.100 node02.k8s.local <none> <none>
pod/luo-redis-replicas-1 1/1 Running 0 41m 10.244.1.187 node01.k8s.local <none> <none>
pod/luo-redis-replicas-2 1/1 Running 0 41m 10.244.2.101 node02.k8s.local <none> <none>
将redis从机改成2
修改 配置文件
vi redis/values.yaml
replica:
## @param replica.kind Use either DaemonSet or StatefulSet (default)
## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
##
kind: StatefulSet
## @param replica.replicaCount Number of Redis® replicas to deploy
##
replicaCount: 2
在线缩容为2个
kubectl scale sts/luo-redis-replicas -n test --replicas=2
kubectl get pods,svc -n test -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/luo-redis-master-0 1/1 Running 0 93m 10.244.2.99 node02.k8s.local <none> <none>
pod/luo-redis-replicas-0 1/1 Running 0 93m 10.244.2.100 node02.k8s.local <none> <none>
pod/luo-redis-replicas-1 1/1 Running 0 92m 10.244.1.187 node01.k8s.local <none> <none>
redis从机 已缩为2个,但pvc和pv依然存在,每个节点都有自己的Persistent Volume。如果删除或缩小 pod,与它们关联的卷将不会被删除,因此数据会保留
kubectl get pv,pvc -n test
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/redis-data-luo-redis-master-0 Bound pvc-9d72c5b3-4cc4-444c-89f5-20487ed694d6 8Gi RWO managed-nfs-storage 93m
persistentvolumeclaim/redis-data-luo-redis-replicas-0 Bound pvc-521abe8f-918e-4940-99df-9647a2de33c8 8Gi RWO managed-nfs-storage 93m
persistentvolumeclaim/redis-data-luo-redis-replicas-1 Bound pvc-5f7ef942-1cef-45bd-8adf-15126cdcf8de 8Gi RWO managed-nfs-storage 92m
persistentvolumeclaim/redis-data-luo-redis-replicas-2 Bound pvc-56ccb5a3-43bb-4713-a927-d74332e8b673 8Gi RWO managed-nfs-storage 91m
在线扩容为3个
当你upgrade发布时,其修订号会增加。在内部,Helm 存储版本的所有修订,允许你在需要时返回到以前的修订
helm upgrade luo-redis ./redis -n test --set cluster.replicaCount=3
helm upgrade luo-redis ./redis -n test --set cluster.replicaCount=3 --reuse-values
传入–reuse-values,它指示 Helm 将你的更改基于已部署的版本,保留以前的配置。
要回滚版本,请使用helm rollback
helm list -n test
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
luo-redis test 2 2023-12-04 15:41:19.336430771 +0800 CST deployed redis-18.4.0 7.2.3
helm history -n test luo-redis
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Dec 4 15:34:40 2023 superseded redis-18.4.0 7.2.3 Install complete
2 Mon Dec 4 15:41:19 2023 superseded redis-18.4.0 7.2.3 Upgrade complete
3 Mon Dec 4 16:01:56 2023 deployed redis-18.4.0 7.2.3 Upgrade complete
回滚第一版
helm rollback luo-redis -n test 1
Rollback was a success! Happy Helming!
查看历史版本
helm history -n test luo-redis
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Dec 4 15:34:40 2023 superseded redis-18.4.0 7.2.3 Install complete
2 Mon Dec 4 15:41:19 2023 superseded redis-18.4.0 7.2.3 Upgrade complete
3 Mon Dec 4 16:01:56 2023 superseded redis-18.4.0 7.2.3 Upgrade complete
4 Mon Dec 4 16:16:04 2023 deployed redis-18.4.0 7.2.3 Rollback to 1
安装和后续升级
values.yaml 中包含了默认的安装参数,但是诸如数据库的ip、username、password,若我们不想去修改安装包,如何在安装的时候进行覆盖呢?我们只要在 install 时使用 set 选项,设置想要覆盖的参数值即可。
Helm install myChart-test myChart–set config.mysql.server=100.71.32.11
用户也可以在安装时指定自己的values.yaml配置。例如用户在升级的时候用 upgrade 命令,指定新的参数配置文件,即可实现在原有部署好的应用的基础上变更配置。命令如下:
install myChart-test02 myChart -f my-values.yaml
Helm upgrade myChart-test02 myChart -f my-new-values.yaml
No Responses (yet)
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.