什么是Kubernetes分布式容器管理平臺(tái)
PaaS平臺(tái)redis-sentinel集群架構(gòu)簡(jiǎn)介
PaaS平臺(tái)部署redis哨兵集群
redis-sentinel容器測(cè)試及驗(yàn)證
redis-sentienl容器集群之客戶(hù)端程序?qū)崿F(xiàn)
Kubernetes是一個(gè)開(kāi)源的容器集群管理系統(tǒng),可以實(shí)現(xiàn)容器集群的自動(dòng)化部署、自動(dòng)擴(kuò)縮容、維護(hù)更新等功能,是當(dāng)下較熱門(mén)的PSSA集群技術(shù)之一。
Kubernetes的主要核心組件:
●Apiserver:
apiserver提供了資源操作的唯一入口,并提供認(rèn)證、授權(quán)、訪問(wèn)控制、API注冊(cè)和發(fā)現(xiàn)等機(jī)制,封裝了核心對(duì)象的增刪改查操。
●scheduler:
負(fù)責(zé)集群資源的調(diào)度和管理,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的機(jī)器上。
●controller-manager:
負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測(cè)、自動(dòng)擴(kuò)展、滾動(dòng)更新等。
●kubelet:
運(yùn)行在minion節(jié)點(diǎn),負(fù)責(zé)維護(hù)容器的生命周期,同時(shí)也負(fù)責(zé)Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理,例如啟停容器,監(jiān)控運(yùn)行狀態(tài)等。
●etcd:
etcd是一個(gè)高可用的鍵值存儲(chǔ)系統(tǒng)。
●flannel:
為集群中的所有節(jié)點(diǎn)重新規(guī)劃IP地址的使用規(guī)則。
●pod:
它是Kubernetes資源中最小的調(diào)度單元,也是基礎(chǔ)單元。
Kubernetes架構(gòu)圖:
Kubernetes中創(chuàng)建pod過(guò)程:
用戶(hù)通過(guò) REST API 創(chuàng)建一個(gè) Pod。
apiserver 將其寫(xiě)入 Etcd數(shù)據(jù)庫(kù)。
scheduluer 檢測(cè)到未綁定 Node 的 Pod,開(kāi)始調(diào)度并更新 Pod 的 Node 綁定。
kubelet 檢測(cè)到有新的 Pod 調(diào)度過(guò)來(lái),通過(guò) container runtime 運(yùn)行該 Pod。
kubelet 通過(guò) container runtime 獲取取到 Pod 狀態(tài)并更新到 apiserver 中。
使用Kubernetes部署服務(wù)的幾個(gè)好處:
1)服務(wù)自動(dòng)故障遷移;
2)自動(dòng)資源調(diào)度;
3)實(shí)現(xiàn)資源隔離;
4)采用docker容器;
5)RBAC認(rèn)證增加了Kubernetes的安全。
Kubernetes的優(yōu)勢(shì):
1)可移動(dòng):公有云、私有云、混合云、多態(tài)云;
2)可擴(kuò)展:模塊化、插件化、可掛載、可組合;
3)自修復(fù):自動(dòng)部署、自動(dòng)重啟、自動(dòng)復(fù)制、自動(dòng)伸縮。
redis哨兵架構(gòu)介紹:
● Redis Sentinel是一個(gè)分布式系統(tǒng),RedisSentinel為Redis提供高可用性??梢栽跊](méi)有人為干預(yù)的情況下阻止某種類(lèi)型的故障。
●可以在一個(gè)架構(gòu)中運(yùn)行多個(gè)Sentinel,這些進(jìn)程使用gossip協(xié)議來(lái)接收關(guān)于主服務(wù)器是否下線的信息,并使用投票協(xié)議(agreement protocols)來(lái)決定是否執(zhí)行自動(dòng)故障遷移, 以及選擇哪個(gè)從服務(wù)器作為新的主服務(wù)器。
PaaS平臺(tái)redis-sentinel架構(gòu)圖工作流程圖:
redis-sentinel鏡像準(zhǔn)備,使用dockerfile構(gòu)建如下鏡像:
Redis Sentienl鏡像
al_redis_sentinel_v2_4.0.10.tar
Redis master鏡像
al_redis-sentinel_master_4.0.10.tar
Redis slave鏡像
al_redis_slave_4.0.10.tar
編寫(xiě)redis-sentinel網(wǎng)絡(luò)清單文件:
vim redis_sentinel.yaml
---
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "2"
labels:
service_name: redis-sentinel1
name: redis-sentinel1
namespace: core-610
spec:
replicas: 1
revisionHistoryLimit: 5
selector:
matchLabels:
service_name: redis-sentinel1
strategy:
rollingUpdate:
maxSurge: 0%
maxUnavailable: 100%
type: RollingUpdate
template:
metadata:
annotations:
service.alauda.io/version: "5"
labels:
service_name: redis-sentinel1
namespace: core-610
spec:
affinity:
podAffinity: {}
podAntiAffinity: {}
containers:
- env:
- name: REDIS_SENTINEL_PORT
value: "26378"
- name: MASTER_NAME
value: mymaster
- name: MASTER_HOST
value: 192.168.1.94
- name: MASTER_PORT
value: "6378"
- name: QUONUM
value: "1"
- name: DOWN_AFTER_MILLSECONDS
value: "8000"
- name: NUMSLAVES
value: "1"
- name: FAILOVER_TIMEOUT
value: "60000"
- name: AUTH_PASS
value: xxxxxx
image:xxx.xxx.xxx.xxx/pro568/al_redis_sentinel:4.0.10
imagePullPolicy: Always
name: redis-sentinel1
resources:
limits:
cpu: "0.5"
memory: 512Mi
requests:
cpu: "0.5"
memory: 512Mi
terminationMessagePath:/dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data
name: redis-sentinel1
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 10
volumes:
- name: redis-sentinel1
persistentVolumeClaim:
claimName: redis-sentinel1
---
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
service_name: redis-master1
name: redis-master1
namespace: core-610
spec:
replicas: 1
revisionHistoryLimit: 5
selector:
matchLabels:
service_name: redis-master1
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
annotations:
service.alauda.io/version: "1"
labels:
service_name: redis-master1
namespace: core-610
spec:
affinity:
podAffinity: {}
podAntiAffinity: {}
containers:
- env:
- name: REDIS_PORT
value: "6378"
- name: REDIS_PASSWORD
value: xxxxxx
- name: __ALAUDA_FULL_NAME__
- name: __CREATE_TIME__
value: "2020-01-10T15:10:24"
- name: __ALAUDA_APP_NAME__
value: gzky-sentinel
- name: REDIS_MAXMEMORY
value: "536870912"
- name: __ALAUDA_SERVICE_NAME__
value: redis-master1
- name: __ALAUDA_SERVICE_VERSION__
value: "1060"
- name: __ALAUDA_OVER_COMMIT_CPU__
value: "512"
- name: __ALAUDA_OVER_COMMIT_MEM__
value: "512"
- name: MASTER_AUTH
value: xxxxxx
- name: MAXCLIENTS
value: "8000"
- name: __ALAUDA_CONTAINER_SIZE__
value: "0.5"
- name: __ALAUDA_REGION_NAME__
- name: __ALAUDA_SERVICE_ID__
value: redis-master1
image:xxx.xxx.xxx.xxx/pro568/al_redis-sent_master:4.0.10
imagePullPolicy: Always
name: redis-master1
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
terminationMessagePath:/dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data
name: redis-rep1
dnsPolicy: ClusterFirst
hostNetwork: true
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 10
volumes:
- name: redis-rep1
persistentVolumeClaim:
claimName: redis-rep1
---
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "2"
labels:
service_name: redis-slave-1
name: redis-slave-1
namespace: core-610
spec:
replicas: 1
revisionHistoryLimit: 5
selector:
matchLabels:
service_name: redis-slave-1
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
annotations:
service.alauda.io/version: "2"
labels:
service_name: redis-slave-1
namespace: core-610
spec:
affinity:
podAffinity: {}
podAntiAffinity: {}
containers:
- env:
- name: REDIS_PORT
value: "6378"
- name: REDIS_PASSWORD
value: xxxxxx
- name: __ALAUDA_FULL_NAME__
- name: __CREATE_TIME__
value: "2020-01-10T15:10:24"
- name: __ALAUDA_APP_NAME__
value: gzky-sentinel
- name: REDIS_MAXMEMORY
value: "536870912"
- name: __ALAUDA_SERVICE_NAME__
value: redis-slave-1
- name: __ALAUDA_SERVICE_VERSION__
value: "1057"
- name: __ALAUDA_OVER_COMMIT_CPU__
value: "512"
- name: __ALAUDA_OVER_COMMIT_MEM__
value: "512"
- name: REDIS_SLAVE_OF
value: 192.168.1.94 6378
- name: MASTER_AUTH
value: xxxxxx
- name: MAXCLIENTS
value: "8000"
- name: __ALAUDA_CONTAINER_SIZE__
value: "0.5"
- name: __ALAUDA_REGION_NAME__
- name: __ALAUDA_SERVICE_ID__
value: redis-slave-1
image:xxx.xxx.xxx.xxx/pro568/al_redis_slave:4.0.10
imagePullPolicy: Always
name: redis-slave-1
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
terminationMessagePath:/dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data
name: redis-rep1
dnsPolicy: ClusterFirst
hostNetwork: true
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 10
volumes:
- name: redis-rep1
persistentVolumeClaim:
claimName: redis-rep1
在PaaS平臺(tái)使用清單文件部署redis-sentinel容器集群。
執(zhí)行部署命令:
kubectl apply -fredis_sentinel.yaml
PaaS平臺(tái)查看redis-sentinelPOD運(yùn)行狀態(tài):
查看sentinel集群節(jié)點(diǎn)信息:
redis-cli -h 192.168.1.92 -p 26379
192.168.1.92:26379>sentinel master mymaster #查看主節(jié)點(diǎn)信息
192.168.1.92:26379>sentinelmaster slaves #查看從節(jié)點(diǎn)信息
客戶(hù)端寫(xiě)入測(cè)試數(shù)據(jù):
#客戶(hù)端連接master節(jié)點(diǎn),寫(xiě)入一條數(shù)據(jù)
[root@node3~]# redis-cli -h 192.168.1.94 -p 6378
192.168.1.94:6378>set foo bar
OK
192.168.1.94:6379>get foo
"bar"
#然后客戶(hù)端再連接任意slave節(jié)點(diǎn),通過(guò)get獲取上面的那條數(shù)據(jù)
[root@node1~]# redis-cli -h 192.168.1.95 -p 6379
192.168.1.95:6378>get foo
"bar"
master節(jié)點(diǎn)可以寫(xiě)入和讀取;而slave節(jié)點(diǎn)默認(rèn)只能讀取而不能寫(xiě)入。以此實(shí)現(xiàn)主從復(fù)制、讀寫(xiě)分離。
客戶(hù)端實(shí)現(xiàn)原理:
redis哨兵模式客戶(hù)端程序?qū)崿F(xiàn)過(guò)程描述:
連接所有的Sentinel的節(jié)點(diǎn),返回可一個(gè)可用的sentinel結(jié)合列表。
向可用的sentinel節(jié)點(diǎn)發(fā)送get-master-addr-by-name masterName請(qǐng)求;獲取redis節(jié)點(diǎn)(master/salve)和信息。
返回信息中會(huì)驗(yàn)證節(jié)點(diǎn)是否是master角色。
如果sentinel檢測(cè)到master節(jié)點(diǎn)變化,會(huì)failover。
實(shí)現(xiàn)讀寫(xiě)分離;讀走Slave,寫(xiě)走M(jìn)aster。
以上是今天帶來(lái)的基于K8S的redis哨兵模式的掃盲和實(shí)驗(yàn)案例,后續(xù)會(huì)繼續(xù)給大家?guī)?lái)具體使用中碰到的問(wèn)題,趟過(guò)的坑。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/130197.html
摘要:宋體是面向內(nèi)部基于打造的容器服務(wù)平臺(tái),旨在提升內(nèi)部研發(fā)效率,幫助改善規(guī)范研發(fā)流程。宋體作為容器編排框架,可以減輕配置部署管理和監(jiān)控大規(guī)模容器應(yīng)用的負(fù)擔(dān)。宋體核心原理宋體解釋不得不提中兩個(gè)最具價(jià)值的理念聲明式和控制器模式。KUN(Keep UCloud Nimble)是面向 UCloud 內(nèi)部、基于 Kubernetes 打造的容器服務(wù)平臺(tái),旨在提升內(nèi)部研發(fā)效率,幫助改善、規(guī)范研發(fā)流程。在 K...
摘要:時(shí)間年月日星期二說(shuō)明基于,開(kāi)始本教程前,請(qǐng)確保您的系統(tǒng)已安裝。為了保證集群的高可用,下面開(kāi)始配置哨兵模式。 時(shí)間:2017年07月11日星期二 說(shuō)明:基于Ubuntu16.04-64bit,開(kāi)始本教程前,請(qǐng)確保您的Linux系統(tǒng)已安裝Docker。 步驟一:Redis鏡像安裝 1、下載Redis鏡像 鏡像中心 推薦使用網(wǎng)易蜂巢的鏡像中心 地址:https://c.163.com/hub...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20