第八章-SUSE- Rancher-容器高可用与容灾测试-Longhorn(容灾卷跨集群测试)

系列文章目录

第一章-SUSE- Rancher-容器高可用与容灾测试-RKE2-外置数据库(Mysql主备集群搭建)

第二章-SUSE- Rancher-容器高可用与容灾测试-RKE2-集群搭建(使用Mysql)-CSDN博客

第三章-SUSE- Rancher-容器高可用与容灾测试-Rancher-(离线helm部署)

第四章-SUSE- Rancher-容器高可用与容灾测试-RKE2-数据库(Mysql主备倒换容灾)

第五章-SUSE- Rancher-容器高可用与容灾测试-Rancher-(使用Rancher-backup-异地还原测试)

第六章-SUSE- Rancher-容器高可用与容灾测试-RKE2-数据库(Mysql-异地备份还原方式容灾)

第七章-SUSE- Rancher-容器高可用与容灾测试-Rancher-拉起的集群(快照容灾测试)

第八章-SUSE- Rancher-容器高可用与容灾测试-Longhorn(容灾卷跨集群测试)


前言

第一章我们搭建好了Mysql(主备复制)实例。

第二章我们搭建好Rancher管理集群的基础设施- RKE2集群-Tarball方法-离线。

第三章我们使用helm离线方式部署好Rancher到RKE2集群中,同时使用Rancher-backup-调度了一次备份任务到阿里云的对象存储。

第四章 我们模拟主数据中心数据库故障,将RKE2进行Mysql数据库主备倒换。

第五章,我们使用Rancher-backup对Rancher进行异地还原。

第六章,我们模拟主数据中心数据库故障,将RKE2的Mysql数据库通过备份还原。

第七章,我们将Rancher的3种快照还原进行测试。

本章,我们使用longhorn的DR卷做一下容灾测试。


一、测试步骤

**一样的主机一样的longhorn版本。

二、配置longhorn添加阿里云OSS备份目标

2.1 编写Secret

**必须按下面的格式写,不然报错。

2.2 Longhorn侧设置备份目标

URL编写规则:

```text
s3://<your-bucket-name>@<your-aws-region>/mypath/
```

**我的例子:

Mgmtkody:~/longhorn/charts/longhorn # cat /root/.ossutilconfig
[default]
accessKeyId=LTAx c x x x3ZQ2y9W
accessKeySecret=i68xxxxx3tAOJjUEbKKN
region=cn-shanghai
endpoint=oss-cn-shanghai-internal.aliyuncs.com

2.3 部署Mysql测试

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: longhorn

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:8.0
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "yourpassword"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  type: ClusterIP

2.4 Mysql侧写入数据

2.4.1 Mysql插入数据

kubectl exec -it $(kubectl get pods -l app=mysql -o jsonpath="{.items[0].metadata.name}") -- mysql -u root -p

CREATE DATABASE testdb;
USE testdb;
CREATE TABLE testtable (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

INSERT INTO testtable (name) VALUES 
('Alice'), ('Bob'), ('Charlie'), ('David'), ('Eve'), 
('Frank'), ('Grace'), ('Hank'), ('Ivy'), ('Jack');

SELECT * FROM testtable;

2.4.2 展示前端

#php-nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-nginx
  template:
    metadata:
      labels:
        app: php-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: default.conf
        - name: nginx-fastcgi
          mountPath: /etc/nginx/fastcgi_params
          subPath: fastcgi_params
        - name: php-code
          mountPath: /var/www/html
      - name: php-fpm
        image: php:7.4-fpm
        command: ["sh", "-c", "docker-php-ext-install mysqli && php-fpm"]
        volumeMounts:
        - name: php-code
          mountPath: /var/www/html
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config
      - name: nginx-fastcgi
        configMap:
          name: nginx-config
      - name: php-code
        configMap:
          name: php-code

---
apiVersion: v1
kind: Service
metadata:
  name: php-nginx
spec:
  selector:
    app: php-nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32327
  type: NodePort

nginx-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  default.conf: |
    server {
        listen 80;
        server_name localhost;

        root /var/www/html;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
            include /etc/nginx/fastcgi_params;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        }
    }
  fastcgi_params: |
    fastcgi_param QUERY_STRING       $query_string;
    fastcgi_param REQUEST_METHOD     $request_method;
    fastcgi_param CONTENT_TYPE       $content_type;
    fastcgi_param CONTENT_LENGTH     $content_length;

    fastcgi_param SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param PATH_INFO          $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED    $document_root$fastcgi_path_info;
    fastcgi_param REQUEST_URI        $request_uri;
    fastcgi_param DOCUMENT_URI       $document_uri;
    fastcgi_param DOCUMENT_ROOT      $document_root;
    fastcgi_param SERVER_PROTOCOL    $server_protocol;

    fastcgi_param GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param SERVER_SOFTWARE    nginx/$nginx_version;

    fastcgi_param REMOTE_ADDR        $remote_addr;
    fastcgi_param REMOTE_PORT        $remote_port;
    fastcgi_param SERVER_ADDR        $server_addr;
    fastcgi_param SERVER_PORT        $server_port;
    fastcgi_param SERVER_NAME        $server_name;

    fastcgi_param HTTPS              $https;

    fastcgi_param REDIRECT_STATUS    200;

