首页 > 数据库 >K8s Helm部署redis高可用

K8s Helm部署redis高可用

时间:2023-02-03 16:24:46浏览次数:45  
标签:K8s yaml redis server1 helm Helm ha root

一、Helm

Helm是Kubernetes 应用的包管理工具,主要用来管理 Charts,类似Linux系统的yum。

Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。

对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。

对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。

Helm当前最新版本 v3.1.2 官网:https://helm.sh/docs/intro/

Helm V3 与 V2 最大的区别在于去掉了tiller:

二、Helm安装

安装包的下载地址:https://github.com/helm/helm/releases,最新版本3.2.1.

下载软件包:helm-v3.2.1-linux-amd64.tar.gz

解压:

[root@server1 ~]# tar zxf helm-v3.2.1-linux-amd64.tar.gz

[root@server1 ~]# cd linux-amd64/

[root@server1 linux-amd64]# ls

helm LICENSE README.md

[root@server1 linux-amd64]# cp helm /usr/local/bin/

 

使命令自动补齐:

[root@server1 linux-amd64]# echo "source <(helm completion bash)" >> ~/.bashrc

[root@server1 linux-amd64]# source ~/.bashrc

 

helm部署完成。

三、Helm仓库的使用

搜索官方helm hub chart库:

[root@server1 linux-amd64]# helm search hub redis

 

Helm 添加第三方 Chart 库:

添加微软库:

[root@server1 linux-amd64]# helm repo add stable http://mirror.azure.cn/kubernetes/charts/

"stable" has been added to your repositories

 

添加第三库之后就可以使用以下方式查询:

[root@server1 linux-amd64]# helm search repo redis

 

注意:加-l选项可以查看历史版本

这里也可以添加阿里云的库,但是不建议,因为阿里云的镜像版本比较老。

删除第三方库:

[root@server1 linux-amd64]# helm repo remove aliyun

"aliyun" has been removed from your repositories

 

四、使用Helm部署redis-ha

拉取部署文件

[root@server1 linux-amd64]# helm pull stable/redis-ha

[root@server1 linux-amd64]# ls

helm LICENSE README.md redis-ha-4.4.4.tgz

 

不指定标签时默认拉取最新版本,拉取下来是一个压缩包

解压

[root@server1 linux-amd64]# tar zxf redis-ha-4.4.4.tgz -C /root/helm

 

[root@server1 linux-amd64]# cd

[root@server1 ~]# cd helm/

[root@server1 helm]# ls

redis-ha

[root@server1 helm]# cd redis-ha/

[root@server1 redis-ha]# ls

Chart.yaml ci OWNERS README.md templates values.yaml

 

上述文件中README.md 为帮助文档,目录templates中为模板部署文件,部署文件中的变量都保存在values.yaml文件中,因此我们在部署应用时只需要更改values.yaml文件即可。

查看目录结构:

[root@server1 redis-ha]# tree .

.

├── Chart.yaml

├── ci

│ └── haproxy-enabled-values.yaml

├── OWNERS

├── README.md

├── templates

│ ├── _configs.tpl

│ ├── _helpers.tpl

│ ├── NOTES.txt

│ ├── redis-auth-secret.yaml

│ ├── redis-ha-announce-service.yaml

│ ├── redis-ha-configmap.yaml

│ ├── redis-ha-exporter-script-configmap.yaml

│ ├── redis-ha-pdb.yaml

│ ├── redis-haproxy-deployment.yaml

│ ├── redis-haproxy-serviceaccount.yaml

│ ├── redis-haproxy-servicemonitor.yaml

│ ├── redis-haproxy-service.yaml

│ ├── redis-ha-rolebinding.yaml

│ ├── redis-ha-role.yaml

│ ├── redis-ha-serviceaccount.yaml

│ ├── redis-ha-servicemonitor.yaml

│ ├── redis-ha-service.yaml

│ ├── redis-ha-statefulset.yaml

│ └── tests

│ ├── test-redis-ha-configmap.yaml

│ └── test-redis-ha-pod.yaml

└── values.yaml

 

更改变量文件

[root@server1 redis-ha]# vim values.yaml

 

这里需要镜像redis: 5.0.6-alpine,更改镜像路径,我已经下载下来放到了私有仓库。

还需要更改副本数,我这里设置的2,即一主一从。

部署redis高可用集群

支持多种安装方式:(helm默认读取~/.kube/config信息连接k8s集群)

$ helm install redis-ha stable/redis-ha

$ helm install redis-ha redis-ha-4.4.0.tgz

$ helm install redis-ha path/redis-ha

$ helm install redis-ha https://example.com/charts/redis-ha-4.4.0.tgz

$ helm pull stable/redis-ha //拉取应用到本地

$ helm status redis-ha //查看状态

