#Redis集群三主部署
#定义kubernetes ConfigMap资源用于配置Redis集群
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-conf
  namespace: redis-tool
data:
  redis.conf: |
    protected-mode no
    appendonly yes
    cluster-enabled yes #启用集群模式
    cluster-config-file /var/lib/redis/nodes.conf #集群配置文件路径
    cluster-node-timeout 5000 #节点超时时间(毫秒)
    dir /var/lib/redis
    port 6379 #监听端口
    requirepass M2@25_redis #客户端连接密码
    masterauth M2@25_redis  #主从复制密码
---
#定义了一个Kubernetes PersistentVolumeClaim(PVC)资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    volume.beta.kubernetes.io/storage-class: nfs-provisioner #指定存储类
    volume.beta.kubernetes.io/storage-provisioner: choerodon.io/nfs-client-provisioner #NFS供应器
  name: redis-data #pvc的名字需要和StatefulSet中的名字相同
  namespace: redis-tool #命名空间
spec:
  accessModes:
  - ReadWriteMany #支持多节点读写
  resources:
    requests:
      storage: 30Gi #请求30GB的存储空间
---
#定义了一个Kubernetes Headless Service资源
apiVersion: v1
kind: Service
metadata:
  name: redis-service-master #服务名
  namespace: redis-tool
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    port: 6379 #master端口号
  clusterIP: None
  selector:
    app: redis
    appCluster: redis-cluster
---
#定义一个Kubernetes StatefulSet资源配置文件,用于部署一个高可用的Redis集群
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: redis-tool
  name: redis-app-master #有状态应用名称
spec:    
  serviceName: "redis-service-master"
  replicas: 3 #副本数
  selector:
    matchLabels:
      app: redis #使用标签选择器匹配
  template:
    metadata:
      labels:
        app: redis
        appCluster: redis-cluster
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet  
      terminationGracePeriodSeconds: 20
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:#通过节点亲和性将Pod调度到指定的节点上
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values: #部署集群的节点IP
                - 192.168.2.180
                - 192.168.2.181
                - 192.168.2.182
      containers:
      - name: redis
        image: core.harbor.domain:443/tool/redis:5.0.5 #镜像地址
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
          - --cluster-announce-ip 
          - "$(MY_POD_IP)"    
        env:
          - name: MY_POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
        ports:
            - name: redis
              containerPort: 6379 #redis服务端口
              protocol: "TCP"
            - name: cluster
              containerPort: 16379 #集群总线端口
              protocol: "TCP"
        volumeMounts:
          - name: "redis-conf"
            mountPath: "/etc/redis" #挂在ConfigMap在这个目录
          - name: "redis-data"
            mountPath: "/var/lib/redis" #为每个Pod创建30GB的持久化存储挂载到这个目录
      volumes:
      - name: "redis-conf"
        configMap:
          name: "redis-conf"
          items:
            - key: "redis.conf"
              path: "redis.conf"
  volumeClaimTemplates: #动态卷声明模板
  - metadata:
      name: redis-data
    spec:
      accessModes: [ "ReadWriteMany" ]
      resources:
        requests:
          storage: 30Gi
---
#Redis集群三从部署
##定义kubernetes ConfigMap资源用于配置Redis集群
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-conf-slave
  namespace: redis-tool
data:
  redis.conf: |
    protected-mode no
    appendonly yes
    cluster-enabled yes
    cluster-config-file /var/lib/redis/nodes.conf
    cluster-node-timeout 5000
    dir /var/lib/redis
    port 26379
    requirepass M2@25_redis
    masterauth M2@25_redis
---
#定义了一个Kubernetes Headless Service资源
apiVersion: v1
kind: Service
metadata:
  name: redis-service-slave
  namespace: redis-tool
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    port: 16379
  clusterIP: None
  selector:
    app: redis
    appCluster: redis-cluster
---
#定义一个Kubernetes StatefulSet资源配置文件,用于部署一个高可用的Redis集群
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: redis-tool
  name: redis-app-slave
spec:    
  serviceName: "redis-service-slave"
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
        appCluster: redis-cluster
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet  
      terminationGracePeriodSeconds: 20
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - 192.168.2.180
                - 192.168.2.181
                - 192.168.2.182
      containers:
      - name: redis
        image: core.harbor.domain:443/tool/redis:5.0.5
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
          - --cluster-announce-ip 
          - "$(MY_POD_IP)"    
        env:
          - name: MY_POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
        ports:
            - name: redis
              containerPort: 16379
              protocol: "TCP"
            - name: cluster
              containerPort: 16380
              protocol: "TCP"
        volumeMounts:
          - name: "redis-conf"
            mountPath: "/etc/redis"
          - name: "redis-data"
            mountPath: "/var/lib/redis"
      volumes:
      - name: "redis-conf"
        configMap:
          name: "redis-conf-slave"
          items:
            - key: "redis.conf"
              path: "redis.conf"
  volumeClaimTemplates: #动态卷声明模板
  - metadata:
      name: redis-data
    spec:
      accessModes: [ "ReadWriteMany" ]
      resources:
        requests:
          storage: 30Gi

最后集群初始化

redis-cli --cluster create 192.168.2.180:6379 192.168.2.181:6379 192.168.2.182:6379 192.168.2.180:16379 192.168.2.181:16379 192.168.2.182:16379 --cluster-replicas 1 -a M2@25_redis

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