php-code.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: php-code
data:
  index.php: |
    <?php
    $servername = "mysql";
    $username = "root";
    $password = "rancher";
    $dbname = "testdb";

    // 创建连接
    $conn = new mysqli($servername, $username, $password, $dbname);

    // 检查连接
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    }

    $sql = "SELECT id, name FROM testtable";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        // 输出数据
        while($row = $result->fetch_assoc()) {
            echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
        }
    } else {
        echo "0 结果";
    }
    $conn->close();
    ?>

2.4.3 前端测试展示

2.5 集群A测试快照/备份卷

2.4.1 全量备份

**勾选则是全量/不勾则是增量备份。

**备份的目标需要是我们的S3存储。

**这次备份是全量备份,备份的同时也会生成一个快照。

2.4.2 第2次写入数据

展示快照后写入的数据。

USE testdb;

INSERT INTO testtable (name) VALUES 
('Alice'), ('Bob'), ('Charlie'), ('David'), ('Eve'), 
('Frank'), ('Grace'), ('Hank'), ('Ivy'), ('Jack'),
('Liam'), ('Noah'), ('Oliver'), ('Elijah'), ('William'),
('James'), ('Benjamin'), ('Lucas'), ('Henry'), ('Alexander'),
('Mason'), ('Michael'), ('Ethan'), ('Daniel'), ('Jacob'),
('Logan'), ('Jackson'), ('Levi'), ('Sebastian'), ('Mateo');

SELECT * FROM testtable;

2.4.3 快照还原测试

**备份本质上就是快照。只是备份可以放置在集群额外地方存储。

**快照恢复必须要停业务。

**暂停Deployment调度

**删除pod

**卷进行分离快照恢复

*卷状态变Detached,分离状态

**此时卷就进入存储池.

**此时可以通过快照进行还原。

**恢复后

**调度业务

**验证快照恢复

**恢复到第一次快照的数据量。

2.4.2 增量备份

2.4.2.1 再次写入数据
USE testdb;

INSERT INTO testtable (name) VALUES 
('Alice'), ('Bob'), ('Charlie'), ('David'), ('Eve'), 
('Frank'), ('Grace'), ('Hank'), ('Ivy'), ('Jack'),
('Liam'), ('Noah'), ('Oliver'), ('Elijah'), ('William'),
('James'), ('Benjamin'), ('Lucas'), ('Henry'), ('Alexander'),
('Mason'), ('Michael'), ('Ethan'), ('Daniel'), ('Jacob'),
('Logan'), ('Jackson'), ('Levi'), ('Sebastian'), ('Mateo');

SELECT * FROM testtable;

**写2次多一些。

2.4.2.2 添加增量备份卷

**勾选则是全量/不勾则是增量备份。

**备份的目标需要是我们的S3存储。

2.4.2.3 增量快照测试

删除之前的第一次快照。重新调度pod.
数据只有第1次快照打了之后新增的30条数据,再次打个快照(增量备份)的数据。

RPO为-第一次快照-xxxxxx-第二快照

中间的xxxxxx为新增的30条记录

2.4.2.4 检查数据大小是否一致

2.5 集群B-创建DR卷

2.5.1 集群B中从备份目标创建DR卷

**官网建议就一致最好。

**下面这个蓝色标志代表为DR卷。

**不管集群A备份了几次,集群B因为连接到同一个S3都可以看到并且同步。

**且可以多次创建DR卷。

**DR卷到大小和最新增量备份保持一致。即整合第一次全量和第二次增量。

2.5.2 视频演示

20250209134333-视频-1


总结

1、本次容灾系列做的比较全面了,但也有一些不足。

2、今年会有很多VMware替换的项目会更新一些做Havster的文章。

相关推荐
A ?Charis8 天前
第七章-SUSE- Rancher-容器高可用与容灾测试-Rancher拉起的集群(容灾测试)
rancher
A ?Charis8 天前
记录一次-Rancher通过UI-Create Custom- RKE2的BUG
bug·rancher
A ?Charis8 天前
第六章-SUSE- Rancher-容器高可用与容灾测试-RKE2-数据库(Mysql-异地备份还原方式容灾)
rancher
A ?Charis11 天前
第五章-SUSE- Rancher-容器高可用与容灾测试-Rancher-back up(容灾测试)
rancher
A ?Charis13 天前
第四章-SUSE- Rancher-容器高可用与容灾测试-RKE2(容灾测试)
rancher
郝开13 天前
Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher
docker·容器·rancher·docker desktop·portainer
A ?Charis16 天前
第二章-SUSE- Rancher-容器高可用与容灾测试-RKE2-集群搭建(外置Mysql)-Tarball方法
rancher
A ?Charis16 天前
第三章-SUSE- Rancher-容器高可用与容灾测试-Rancher-外置数据库(复用Mysql)
rancher
AKA小徐2 个月前
Debian12使用RKE2离线部署3master2node三主两从的k8s集群详细教程
kubernetes·rancher·rke2