在IBM应用网关中,为Openshift准备Redis服务器复制配置(主/从)
首先
IBM应用程序网关可以通过多种配置模式来实现Redis服务器冗余以存储会话信息。
由于IBM Application Gateway不支持Redis Cluster,因此可选择单机配置、主从配置或哨兵配置。
我們參考了這個網址關於Redis的冗余設置:
https://www.sraoss.co.jp/tech-blog/redis/redis-ha/
这次,我根据Kubernetes指南中的yaml基础结构,尝试创建了主节点/副本的配置。
使用Redis来部署PHP的留言板应用程序
https://kubernetes.io/ja/docs/tutorials/stateless-application/guestbook/
悩みのポイント1: イメージを変更すると、レプリカ側もマスターとして機能してしまう。
Kubernetes指南中的Yaml文件中,镜像被指定如下:
主节点:image: k8s.gcr.io/redis:e2e
副本:image: gcr.io/google_samples/gb-redisslave:v3
当将image更改为Docker Hub上的Redis镜像时,副本也作为主服务器启动了。
https://hub.docker.com/_/redis
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-slave
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
role: slave
tier: backend
replicas: 2
template:
metadata:
labels:
app: redis
role: slave
tier: backend
spec:
containers:
- name: slave
image: redis:latest
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 6379
浏览了以下的文章后,我了解到为了将其作为复制品运行,需要进行Redis的配置设置。
以下是用于部署最终系统的主/复制品的YAML文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-master
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
role: master
tier: backend
replicas: 1
template:
metadata:
labels:
app: redis
role: master
tier: backend
spec:
containers:
- name: master
image: redis:latest
command:
- "redis-server"
args:
- "--protected-mode"
- "no"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
为了作为一个从属工作,并添加了slaveof <主服务名称> <端口号>命令。
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-slave
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
role: slave
tier: backend
replicas: 2
template:
metadata:
labels:
app: redis
role: slave
tier: backend
spec:
containers:
- name: slave
image: redis:latest
command:
- "redis-server"
args:
- "--slaveof"
- "redis-master"
- "6379"
- "--protected-mode"
- "no"
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 6379
服务的配置与Kubernetes指南相同。
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
role: master
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: master
tier: backend
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
app: redis
role: slave
tier: backend
spec:
ports:
- port: 6379
selector:
app: redis
role: slave
tier: backend
悩みポイント2:在服务器根目录(/data)中无法保存RDB文件dump.rdb,出现错误信息”Failed opening the RDB file dump.rdb (in server root dir /data) for saving: Permission denied”,导致主/从节点无法同步。
在主服务器的日志中输出了”无法打开位于服务器根目录/data中的RDB文件dump.rdb,保存失败:权限被拒绝”。
1:M 06 Apr 2022 04:14:02.271 * Replica 172.30.169.41:6379 asks for synchronization
1:M 06 Apr 2022 04:14:02.271 * Full resync requested by replica 172.30.169.41:6379
1:M 06 Apr 2022 04:14:02.271 * Replication backlog created, my new replication IDs are 'a5cd3c705f8a0b324f44971ca6fc7d8043ce482b' and '0000000000000000000000000000000000000000'
1:M 06 Apr 2022 04:14:02.271 * Starting BGSAVE for SYNC with target: disk
1:M 06 Apr 2022 04:14:02.272 * Background saving started by pid 11
11:C 06 Apr 2022 04:14:02.272 # Failed opening the RDB file dump.rdb (in server root dir /data) for saving: Permission denied
1:M 06 Apr 2022 04:14:02.369 # Background saving error
1:M 06 Apr 2022 04:14:02.369 # Connection with replica 172.30.169.41:6379 lost.
1:M 06 Apr 2022 04:14:02.369 # SYNC failed. BGSAVE child returned an error
由于权限问题,我们确认所需的权限后发现需要 anyuid 的安全策略限制容器(SSC)。
> oc get pods
NAME READY STATUS RESTARTS AGE
redis-master-84f49d559d-q678p 1/1 Running 0 8m31s
redis-slave-5f7bc5fb7c-d26f5 1/1 Running 0 7m38s
redis-slave-5f7bc5fb7c-psh4q 1/1 Running 0 7m38s
> oc get pod/redis-master-84f49d559d-q678p -o yaml|oc adm policy scc-subject-review -f -
RESOURCE ALLOWED BY
Pod/redis-master-84f49d559d-q678p anyuid
为了实现这一点,我们需要创建一个具有anyuid的SSC的服务账户,并将其配置到部署中。
> oc create serviceaccount redis-sa
serviceaccount/redis-sa created
> oc adm policy add-scc-to-user anyuid -z redis-sa
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "redis-sa"
> oc describe serviceaccount redis-sa
Name: redis-sa
Namespace: test-redis
Labels: <none>
Annotations: <none>
Image pull secrets: redis-sa-dockercfg-q8w5d
Mountable secrets: redis-sa-token-sqcdj
redis-sa-dockercfg-q8w5d
Tokens: redis-sa-token-4llgf
redis-sa-token-sqcdj
Events: <none>
> oc set serviceaccount deployment/redis-master redis-sa
deployment.apps/redis-master serviceaccount updated
> oc describe deployment/redis-master |grep Service
Service Account: redis-sa
> oc set serviceaccount deployment/redis-slave redis-sa
deployment.apps/redis-slave serviceaccount updated
> oc describe deployment/redis-slave |grep Service
Service Account: redis-sa
通过进行设定,错误得到了解决。
1:C 06 Apr 2022 04:27:53.749 # Configuration loaded
1:M 06 Apr 2022 04:27:53.751 * monotonic clock: POSIX clock_gettime
1:M 06 Apr 2022 04:27:53.752 * Running mode=standalone, port=6379.
1:M 06 Apr 2022 04:27:53.752 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 06 Apr 2022 04:27:53.752 # Server initialized
1:M 06 Apr 2022 04:27:53.753 * Ready to accept connections
1:M 06 Apr 2022 04:27:55.130 * Replica 172.30.115.4:6379 asks for synchronization
1:M 06 Apr 2022 04:27:55.130 * Full resync requested by replica 172.30.115.4:6379
1:M 06 Apr 2022 04:27:55.130 * Replication backlog created, my new replication IDs are '9d966da84bc748f7df876a47339d13ff678d045d' and '0000000000000000000000000000000000000000'
1:M 06 Apr 2022 04:27:55.130 * Starting BGSAVE for SYNC with target: disk
1:M 06 Apr 2022 04:27:55.130 * Background saving started by pid 11
11:C 06 Apr 2022 04:27:55.136 * DB saved on disk
11:C 06 Apr 2022 04:27:55.137 * RDB: 0 MB of memory used by copy-on-write
1:M 06 Apr 2022 04:27:55.164 * Background saving terminated with success
1:M 06 Apr 2022 04:27:55.164 * Synchronization with replica 172.30.115.4:6379 succeeded
1:M 06 Apr 2022 04:27:55.650 * Replica 172.30.169.41:6379 asks for synchronization
1:M 06 Apr 2022 04:27:55.650 * Full resync requested by replica 172.30.169.41:6379
1:M 06 Apr 2022 04:27:55.650 * Starting BGSAVE for SYNC with target: disk
1:M 06 Apr 2022 04:27:55.651 * Background saving started by pid 12
12:C 06 Apr 2022 04:27:55.654 * DB saved on disk
检查主Redis服务器上是否存在/data/dump.rdb文件,并确认其连接了两个从服务器(connected_slaves)。
> oc get pods
NAME READY STATUS RESTARTS AGE
redis-master-5c69db88c4-g6glq 1/1 Running 0 4m1s
redis-slave-6dcb7cdcd5-8lrl6 1/1 Running 0 3m49s
redis-slave-6dcb7cdcd5-pzxbm 1/1 Running 0 3m55s
PS C:\temp-openshift\iag> oc rsh redis-master-5c69db88c4-g6glq
# ls /data
dump.rdb
# redis-cli info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.30.169.42,port=6379,state=online,offset=350,lag=0
slave1:ip=172.30.115.19,port=6379,state=online,offset=350,lag=0
master_failover_state:no-failover
master_replid:9d966da84bc748f7df876a47339d13ff678d045d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:350
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:350
在主机上写入测试数据。
> redis-cli set aaa 111
OK
> redis-cli get aaa
"111"
在复制端也会进行相同的确认。
由于master_link_status为up,因此与主节点建立了连接。
> oc get pods
NAME READY STATUS RESTARTS AGE
redis-master-5c69db88c4-g6glq 1/1 Running 0 7m40s
redis-slave-6dcb7cdcd5-8lrl6 1/1 Running 0 7m28s
redis-slave-6dcb7cdcd5-pzxbm 1/1 Running 0 7m34s
PS C:\temp-openshift\iag> oc rsh redis-slave-6dcb7cdcd5-8lrl6
# ls /data
dump.rdb
# redis-cli info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:698
slave_repl_offset:698
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:9d966da84bc748f7df876a47339d13ff678d045d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:698
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:684
我们刚刚确认了在Master端注册的测试数据同步成功。
> redis-cli get aaa
"111"
最后
这次我们尝试了Redis服务器的冗余配置。接下来,我们想要与IBM应用程序网关结合起来进行操作确认。