環(huán)境準備
準備Kubernetes
首先你需要一個Kubernetes集群,如圖我已經安裝好了一個Kubernetes集群:
如果你還沒有Kubernetes集群可參考我寫的文章:https://blog.csdn.net/m0_51510236/article/details/130842122
準備存儲類
你還需要一個可動態(tài)供應的存儲類,我之前已經寫過一篇關于安裝NFS動態(tài)供給存儲類的文章:https://blog.csdn.net/m0_51510236/article/details/132641343(這篇文章的上半部分),如圖我已經安裝好了一個NFS的存儲類(名字為 nfs-client
):
部署redis
我之前寫過一篇在物理機上安裝高可用多主多從的redis集群的文章:https://blog.csdn.net/m0_51510236/article/details/132684529,這篇文章參考的那片物理機上安裝集群的步驟來。
準備一個命名空間
為了貼近生產環(huán)境,我們先創(chuàng)建一個命名空間:
命令創(chuàng)建
kubectl create namespace deploy-test
yaml文件創(chuàng)建(推薦)
apiVersion: v1
kind: Namespace
metadata:
name: deploy-test
spec: {}
status: {}
準備redis配置文件
首先我們需要一個Redis的配置文件,我已經準備好了,注意名字命名為 redis.conf
:
# 關閉保護模式
protected-mode no
# 日志級別
loglevel warning
# 日志存放目錄
logfile "/data/redis.log"
# 數據文件目錄
dir /data
dbfilename dump.rdb
# 數據庫數量
databases 16
# 保存數據庫到數據文件
save 900 1
save 300 10
save 60 10000
# 集群相關配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
先把這個文件復制到服務器上,如圖:
然后我們需要創(chuàng)建一個ConfigMap,可以直接通過下面命令生產ConfigMap的yaml資源清單文件:
kubectl create configmap redis-cluster-config --from-file=redis.conf -n deploy-test --dry-run=client -o yaml
生成了如圖:
因為我們真實部署中可能還會將這個應用部署到其他集群,所以我們記得保存這個配置文件:
apiVersion: v1
data:
redis.conf: |
# 關閉保護模式
protected-mode no
# 日志級別
loglevel warning
# 日志存放目錄
logfile "/data/redis.log"
# 數據文件目錄
dir /data
dbfilename dump.rdb
# 數據庫數量
databases 16
# 保存數據庫到數據文件
save 900 1
save 300 10
save 60 10000
# 集群相關配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
kind: ConfigMap
metadata:
name: redis-cluster-config
namespace: deploy-test
我們將這個內容保存到一個文件中,如 redis-deploy.yaml
:
準備部署statefulset的資源清單文件
資源清單文件我已經準備好了,下面有詳細的說明:
# 創(chuàng)建一個Redis部署要用到的Service
apiVersion: v1
kind: Service
metadata:
name: deploy-redis-svc
namespace: deploy-test
labels:
app: redis
spec:
ports:
- port: 6379
name: redis
targetPort: 6379
nodePort: 30379
selector:
app: redis
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-redis
namespace: deploy-test
spec:
selector:
matchLabels:
app: redis
# 引用上面定義的Service
serviceName: "deploy-redis-svc"
# 注意這里部署六個節(jié)點,按照本篇文章的邏輯最好不要修改
replicas: 6
template:
metadata:
labels:
app: redis
spec:
terminationGracePeriodSeconds: 10
containers:
- command:
# 這里指定使用那個配置文件啟動redis-server
- "redis-server"
- "/usr/local/etc/redis.conf"
name: redis
# 因為redis6集群對域名支持不好,并且Kubernetes是需要通過域名連接各個pod的,所以我們采用redis7來完成這次部署
# 如果你能拉取到DockerHub上的鏡像那么你就使用這個
# image: docker.io/library/redis:7.0.12
# 如果你拉取不到,那么就使用我拉取并推送到國內阿里云的鏡像
image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/redis:7.0.12
ports:
- containerPort: 6379
name: redis
volumeMounts:
# 掛載redis的數據卷,使用的是我在下面聲明的存儲類模版
- name: redis-data
mountPath: /data
# 掛載redis的配置文件
- name: redis-config
mountPath: /usr/local/etc
readOnly: true
volumes:
# 讀取configmap,獲取redis的配置文件,方便上面掛載這個配置文件
- name: redis-config
configMap:
name: redis-cluster-config
items:
- key: redis.conf
path: redis.conf
# 定義存儲類模版
volumeClaimTemplates:
- metadata:
name: redis-data # 這個名字要與上面的對應
namespace: deploy-test
spec:
accessModes:
- ReadWriteMany # 設置多節(jié)點讀寫模式
resources:
requests:
storage: 1Gi # 申請1個g的存儲空間,可根據自己的服務器空間修改
storageClassName: nfs-client # 這里填寫你存儲類的名字
完整的資源清單文件內容:
apiVersion: v1
kind: Namespace
metadata:
name: deploy-test
spec: {}
status: {}
---
apiVersion: v1
data:
redis.conf: |
# 關閉保護模式
protected-mode no
# 日志級別
loglevel warning
# 日志存放目錄
logfile "/data/redis.log"
# 數據文件目錄
dir /data
dbfilename dump.rdb
# 數據庫數量
databases 16
# 保存數據庫到數據文件
save 900 1
save 300 10
save 60 10000
# 集群相關配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
kind: ConfigMap
metadata:
name: redis-cluster-config
namespace: deploy-test
---
apiVersion: v1
kind: Service
metadata:
name: deploy-redis-svc
namespace: deploy-test
labels:
app: redis
spec:
ports:
- port: 6379
name: redis
targetPort: 6379
nodePort: 30379
selector:
app: redis
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-redis
namespace: deploy-test
spec:
selector:
matchLabels:
app: redis
serviceName: "deploy-redis-svc"
replicas: 6
template:
metadata:
labels:
app: redis
spec:
terminationGracePeriodSeconds: 10
containers:
- command:
- "redis-server"
- "/usr/local/etc/redis.conf"
name: redis
# image: docker.io/library/redis:7.0.12
image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/redis:7.0.12
ports:
- containerPort: 6379
name: redis
volumeMounts:
- name: redis-data
mountPath: /data
- name: redis-config
mountPath: /usr/local/etc
readOnly: true
volumes:
- name: redis-config
configMap:
name: redis-cluster-config
items:
- key: redis.conf
path: redis.conf
volumeClaimTemplates:
- metadata:
name: redis-data
namespace: deploy-test
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
執(zhí)行文件完成部署
我們可以使用這行命令執(zhí)行這個文件完成部署:
kubectl apply -f redis-deploy.yaml
執(zhí)行后如圖:
可以通過這行命令監(jiān)控它的部署:
watch kubectl get all -o wide -n deploy-test
看到6個pod都已經成功運行起來了:
初始化集群
我們部署的pod是statefulset類型的pod,所以我們訪問pod的域名格式為 pod名字.service名字.命名空間.svc.cluster.local
,所以我們在集群中訪問六個redis的地址分別為:
deploy-redis-0.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-1.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-2.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-3.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-4.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-5.deploy-redis-svc.deploy-test.svc.cluster.local:6379
接下來我們需要去到里面的任何一個pod,去執(zhí)行一行命令,使用這行命令進入到第一個pod:
# 注意修改你自己的命名空間和pod名字
kubectl exec -itn deploy-test pod/deploy-redis-0 bash
進入后如圖:
然后我們執(zhí)行一下下面這行命令:
redis-cli --cluster create --cluster-replicas 1 \
deploy-redis-0.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-1.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-2.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-3.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-4.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-5.deploy-redis-svc.deploy-test.svc.cluster.local:6379
執(zhí)行后會出現這個提示:
它問我們這樣的一個分配方式行不行,這里直接輸入yes然后回車,接下來看到下面這個畫面代表集群配置成功:
我們接下來使用這行命令來進入集群:
# -c 的意思是進入集群
redis-cli -c
然后我們輸入這行命令來查看集群里的節(jié)點:
CLUSTER NODES
可以看到是三master三node的redis集群:文章來源:http://www.zghlxwxcb.cn/news/detail-699901.html
到這里Kubernetes上搭建redis高可用集群就已經完畢了。文章來源地址http://www.zghlxwxcb.cn/news/detail-699901.html
到了這里,關于Kubernetes(k8s)部署高可用多主多從的Redis集群的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!