香橙派4和树莓派4B构建K8S集群实践之八: TiDB

news2024/11/16 3:38:33

目录

1. 说明

2. 准备工作

3. 安装

3.1 参考TiDB官方 v1.5安装说明 

3.2 准备存储类

3.3 创建crd

3.4 执行operator

3.5 创建cluster/dashboard/monitor容器组

3.6 装好后的容器状况

3.7 设置访问入口(Ingress & Port)

4. 遇到的问题

5. 参考


1. 说明

  • 建立TiDB集群,实现一个基于k8s的云原生分布式数据库方案
  • 应用ingress, 子域名访问并测试
  • 使用local-volume-provisioner GitHub - kubernetes-sigs/sig-storage-local-static-provisioner: Static provisioner of local volumes作为存储部署方案(注:如果用之前默认设好的NFS SC作为tidb的存储类会导致pd,kv pods不能启动)
挂载目录存储目录存储类备注
/mnt/tidb/ssd /data0/tidb/ssdssd-storage给 TiKV 使用
/mnt/tidb/sharedssd/data0/tidb/sharedssdshared-ssd-storage给 PD 使用
/mnt/tidb/monitoring/data0/tidb/monitoringmonitoring-storage给监控数据使用
/mnt/tidb/backup/data0/tidb/backupbackup-storage给 TiDB Binlog 和备份数据使用
......

2. 准备工作

拿下需要的文件清单:

说明来源备注
local-volume-provisioner.yaml本地存储对象https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/local-pv/local-volume-provisioner.yaml修改对应路径
crd.yamlhttps://raw.githubusercontent.com/pingcap/tidb-operator/master/manifests/crd.yaml
tidb-cluster.yamlhttps://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-cluster.yaml修改对应Stroage Class
tidb-dashboard.yamlhttps://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-dashboard.yaml
tidb-monitor.yamlhttps://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-monitor.yaml
tidb-ng-monitor.yaml访问 TiDB Dashboard | PingCAP 文档中心

3. 安装

3.1 参考Tidb官方 v1.5安装说明 

在标准 Kubernetes 上部署 TiDB 集群 | PingCAP 文档中心介绍如何在标准 Kubernetes 集群上通过 TiDB Operator 部署 TiDB 集群。https://docs.pingcap.com/zh/tidb-in-kubernetes/v1.5/deploy-on-general-kubernetes

3.2 准备存储类

local-volume-provisioner.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: "monitoring-storage"
provisioner: "kubernetes.io/no-provisioner"
volumeBindingMode: "WaitForFirstConsumer"
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: "ssd-storage"
provisioner: "kubernetes.io/no-provisioner"
volumeBindingMode: "WaitForFirstConsumer"
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: "shared-ssd-storage"
provisioner: "kubernetes.io/no-provisioner"
volumeBindingMode: "WaitForFirstConsumer"
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: "backup-storage"
provisioner: "kubernetes.io/no-provisioner"
volumeBindingMode: "WaitForFirstConsumer"
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-provisioner-config
  namespace: kube-system
data:
  setPVOwnerRef: "true"
  nodeLabelsForPV: |
    - kubernetes.io/hostname
  storageClassMap: |
    ssd-storage:
      hostDir: /mnt/tidb/ssd
      mountDir: /mnt/tidb/ssd
    shared-ssd-storage:
      hostDir: /mnt/tidb/sharedssd
      mountDir: /mnt/tidb/sharedssd
    monitoring-storage:
      hostDir: /mnt/tidb/monitoring
      mountDir: /mnt/tidb/monitoring
    backup-storage:
      hostDir: /mnt/tidb/backup
      mountDir: /mnt/tidb/backup
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: local-volume-provisioner
  namespace: kube-system
  labels:
    app: local-volume-provisioner
