kubernetes (statefulSet+PV+PVC)部署redis集群(数据持久化)

9 篇文章 0 订阅

kubernetes 部署redis集群(数据持久化)

1-创建pv用于挂载数据

1.1-创建文件夹

此处采用ceph挂载文件,直接存储在指定文件夹即可

mkdir pv{0..5}

1.2-创建pv

cd /home/yanyonglong/deployments/redis-cluster
cat >> pv.yaml << EOF
kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-pv0
  labels:
    type: local
spec:
  storageClassName: redis-pv
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  local:
    path: "/data/edgebox/iotedge/remote/redis/pv0"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - iotedge03
          - iotedge02
          - iotedge01
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-pv1
  labels:
    type: local
spec:
  storageClassName: redis-pv
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  local:
    path: "/data/edgebox/iotedge/remote/redis/pv1"
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - iotedge03
                - iotedge02
                - iotedge01
---

kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-pv2
  labels:
    type: local
spec:
  storageClassName: redis-pv
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  local:
    path: "/data/edgebox/iotedge/remote/redis/pv2"
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - iotedge03
                - iotedge02
                - iotedge01

---

kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-pv3
  labels:
    type: local
spec:
  storageClassName: redis-pv
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  local:
    path: "/data/edgebox/iotedge/remote/redis/pv3"
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - iotedge03
                - iotedge02
                - iotedge01

---

kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-pv4
  labels:
    type: local
spec:
  storageClassName: redis-pv
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  local:
    path: "/data/edgebox/iotedge/remote/redis/pv4"
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - iotedge03
                - iotedge02
                - iotedge01

---

kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-pv5
  labels:
    type: local
spec:
  storageClassName: redis-pv
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  local:
    path: "/data/edgebox/iotedge/remote/redis/pv5"
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - iotedge03
                - iotedge02
                - iotedge01


EOF

# 创建
kubectl apply -f pv.yaml
kubectl get pv -o wide

在这里插入图片描述

1.3-创建pvc

cat >> pvc.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: redis-data-redis-app-0
  namespace: "default"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: redis-pv

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: redis-data-redis-app-1
  namespace: "default"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: redis-pv

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: redis-data-redis-app-2
  namespace: "default"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: redis-pv

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: redis-data-redis-app-3
  namespace: "default"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: redis-pv

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: redis-data-redis-app-4
  namespace: "default"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: redis-pv

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: redis-data-redis-app-5
  namespace: "default"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: redis-pv


EOF

# 创建
kubectl apply -f pvc.yaml
kubectl get pvc -o wide

2-创建配置

# 创建配置
cat >> conf.yaml << EOF
kind: ConfigMap
apiVersion: v1
metadata:
  name: redis-config
data:
  redis.conf: |
    appendonly yes
    cluster-enabled yes
    cluster-config-file /var/lib/redis/nodes.conf
    cluster-node-timeout 5000
    dir /var/lib/redis
    port 6379

EOF 

3-创建redis-headle

cat >> headless-server.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: redis-service
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    port: 6379
  clusterIP: None
  selector:
    app: redis
    appCluster: redis-cluster

EOF
# 创建
kubectl apply -f headless-server.yaml
kubectl get svc

4-创建redis副本

cat >> redis-stateful.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-app
spec:
  serviceName: "redis-service"
  replicas: 6
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
        appCluster: redis-cluster
    spec:
      terminationGracePeriodSeconds: 20
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - redis
              topologyKey: kubernetes.io/hostname
      containers:
      - name: redis
        image: redis
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
        ports:
            - name: redis
              containerPort: 6379
              protocol: "TCP"
            - name: cluster
              containerPort: 16379
              protocol: "TCP"
        volumeMounts:
          - name: "redis-conf"
            mountPath: "/etc/redis"
          - name: "redis-data"
            mountPath: "/var/lib/redis"
      volumes:
      - name: "redis-conf"
        configMap:
          name: "redis-conf"
          items:
            - key: "redis.conf"
              path: "redis.conf"
  volumeClaimTemplates:
  - metadata:
      name: redis-data
      labels:
        app: redis
    spec:
      accessModes: [ "ReadWriteMany" ]
      storageClassName: redis-pv
      resources:
        requests:
          storage: 10G

EOF

# 创建
kubectl apply -f redis-stateful.yaml

在这里插入图片描述

5-启动集群

# 通过新建一个pod,用这个pod来启动集群(启动后可以删除)
kubectl run -it ubuntu --image=ubuntu --restart=Never /bin/bash

