kubernetes配備redis cluster
33451 ワード
kubernetes配備redis cluster
前言
Redis clusterのクラスタ関係の維持は、ipに依存するのではなく、cluster内部の唯一のidに依存し、ipはクラスタ関係が初めて確立されたときに接続同士が使用され、メンバー接続の証明書として使用されず、代わりにidである.画外音:idを持つ限り、コンテナ再起動ipがどのように変化してもredis clusterのメンバー関係を維持することには影響しません.
ではidはどのように保存されていますか?redis clusterは、確立後、各プライマリ・スタンバイ・ノードにclusterノードのメタデータ・ファイルを保存するため、kubernetes内でpodが再起動した後、クラスタ関連のロール構成などが失われないように、このファイルを永続化する必要があるため、statefulSetを使用して配置するのに適しています.
配置
配置されたyamlファイルを直接貼り付けます.
導入の説明: redisプロファイルconfigmapを使用して をマウントには6つのノードが配置され、3つのマスター3は、公式ドキュメントで推奨される最小のクラスタ規模でもある. redis cluster nodeメタデータファイルは重要です.詳細は後述します.このファイルは、pvc/hostPathなどの方法で永続化する必要があります. redis-tribツールを使用してclusterを構築し、clusterを構築した後、後続のcluster関係の維持には必要ありません. ネット上には、headlessサービスを含む2つのサービスが配置されており、clusterを構築する際にサービス発見として使用される.正常なサービスと、クライアントに接続して使用します.しかし、このheadlessサービスは実際には必要ありません.clusterを建てるときは手動でpod ipを1回取ればいいです.無駄なサービス をもっと作る必要はありません.
永続化に問題がないと仮定すると、正常なpodが6つあるはずです.
クラスタの作成
そのため、クラスタを構築する操作は一度だけ実行する必要があります.後続のクラスタ関係redisノード間では、ノードメタデータファイルに基づいて自動的にメンテナンスされます.そのため、クラスタの構成を初期化するための環境を専門に配置します.配置ファイルは以下の通りです.
クラスタ構成ツールのインストール:
クラスタの初期化:
せつぞく
どちらかを選択
サービスを使用してip接続を固定するには、次の手順に従います.
プライマリ・スタンバイ・スイッチ
高可用性クラスタとして、プライマリ・スタンバイ・スイッチングは基本的な機能であり、スイッチング・プロセスで何が起こったかを見てみましょう.
興味があれば、複数のノードを同時に削除してみてください.6ノード、3つを主とし、raftのアルゴリズムに従って、主が掛けられた後にバックアップがあります.そのため、2主+2備以上のノードが同時に掛けられない限り、redisのサービスには影響しません.
前言
Redis clusterのクラスタ関係の維持は、ipに依存するのではなく、cluster内部の唯一のidに依存し、ipはクラスタ関係が初めて確立されたときに接続同士が使用され、メンバー接続の証明書として使用されず、代わりにidである.画外音:idを持つ限り、コンテナ再起動ipがどのように変化してもredis clusterのメンバー関係を維持することには影響しません.
ではidはどのように保存されていますか?redis clusterは、確立後、各プライマリ・スタンバイ・ノードにclusterノードのメタデータ・ファイルを保存するため、kubernetes内でpodが再起動した後、クラスタ関連のロール構成などが失われないように、このファイルを永続化する必要があるため、statefulSetを使用して配置するのに適しています.
配置
配置されたyamlファイルを直接貼り付けます.
apiVersion: v1
data:
redis.conf: |2
appendonly no
save 900 1
save 300 10
save 60 300
maxmemory 4GB
maxmemory-policy allkeys-lru
cluster-enabled yes
cluster-config-file /var/lib/redis/nodes.conf # cluster node
#cluster-node-timeout 5000 #
cluster-node-timeout 500 # 500ms,
dir /var/lib/redis
port 6379
kind: ConfigMap
metadata:
name: app-rds-cluster
namespace: default
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-rds-cluster
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Gi
storageClassName: cephfs
---
# redis cluster
apiVersion: v1
kind: Service
metadata:
name: app-rds-cluster
labels:
app: redis
spec:
ports:
- name: redis-port
port: 6379
selector:
app: app-rds-cluster
appCluster: redis-cluster
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: app-rds-cluster
spec:
serviceName: "app-rds-cluster"
replicas: 6
template:
metadata:
labels:
app: app-rds-cluster
appCluster: redis-cluster
spec:
terminationGracePeriodSeconds: 5
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- app-rds-cluster
topologyKey: kubernetes.io/hostname
containers:
- name: redis
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
image: redis:v4.0.14
command:
- "redis-server" #redis
args:
- "/etc/redis/redis.conf" #
# command: redis-server /etc/redis/redis.conf
resources: #
requests: #
cpu: "100m" #m , 0.1 cpu
memory: "100Mi" # 100m
limits:
cpu: "1" # 1 1
memory: "4096Mi" # 100m
ports:
- name: redis
containerPort: 6379
protocol: "TCP"
- name: cluster
containerPort: 16379
protocol: "TCP"
volumeMounts:
- name: "redis-conf" # configmap
mountPath: "/etc/redis"
- name: pvc
mountPath: "/var/lib/redis"
subPathExpr: $(POD_NAME)/data/
nodeSelector:
RDSDB: ''
volumes:
- name: "redis-conf"
configMap:
name: app-rds-cluster
- name: pvc
persistentVolumeClaim:
claimName: app-rds-cluster
導入の説明:
永続化に問題がないと仮定すると、正常なpodが6つあるはずです.
[root@008019 redis-cluster]# kubectl get pods -o wide --all-namespaces | grep app-rds-cluster
default app-rds-cluster-0 1/1 Running 0 5m1s 172.36.4.43 008031 <none> <none>
default app-rds-cluster-1 1/1 Running 0 4m58s 172.36.1.30 008020 <none> <none>
default app-rds-cluster-2 1/1 Running 0 4m56s 172.36.6.21 020203 <none> <none>
default app-rds-cluster-3 1/1 Running 0 4m53s 172.36.5.25 008032 <none> <none>
default app-rds-cluster-4 1/1 Running 0 4m51s 172.36.0.198 008019 <none> <none>
default app-rds-cluster-5 1/1 Running 0 4m48s 172.36.3.134 020204 <none> <none>
# pod ip,
[root@008019 redis-cluster]# echo `kubectl get pods -o wide --all-namespaces | grep app-rds-cluster | awk '{print $7":6379"}'`
172.36.4.43:6379 172.36.1.30:6379 172.36.6.21:6379 172.36.5.25:6379 172.36.0.198:6379 172.36.3.134:6379
クラスタの作成
そのため、クラスタを構築する操作は一度だけ実行する必要があります.後続のクラスタ関係redisノード間では、ノードメタデータファイルに基づいて自動的にメンテナンスされます.そのため、クラスタの構成を初期化するための環境を専門に配置します.配置ファイルは以下の通りです.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: redis-cluster-manager
name: redis-cluster-manager
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis-cluster-manager
template:
metadata:
labels:
app: redis-cluster-manager
spec:
containers:
- command:
- tail
args:
- -f
- /dev/null
env:
- name: DB_NAME
value: redis-cluster-manager
image: centos:centos7
imagePullPolicy: Always
name: redis-cluster-manager
resources:
limits:
cpu: 500m
memory: 300Mi
requests:
cpu: 100m
memory: 100Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
[root@008019 redis-cluster]# kubectl get pods -o wide --all-namespaces | grep redis-cluster-manager
default redis-cluster-manager-5468b99f7f-lxpw7 1/1 Running 0 87m 172.36.4.42 008031 <none> <none>
[root@008019 redis-cluster]# kubectl exec -it redis-cluster-manager-5468b99f7f-lxpw7 bash
[root@redis-cluster-manager-5468b99f7f-lxpw7 /]#
クラスタ構成ツールのインストール:
cat >> /etc/yum.repos.d/epel.repo<<'EOF'
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
EOF
yum -y install redis-trib.noarch
クラスタの初期化:
# pod ip, , yes, ,
# , 6 ,--replicas 1, 3 master, 3 3 slave
redis-trib create --replicas 1 \
172.36.4.43:6379 172.36.1.30:6379 172.36.6.21:6379 172.36.5.25:6379 172.36.0.198:6379 172.36.3.134:6379
...
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
せつぞく
どちらかを選択
[root@008019 redis-cluster]# kubectl exec -it redis-cluster-manager-5468b99f7f-lxpw7 bash
[root@redis-cluster-manager-5468b99f7f-lxpw7 /]#
[root@redis-cluster-manager-5468b99f7f-lxpw7 /]# exit
exit
[root@008019 redis-cluster]# kubectl exec -it app-rds-cluster-0 bash
# redis-cli cluster -c
root@app-rds-cluster-0:/var/lib/redis# redis-cli -c
# key
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.36.6.21:6379
(nil)
172.36.6.21:6379> set a 1
OK
172.36.6.21:6379> get a
"1"
#
172.36.6.21:6379> role
1) "master"
2) (integer) 1954
3) 1) 1) "172.36.3.134"
2) "6379"
3) "1954"
172.36.6.21:6379> quit
# , id , ip , myself
root@app-rds-cluster-0:/var/lib/redis# cat nodes.conf
bdcda6ce963add5bc9706e912b6fcf4b355e2add 172.36.3.134:6379@16379 slave d24da6b03aa3b614a1429847b3a47836f89dbc07 0 1578042761171 6 connected
f85ce96851823832a9bda4233cc6e3066e97c050 172.36.5.25:6379@16379 slave 561f70b2c94c6e46f7b9588705f2cb48861b1e89 0 1578042760571 4 connected
561f70b2c94c6e46f7b9588705f2cb48861b1e89 172.36.4.43:6379@16379 myself,master - 0 1578042760000 1 connected 0-5460
e5c64aa60dcc73746e196b6c1630019ec0c10ad5 172.36.0.198:6379@16379 slave 7e2a3fa95ef9402bfba7b2e08a27812272640179 0 1578042760000 5 connected
7e2a3fa95ef9402bfba7b2e08a27812272640179 172.36.1.30:6379@16379 master - 0 1578042760000 2 connected 5461-10922
d24da6b03aa3b614a1429847b3a47836f89dbc07 172.36.6.21:6379@16379 master - 0 1578042759569 3 connected 10923-16383
vars currentEpoch 6 lastVoteEpoch 0
root@app-rds-cluster-0:/var/lib/redis#
root@app-rds-cluster-0:/var/lib/redis#
サービスを使用してip接続を固定するには、次の手順に従います.
[root@008019 ~]# kubectl get service --all-namespaces | grep app-rds-cluster
default app-rds-cluster ClusterIP 10.123.80.163 <none> 6379/TCP 48m
[root@008019 ~]# kubectl exec -it redis-cluster-manager-5468b99f7f-lxpw7 bash
[root@redis-cluster-manager-5468b99f7f-lxpw7 /]# redis-cli -h 10.123.80.163 -c
10.123.80.163:6379> get a
-> Redirected to slot [15495] located at 172.36.6.22:6379
"1"
プライマリ・スタンバイ・スイッチ
高可用性クラスタとして、プライマリ・スタンバイ・スイッチングは基本的な機能であり、スイッチング・プロセスで何が起こったかを見てみましょう.
# master
[root@008019 ~]# kubectl delete pod app-rds-cluster-0
pod "app-rds-cluster-0" deleted
[root@008019 ~]#
[root@008019 ~]# kubectl get pods -o wide --all-namespaces | grep app-rds-cl
default app-rds-cluster-0 1/1 Running 0 20s 172.36.4.44 008031 <none> <none>
default app-rds-cluster-1 1/1 Running 0 31m 172.36.1.30 008020 <none> <none>
default app-rds-cluster-2 1/1 Running 0 31m 172.36.6.21 020203 <none> <none>
default app-rds-cluster-3 1/1 Running 0 31m 172.36.5.25 008032 <none> <none>
default app-rds-cluster-4 1/1 Running 0 31m 172.36.0.198 008019 <none> <none>
default app-rds-cluster-5 1/1 Running 0 31m 172.36.3.134 020204 <none> <none>
# ,redis-0 ip 172.36.4.43 172.36.4.44,
# , master slave, nodes.conf ip ip , 。 , 。
root@app-rds-cluster-0:/var/lib/redis# cat nodes.conf
7e2a3fa95ef9402bfba7b2e08a27812272640179 172.36.1.31:6379@16379 master - 1578044978612 1578044978607 2 connected 5461-10922
e5c64aa60dcc73746e196b6c1630019ec0c10ad5 172.36.0.199:6379@16379 slave 7e2a3fa95ef9402bfba7b2e08a27812272640179 0 1578044978614 5 connected
561f70b2c94c6e46f7b9588705f2cb48861b1e89 172.36.4.43:6379@16379 myself,slave f85ce96851823832a9bda4233cc6e3066e97c050 0 1578044978608 9 connected
bdcda6ce963add5bc9706e912b6fcf4b355e2add 172.36.3.135:6379@16379 slave d24da6b03aa3b614a1429847b3a47836f89dbc07 1578044978612 1578044978608 10 connected
f85ce96851823832a9bda4233cc6e3066e97c050 172.36.5.26:6379@16379 master - 0 1578044978614 11 connected 0-5460
d24da6b03aa3b614a1429847b3a47836f89dbc07 172.36.6.22:6379@16379 master - 1578044978612 1578044978608 10 connected 10923-16383
vars currentEpoch 11 lastVoteEpoch 10
root@app-rds-cluster-0:/var/lib/redis# redis-cli -c
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.36.6.22:6379
"1"
興味があれば、複数のノードを同時に削除してみてください.6ノード、3つを主とし、raftのアルゴリズムに従って、主が掛けられた後にバックアップがあります.そのため、2主+2備以上のノードが同時に掛けられない限り、redisのサービスには影響しません.