Skip to content


k8s_安装14_helm_redis

什么是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

Posted in Memcached/redis, 安装k8s/kubernetes.

Tagged with , , .


No Responses (yet)

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.



Some HTML is OK

or, reply to this post via trackback.