# 安装
apt-get update
apt-get install -y vim wget python2.7 python-pip redis-tools dnsutils
pip install redis-trib==0.5.1


# 创建master
redis-trib.py create \
  `dig +short redis-app-0.redis-service.default.svc.cluster.local`:6379 \
  `dig +short redis-app-1.redis-service.default.svc.cluster.local`:6379 \
  `dig +short redis-app-2.redis-service.default.svc.cluster.local`:6379



# 为master分配slave
redis-trib.py replicate \
  --master-addr `dig +short redis-app-0.redis-service.default.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-app-3.redis-service.default.svc.cluster.local`:6379

redis-trib.py replicate \
  --master-addr `dig +short redis-app-1.redis-service.default.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-app-4.redis-service.default.svc.cluster.local`:6379

redis-trib.py replicate \
  --master-addr `dig +short redis-app-2.redis-service.default.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-app-5.redis-service.default.svc.cluster.local`:6379


# 配置完成后进去redis查看状态
kubectl exec -it redis-app-2 /bin/bash
redis-cli -c
cluster ndoes

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

6-创建redis的access方便访问

# 暴露nodePort
cat >> redis-access-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: redis-access-service
  labels:
    app: redis
spec:
  type: NodePort
  ports:
  - name: redis-port
    protocol: "TCP"
    port: 6379
    targetPort: 6379
    nodePort: 30079
  selector:
    app: redis
    appCluster: redis-cluster

EOF

# 创建代理service
kubectl apply -f redis-access-service.yaml

7-测试使用Python操作redis

pip3 install redis-py-cluster
# 在只需要访问代理节点即可
from rediscluster import RedisCluster
addr = [{"host":"10.56.1.11","port":30079}]
rc = RedisCluster(startup_nodes=addr)
rc.set("aaa", "111")
data = rc.get("aaa")

操作图片示例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在阿里云上通过 Kubernetes + Docker 实现 Hyperf 容器化部署的文档,供您参考: 1. 准备工作 - 安装 Docker:您需要在本地或服务器上安装 Docker。 - 安装 kubectl:您需要在本地或服务器上安装 kubectl,用于管理 Kubernetes 集群。 2. 创建 Docker 镜像 首先,您需要创建一个 Docker 镜像,该镜像包含了 Hyperf 应用程序以及其依赖项。您可以使用 Dockerfile 来定义镜像的构建过程。示例 Dockerfile 如下: ``` FROM php:7.4-fpm # 安装依赖 RUN apt-get update && \ apt-get install -y git zip unzip && \ docker-php-ext-install pdo_mysql && \ pecl install redis && \ docker-php-ext-enable redis # 安装 Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # 复制 Hyperf 应用程序 COPY . /var/www # 安装依赖项 WORKDIR /var/www RUN composer install # 暴露端口 EXPOSE 9501 # 启动命令 CMD ["php", "bin/hyperf.php", "start"] ``` 其中,我们使用了 `php:7.4-fpm` 作为基础镜像,安装了 Hyperf 应用程序所需的依赖项,并将应用程序复制到了 `/var/www` 目录中。我们还使用了 Composer 安装了应用程序的依赖项,并暴露了端口 `9501`。在启动容器时,我们使用了 `php bin/hyperf.php start` 命令来启动 Hyperf 应用程序。您可以根据实际情况修改 Dockerfile。 然后,使用以下命令构建 Docker 镜像: ``` docker build -t your-image-name . ``` 其中,`your-image-name` 是您的镜像名称。 3. 创建 Kubernetes 集群 您需要在阿里云上创建一个 Kubernetes 集群,用于部署 Hyperf 应用程序。具体操作步骤请参考阿里云 Kubernetes 文档。 4. 部署应用程序 接下来,您需要在 Kubernetes 集群部署 Hyperf 应用程序。您可以使用以下命令进行部署: ``` kubectl create deployment your-deployment-name --image=your-image-name kubectl expose deployment your-deployment-name --type=LoadBalancer --port=80 --target-port=9501 ``` 其中,`your-deployment-name` 是您的部署名称,`your-image-name` 是您的 Docker 镜像名称。 该命令将创建一个名为 `your-deployment-name` 的部署,并使用了名为 `your-image-name` 的 Docker 镜像。该命令还将暴露端口 `80`,并将其映射到端口 `9501`。 5. 访问应用程序 最后,您可以使用以下命令查看服务的 IP 地址和端口号: ``` kubectl get services ``` 然后,您可以使用浏览器或其他工具访问 Hyperf 应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值