$ helm uninstall redis-ha //卸载

注意:以上操作均是在默认的namespace下的示例,其他namespace需要加-n选项

1我们这里直接安装:

[root@server1 redis-ha]# kubectl create namespace redis

namespace/redis created

[root@server1 redis-ha]# helm install redis-ha . -n redis

 

其中redis-ha为名称,上述命令表示使用当前目录的部署文件在redis命名空间中创建名为redis-ha的高可用集群。

创建后查看:

[root@server1 redis-ha]# kubectl -n redis get all

NAME READY STATUS RESTARTS AGE

pod/redis-ha-server-0 2/2 Running 0 28s

pod/redis-ha-server-1 2/2 Running 0 19s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

service/redis-ha ClusterIP None <none> 6379/TCP,26379/TCP 29s

service/redis-ha-announce-0 ClusterIP 10.105.143.195 <none> 6379/TCP,26379/TCP 29s

service/redis-ha-announce-1 ClusterIP 10.101.152.37 <none> 6379/TCP,26379/TCP 29s

NAME READY AGE

statefulset.apps/redis-ha-server 2/2 29s

 

可以看到创建了两个pod,其中server-0为master,还有两个svc和一个statefulset控制器。

测试集群高可用

每个pod中有两个容器redis和sentinel,我们进入redis容器查看:

[root@server1 redis-ha]# kubectl -n redis exec -it redis-ha-server-0 -c redis -- sh

/data $ redis-cli

127.0.0.1:6379> info Replication

# Replication

role:master

connected_slaves:1

min_slaves_good_slaves:1

slave0:ip=10.101.152.37,port=6379,state=online,offset=25236,lag=0

master_replid:4baa1ff233604d357f9a5b2d6b100f90192d309c

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:25236

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:25236

 

使用info Replication来差可能主机信息,可以看出redis-ha-server-0为master主机。

执行SHUTDOWN命令来使主机宕机:

127.0.0.1:6379> SHUTDOWN

command terminated with exit code 137

 

宕机后控制器会马上帮我们启动一个pod:

[root@server1 redis-ha]# kubectl get pod -n redis

NAME READY STATUS RESTARTS AGE

redis-ha-server-0 2/2 Running 1 4m57s

redis-ha-server-1 2/2 Running 0 4m48s

 

继续进入redis-ha-server-0查看

[root@server1 redis-ha]# kubectl -n redis exec -it redis-ha-server-0 -c redis -- sh

/data $ redis-cli

127.0.0.1:6379> info Replication

# Replication

role:master

...

 

可以看出redis-ha-server-0还是master,由于pod重建太快以至于主从还没有来得及切换。

我们再次使其宕机:

127.0.0.1:6379> SHUTDOWN

not connected> command terminated with exit code 137

 

这时查看pod,就可以发现pod重建的比较慢了:

[root@server1 redis-ha]# kubectl get pod -n redis

NAME READY STATUS RESTARTS AGE

redis-ha-server-0 1/2 NotReady 1 5m41s

redis-ha-server-1 2/2 Running 0 5m32s

[root@server1 redis-ha]# kubectl get pod -n redis

NAME READY STATUS RESTARTS AGE

redis-ha-server-0 1/2 NotReady 1 5m43s

redis-ha-server-1 2/2 Running 0 5m34s

[root@server1 redis-ha]# kubectl get pod -n redis

NAME READY STATUS RESTARTS AGE

redis-ha-server-0 1/2 CrashLoopBackOff 1 5m54s

redis-ha-server-1 2/2 Running 0 5m45s

[root@server1 redis-ha]# kubectl get pod -n redis

NAME READY STATUS RESTARTS AGE

redis-ha-server-0 2/2 Running 2 6m16s

redis-ha-server-1 2/2 Running 0 6m7s

 

等重建好了之后再次查看pod角色:

[root@server1 redis-ha]# kubectl -n redis exec -it redis-ha-server-0 -c redis -- sh

/data $ redis-cli

127.0.0.1:6379> info Replication

# Replication

role:slave

master_host:10.101.152.37

master_port:6379

...

 

可以看出redis-ha-server-0已经变成了从机,而主机的ip为10.101.152.37,这时就实现了主从的切换。

访问master主机:

/data $ nslookup redis-ha.redis.svc.cluster.local #通过解析查看master主机

nslookup: can't resolve '(null)': Name does not resolve

Name: redis-ha.redis.svc.cluster.local

Address 1: 10.244.1.127 redis-ha-server-0.redis-ha.redis.svc.cluster.local

Address 2: 10.244.2.109 10-244-2-109.redis-ha-announce-1.redis.svc.cluster.local

/data $ redis-cli -h redis-ha-announce-1.redis.svc.cluster.local