spec:
  selector:
    matchLabels:
      app: local-volume-provisioner
  template:
    metadata:
      labels:
        app: local-volume-provisioner
    spec:
      serviceAccountName: local-storage-admin
      containers:
        #- image: "quay.io/external_storage/local-volume-provisioner:v2.3.4"
        - image: "quay.io/external_storage/local-volume-provisioner:v2.5.0"
          name: provisioner
          securityContext:
            privileged: true
          env:
          - name: MY_NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: MY_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: JOB_CONTAINER_IMAGE
            #value: "quay.io/external_storage/local-volume-provisioner:v2.3.4"
            value: "quay.io/external_storage/local-volume-provisioner:v2.5.0"
          resources:
            requests:
              cpu: 100m
              memory: 100Mi
            limits:
              cpu: 100m
              memory: 100Mi
          volumeMounts:
            - mountPath: /etc/provisioner/config
              name: provisioner-config
              readOnly: true
            - mountPath: /mnt/tidb/ssd
              name: local-ssd
              mountPropagation: "HostToContainer"
            - mountPath: /mnt/tidb/sharedssd
              name: local-sharedssd
              mountPropagation: "HostToContainer"
            - mountPath: /mnt/tidb/backup
              name: local-backup
              mountPropagation: "HostToContainer"
            - mountPath: /mnt/tidb/monitoring
              name: local-monitoring
              mountPropagation: "HostToContainer"            
      volumes:
        - name: provisioner-config
          configMap:
            name: local-provisioner-config
        - name: local-ssd
          hostPath:
            path: /mnt/tidb/ssd
        - name: local-sharedssd
          hostPath:
            path: /mnt/tidb/sharedssd
        - name: local-backup
          hostPath:
            path: /mnt/tidb/backup
        - name: local-monitoring
          hostPath:
            path: /mnt/tidb/monitoring
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: local-storage-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: local-storage-provisioner-pv-binding
  namespace: kube-system
subjects:
- kind: ServiceAccount
  name: local-storage-admin
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: system:persistent-volume-provisioner
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: local-storage-provisioner-node-clusterrole
  namespace: kube-system
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: local-storage-provisioner-node-binding
  namespace: kube-system
subjects:
- kind: ServiceAccount
  name: local-storage-admin
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: local-storage-provisioner-node-clusterrole
  apiGroup: rbac.authorization.k8s.io

kubectl apply -f /k8s_apps/tidb/1.5.0-beta.1/local-volume-provisioner.yaml

为PV准备挂载点,在目标存储服务器执行脚本:

for i in $(seq 1 5); do
  mkdir -p /data0/tidb/ssd/vol${i}
  mkdir -p /mnt/tidb/ssd/vol${i}
  mount --bind /data0/tidb/ssd/vol${i} /mnt/tidb/ssd/vol${i}
done

for i in $(seq 1 5); do
  mkdir -p /data0/tidb/sharedssd/vol${i}
  mkdir -p /mnt/tidb/sharedssd/vol${i}
  mount --bind /data0/tidb/sharedssd/vol${i} /mnt/tidb/sharedssd/vol${i}
done

for i in $(seq 1 5); do
  mkdir -p /data0/tidb/monitoring/vol${i}
  mkdir -p /mnt/tidb/monitoring/vol${i}
  mount --bind /data0/tidb/monitoring/vol${i} /mnt/tidb/monitoring/vol${i}
done

 可在KubeSphere看到可用的PVs,等用了SC的Pods起来后就可以赋予绑定,不然这些pod会报错。

 

3.3 创建crd

kubectl create -f /k8s_apps/tidb/1.5.0-beta.1/crd.yaml

3.4 执行operator

kubectl create namespace tidb-admin

helm install --namespace tidb-admin tidb-operator pingcap/tidb-operator --version v1.5.0-beta.1
kubectl get pods --namespace tidb-admin -l app.kubernetes.io/instance=tidb-operator

3.5 创建cluster/dashboard/monitor容器组

kubectl create namespace tidb-cluster
kubectl -n tidb-cluster apply -f /k8s_apps/tidb/1.5.0-beta.1/tidb-cluster.yaml
kubectl -n tidb-cluster apply -f /k8s_apps/tidb/1.5.0-beta.1/tidb-dashboard.yaml
kubectl -n tidb-cluster apply -f /k8s_apps/tidb/1.5.0-beta.1/tidb-monitor.yaml
kubectl -n tidb-cluster apply -f /k8s_apps/tidb/1.5.0-beta.1/tidb-ng-monitor.yaml

3.6 装好后的容器状况

3.7 设置访问入口(Ingress & Port)

编辑客户机hosts

192.168.0.103   tidb-01.k8s-t2.com
# db连接访问4000端口

192.168.0.103   tidb-pd.k8s-t2.com
# 管理后台, /dashboard 访问 TiDB Dashboard 页面,默认用户名为 root,密码为空

192.168.0.103   tidb-grafana.k8s-t2.com
# 访问 TiDB 的 Grafana 界面,默认用户名和密码都为 admin

192.168.0.103   tidb-prometheus.k8s-t2.com
# 访问 TiDB 的 Prometheus 管理界面

