写在最前

1. docker 部署

2. kubernetes 部署

2.1 service

kind: Service
apiVersion: v1
metadata:
  name: redis-cluster
  namespace: bx
  labels:
    app: redis-cluster
  annotations:
    kubesphere.io/creator: admin
spec:
  ports:
    - name: redis
      protocol: TCP
      port: 6379
      targetPort: 6379
    - name: election
      protocol: TCP
      port: 16379
      targetPort: 16379
  selector:
    app: redis-cluster
  clusterIP: None
  clusterIPs:
    - None
  type: ClusterIP
  sessionAffinity: None
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  internalTrafficPolicy: Cluster

2.2 configmap

kind: ConfigMap
apiVersion: v1
metadata:
  name: redis-config
  namespace: bx
  annotations:
    kubesphere.io/creator: admin
data:
  redis-cluster.conf: |
    daemonize no
    supervised no
    protected-mode no
    bind 0.0.0.0
    port 6379
    cluster-announce-bus-port 16379
    cluster-enabled yes
    appendonly yes
    cluster-node-timeout 5000
    dir /data
    cluster-config-file /data/nodes.conf
    requirepass xxxxxxxxxx
    masterauth xxxxxxxxxx

2.3 statefulset

kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: redis-cluster
  namespace: bx
  annotations:
    kubesphere.io/creator: admin
spec:
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: redis-cluster
      annotations:
        kubesphere.io/creator: admin
        kubesphere.io/imagepullsecrets: '{}'
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      volumes:
        - name: redis-config
          configMap:
            name: redis-config
            items:
              - key: redis-cluster.conf
                path: redis-cluster.conf
            defaultMode: 420
      containers:
        - name: redis-cluster
          image: 'harbor.bx.crpharm.com/k8s/arm64/redis:7.2.6'
          args:
            - /etc/redis/redis-cluster.conf
            - '--cluster-announce-ip "$(POD_NAME).$(POD_SERVICE_NAME)"'
          ports:
            - name: redis
              containerPort: 6379
              protocol: TCP
            - name: election
              containerPort: 16379
              protocol: TCP
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: POD_SERVICE_NAME
              value: redis-cluster.bx
          resources:
            limits:
              cpu: '1'
              memory: 2Gi
            requests:
              cpu: 500m
              memory: 1Gi
          volumeMounts:
            - name: data
              mountPath: /data
            - name: redis-config
              readOnly: true
              mountPath: /etc/redis/redis-cluster.conf
              subPath: redis-cluster.conf
          livenessProbe:
            tcpSocket:
              port: redis
            initialDelaySeconds: 16
            timeoutSeconds: 1
            periodSeconds: 3
            successThreshold: 1
            failureThreshold: 2
          readinessProbe:
            tcpSocket:
              port: redis
            initialDelaySeconds: 16
            timeoutSeconds: 1
            periodSeconds: 3
            successThreshold: 1
            failureThreshold: 2
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - redis-cluster
                topologyKey: kubernetes.io/hostname
      schedulerName: default-scheduler
  volumeClaimTemplates:
    - kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: data
        namespace: bx
        creationTimestamp: null
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: nfs-client
        volumeMode: Filesystem
      status:
        phase: Pending
  serviceName: redis-cluster
  podManagementPolicy: OrderedReady
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 0
  revisionHistoryLimit: 10
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Retain

2.4 初始化集群

redis-cli -a xxxxxxxxxx \
--cluster create \
--cluster-replicas 1 \
redis-cluster-0.redis-cluster.bx.svc.cluster.local:6379 \
redis-cluster-1.redis-cluster.bx.svc.cluster.local:6379 \
redis-cluster-2.redis-cluster.bx.svc.cluster.local:6379  \
redis-cluster-3.redis-cluster.bx.svc.cluster.local:6379 \
redis-cluster-4.redis-cluster.bx.svc.cluster.local:6379 \
redis-cluster-5.redis-cluster.bx.svc.cluster.local:6379

写在最后