【发布时间】:2018-07-07 11:32:18
【问题描述】:
我正在尝试在 Kubernetes 中设置 Redis 集群。主要要求是 Redis 集群中的所有节点都必须在 Kubernetes 外部可用。因此客户端可以直接连接每个节点。但我不知道如何以这种方式配置服务。
现在集群的基本配置。服务进入 k8s 是可以的,但不能从外部完全访问。
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-cluster
labels:
app: redis-cluster
data:
redis.conf: |+
cluster-enabled yes
cluster-require-full-coverage no
cluster-node-timeout 15000
cluster-config-file /data/nodes.conf
cluster-migration-barrier 1
appendonly no
protected-mode no
---
apiVersion: v1
kind: Service
metadata:
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "false"
name: redis-cluster
labels:
app: redis-cluster
spec:
type: NodePort
ports:
- port: 6379
targetPort: 6379
name: client
- port: 16379
targetPort: 16379
name: gossip
selector:
app: redis-cluster
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: redis-cluster
labels:
app: redis-cluster
spec:
serviceName: redis-cluster
replicas: 6
template:
metadata:
labels:
app: redis-cluster
spec:
hostNetwork: true
containers:
- name: redis-cluster
image: redis:4.0.10
ports:
- containerPort: 6379
name: client
- containerPort: 16379
name: gossip
command: ["redis-server"]
args: ["/conf/redis.conf"]
readinessProbe:
exec:
command:
- sh
- -c
- "redis-cli -h $(hostname) ping"
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
exec:
command:
- sh
- -c
- "redis-cli -h $(hostname) ping"
initialDelaySeconds: 20
periodSeconds: 3
volumeMounts:
- name: conf
mountPath: /conf
readOnly: false
volumes:
- name: conf
configMap:
name: redis-cluster
items:
- key: redis.conf
path: redis.conf
【问题讨论】:
-
你知道会有多少个 Redis 节点,或者解决方案必须是动态的吗?
-
@ewramner 动态,但是对于一个测试用例,会有足够的固定量-6或8
-
如果它是静态的,您可以为每个 pod 定义一个额外的服务,因为 pod 获得稳定的名称(-0、-1、...)。这些服务可以有稳定的外部 IP。这应该可以,但是如果您需要使其动态化,则必须编写脚本。
标签: redis kubernetes redis-cluster