ingress.yaml

# Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tidb-pd
  namespace: tidb-cluster
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/session-cookie-name: stickounet
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
  rules:
    - host: tidb-pd.k8s-t2.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: basic-pd
              port:
                number: 2379
  ingressClassName: nginx
 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tidb-grafana
  namespace: tidb-cluster
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/session-cookie-name: stickounet
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
  rules:
    - host: tidb-grafana.k8s-t2.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: basic-grafana
              port:
                number: 3000
  ingressClassName: nginx
   
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tidb-prometheus
  namespace: tidb-cluster
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/session-cookie-name: stickounet
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
  rules:
    - host: tidb-prometheus.k8s-t2.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: basic-prometheus
              port:
                number: 9090
  ingressClassName: nginx
  
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tidb-db01
  namespace: tidb-cluster
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/session-cookie-name: stickounet
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
  rules:
    - host: tidb-01.k8s-t2.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: basic-tidb
              port:
                number: 4000
  ingressClassName: nginx

 用域名访问数据库4000端口,需做些端口开放措施(见: 香橙派4和树莓派4B构建K8S集群实践之五:端口公开访问配置_bennybi的博客-CSDN博客)

 至此完成。

4. 遇到的问题

local-volume-provisioner:v2.3.4 没有for arm体系的版本, 拉取时报错

解决办法:  编辑local-volume-provisioner.yaml, 版本修改为image: "quay.io/external_storage/local-volume-provisioner:v2.5.0"

没有正确配置PV挂载点,pd,kv pods起不来

解决办法:参考上面配置存储一节 

5. 参考

- 在标准 Kubernetes 上部署 TiDB 集群 | PingCAP 文档中心

- 在 ARM64 机器上部署 TiDB 集群 | PingCAP 文档中心

- k8s Tidb实践-部署篇_TiDB 社区干货传送门的博客-CSDN博客 

- local-volume-provisioner使用 - 简书

- https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/blob/master/docs/operations.md#sharing-a-disk-filesystem-by-multiple-filesystem-pvs 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mongo可视化工具studio 3t无限试用

文章目录 前言一、下载二、使用步骤1.下载后,无脑下一步安装好2.开始无限试用 总结 前言 mongodb可以说是比较流行的nosql数据库了,它灵活多变的存储,为项目中后续可能的变更提供了极大的便利性,工欲善其事必先利其器,今天推荐一款mongo的可视化工具: studio 3t 一、下载 各版…

Linux驱动进阶(一)——设备驱动中的并发控制

文章目录 前言并发与竞争原子变量操作原子变量操作原子整型操作原子位操作 自旋锁自旋锁概述自旋锁的使用自旋锁的使用注意事项 信号量信号量概述信号量的实现信号量的使用自旋锁与信号量的对比 完成量完成量概述完成量的实现完成量的使用 小结 前言 现代操作系统有三大特征&a…

华为云流水线CodeArts Pipeline怎么样?能实现哪些功能?

华为云流水线服务CodeArts Pipeline,旨在提升编排体验,开放插件平台,并提供标准化的DevOps企业治理模型,将华为公司内的优秀研发实践赋能给伙伴和客户。 灵活编排、高效调度 开放流水线插件 内置企业DevOps研发治理模型 体验通…

Mysql常见的集群方案

一,MySQL Replication MySQL Replication 是官方提供的主从同步方案,用于将一个 MySQL 的实例同步到另一个实例中。Replication 为保证数据安全做了重要的保证,是目前运用最广的 MySQL 容灾方案。Replication 用两个或以上的实例搭建了 MySQ…

driftingblues3靶机详解

driftingblues3靶机复盘 打完这个靶机后发现自己最近一段时间进步了很多,并且有了一些自己的思想。 这里扫除来一个22和80端口,大概率是要用到ssh远程登陆的。 扫描ip的同时扫描了一下目录,发现扫描出来很多目录,这里我还很窃喜&…

linux中miniconda的重装问题

linux中miniconda的重装问题Linux安装condaconda使用yaml创建虚拟环境 注意问题: 安装minconda时: 安装好之后,把别人的环境直接复制到自己的‘miniconda3/envs’下,再修改该文件的拥有者和群组 source .bashrc 重新激活 问题…

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一)

UPCGBlueprintElement是PCGGraph中自定义节点的基类,但官方目前还没有给出详细的文档,所以从源代码里找点答案。 文章目录 可覆盖函数(Override Functions)Excute 和 Excute with ContextLoop Body函数和Loop函数Point Loop Body和…