redis-ha-announce-1.redis.svc.cluster.local:6379> info Replication

# Replication

role:master

connected_slaves:1

min_slaves_good_slaves:1

slave0:ip=10.105.143.195,port=6379,state=online,offset=57996,lag=1

master_replid:f475aa004c2eb055a0a19b59e52e88cf90b6219d

master_replid2:564b948de16fb4db8b30a8a57c3d64d447b1252f

master_repl_offset:57996

second_repl_offset:7242

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:594

repl_backlog_histlen:57403

redis-ha-announce-1.redis.svc.cluster.local:6379>

 

 

可以看出redis-ha-server-1变成了master主机,有一个slave主机。

集群的动态拉伸

可以直接更改变量文件中的副本数量实现集群的动态拉伸:

[root@server1 redis-ha]# vim values.yaml

 

将副本数更改为3.

使用upgrade选项更新集群:

[root@server1 redis-ha]# helm -n redis upgrade redis-ha .

 

更新后查看pod可以看出已经变成了3个:

[root@server1 redis-ha]# kubectl -n redis get pod

NAME READY STATUS RESTARTS AGE

redis-ha-server-0 2/2 Running 2 20m

redis-ha-server-1 2/2 Running 0 20m

redis-ha-server-2 0/2 Pending 0 12s

 

 

也可以使用以下命令查看更新历史以便回滚:

[root@server1 redis-ha]# helm -n redis history

Error: "helm history" requires 1 argument

Usage: helm history RELEASE_NAME [flags]

[root@server1 redis-ha]# helm -n redis history redis-ha

REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION

1 Sun May 10 23:15:35 2020 superseded redis-ha-4.4.4 5.0.6 Install complete

2 Sun May 10 23:35:35 2020 deployed redis-ha-4.4.4 5.0.6 Upgrade complete

 

 

实验后删除:

[root@server1 redis-ha]# helm uninstall redis-ha -n redis

release "redis-ha" uninstalled

[root@server1 redis-ha]# kubectl -n redis get pod

No resources found in redis namespace.

[root@server1 redis-ha]# kubectl delete namespaces redis

namespace "redis" deleted

标签:K8s,yaml,redis,server1,helm,Helm,ha,root
From: https://www.cnblogs.com/jjjjylstudy/p/17089660.html

相关文章

  • Helm部署应用实践
    一、构建私有helmrepo仓库     此处使用harbor仓库作为helmrepo,使用内部统一的harbor仓库:https://harbor.xxx.com/1、harbor仓库启用helmchart服务   ......
  • Redis-exporter部署及集群监控
    Redis-exporter服务端口:9121部署安装包:redis_exporter-v1.33.0.linux-amd64.tar.gz运行条件:go环境安装go:yuminstall-yepel-releaseyuminstall-ygolang下载......
  • helm与ingress
    https://helm.sh/zh/docs/intro/install/https://kubernetes.github.io/ingress-nginx/deploy/......
  • k8s namespace kubeDNS
       图中kube-dns只是一个service,但是他对外提供k8s集群内部的dns服务,真正的dnsserver,是coredns这几个podk8snamespace的作用只是提供逻辑上的组件隔离例如pod......
  • k8s 关于pull image failed 问题
    问题描述:Failedtopullimage"nginx":rpcerror:code=Unknowndesc=failedtopul解决办法:1,注意虚拟机时间同步  chronycsources2,注意修改containerd配置......
  • Redis布隆过滤器
    一:什么是布隆过滤器布隆过滤器(BloomFilter)是Redis4.0版本提供的新功能,它被作为插件加载到Redis服务器中,给Redis提供强大的去重功能。当布隆过滤器判定某个值......
  • Redis启动服务报错:服务没有及时响应启动或者控制请求
    Redis启动服务报错:服务没有及时响应启动或者控制请求,解决方案之一1、问题:在redis.conf文件修改密码之后,重启服务报错:服务没有及时响应启动或者控制请求;2、原因:redi......
  • 【Redis】缓存穿透、击穿和雪崩
    目录Redis的缓存穿透概念解决方案存在的问题Redis的缓存击穿概念:解决方案Redis的缓存雪崩概念:解决方案Redis的缓存穿透缓存穿透前提是:Redis和MySQL中都没有,然后不停的直......
  • Redis面试题整理
    Redis是单线程还是多线程?Redis6.0的版本之前的单线程是指网络IO和键值对读写是由单个线程去完成的.而Redis6.0增加的多线程,是指Redis在网络请求的情况下是采用了多线......
  • 【Redis集群】如何配置主从复制模式?
    目录前言概念环境配置(单机集群)基本查看命令开启三台服务前言默认情况下,每台Redis服务器都是主节点;由于个人服务器性能原因,以下的所有操作都是单机集群的概念!在实际工作......