LabVIEW-通过子VI实现组合数

一、题目 已知组合数 请根据这一计算规则,封装设计子程序,实现的计算,并编写测试程序验证子VI设计的正确性。 二、过程 设置数值输入控件的“属性”-“数据输入”-“最小值”为1,当输入值为0时强制转换为1。在程序框图界面放置…

更新换代IDEA和插件啦

1.背景介绍 在2019年的时候接触到IDEA了,本站也先后学习了IDEA的相关知识,当时一直到3个月前也一直都使用的是IDEA2018.2的版本,常用的各种插件也都是基于这个版本应用的不亦乐乎。期间也有在自己的电脑中体验过2021的版本,但是办…

顺序容器Primer

顺序容器在以下方面都有不同的性能折衷: 1.像容器中添加和删除元素的代价; 2.非顺序访问容器中元素的代价; 原因:容器的存储要么采用数组型,要么链式存储,前者导致不能随机添加删除,后者不能…

代码随想录算法训练营第六十二天—图论补充

理论基础&#xff1a; 第一题、所有可能的路径 力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void dfs(vector<vector<int>>& graph, int x){if(x graph.size() - 1){result.push_back(path);retu…

【Python】面向对象 - 继承 ① ( 继承概念 | 继承语法 | 单继承与多继承 | 代码示例 )

文章目录 一、继承简介1、继承概念2、继承语法3、单继承与多继承 二、代码示例1、代码示例 - 单继承2、代码示例 - 多继承 一、继承简介 1、继承概念 继承 是 面向对象 特性之一 , ( 封装 - 继承 - 多态 ) 继承 可以 令一个类 从 另一个类 中 继承 该类的 属性 和 方法 , 继承…

创建数据库,删除数据库

1.创建数据库&#xff0c;删除数据库&#xff0c;查询创建数据的语句&#xff0c;使用数据库&#xff0c;查询当前默认的数据库以及使用的编码方式校验规则 2.数字&#xff0c;文本&#xff0c;日期在一章表中定义多个字段&#xff0c;要使用今天提到的所有的数据类型 登入roo…

SpringBoot的CSGO赛事管理系统

线考试系统的开发运用java技术&#xff0c;MIS的总体思想&#xff0c;以及MYSQL等技术的支持下共同完成了该系统的开发&#xff0c;实现了在线考试管理的信息化&#xff0c;使用户体验到更优秀的在线考试管理&#xff0c;管理员管理操作将更加方便&#xff0c;实现目标。

跳木桩----(爱思创)

源代码 #include <bits/stdc.h> using namespace std;int main(){int n,a[10010],maxd,ans0;cin>>n;for(int i1;i<n;i){cin>>a[i];}cin>>maxd;sort(a1,an1);for(int i1;i<n;i){if(a[i]-a[i-1]<maxd){ans;}else{break;}}cout<<ans<&…

NLP(五十九)使用FastChat部署百川大模型

本文将会介绍如何使用FastChat来部署国产大模型——百川模型。 在此之前&#xff0c;我们先来了解两个概念——百川模型和FastChat. 百川模型 2023年6月15日&#xff0c;被称为「中国 ChatGPT 梦之队」的百川智能公司&#xff0c;推出了 70 亿参数量的中英文预训练大模型——b…

Java 匿名对象

一、简介 1.1.含义 没有名字的对象 。以常规的创建对象的方法&#xff1a; AtomicInteger atomicInteger new AtomicInteger(100000);格式&#xff1a; 类名 变量名 new 类名(); 这样就完成了对象的创建。注意&#xff1a;&#xff08;&#xff09;内可以无参数&#xff0c…

津津乐道设计模式 - 状态模式详解(以交通信号灯举例带你快速理解)

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Anaconda删除虚拟环境

# 查看环境&#xff0c;确定待删除环境位置 conda env list# 按照位置进行删除 conda env remove -p 要删除的虚拟环境路径举例&#xff1a; 删除py37执行如下命令&#xff1a; conda env remove -p D:\A\envs\py37

【GAN】基础知识(还在更新)

还没写完&#xff0c;别骂了.....遇到啥新东西也会补充进来 1. 损失函数/距离度量 1.1 KL散度 用来衡量分布之间距离 1.1.1 推导过程 如果想要对KL散度有一个比较好的理解&#xff0c;我其实建议看一下&#xff0c;从信息熵的角度入手我认为是一个比较好的切入点 相对熵&a…