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

这篇具有很好参考价值的文章主要介绍了香橙派4和树莓派4B构建K8S集群实践之八: TiDB。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 说明

2. 准备工作

3. 安装

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

3.2 准备存储类

3.3 创建crd

3.4 执行operator

3.5 创建cluster/dashboard/monitor容器组

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

4. 装好后的容器状况

5. 遇到的问题

6. 参考


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/ssd ssd-storage 给 TiKV 使用
/mnt/tidb/sharedssd /data0/tidb/sharedssd shared-ssd-storage 给 PD 使用
/mnt/tidb/monitoring /data0/tidb/monitoring monitoring-storage 给监控数据使用
/mnt/tidb/backup /data0/tidb/backup backup-storage 给 TiDB Binlog 和备份数据使用
... ...

2. 准备工作

从 Releases · pingcap/tidb-operator · GitHub 拿下需要的文件清单:

说明 来源 备注
local-volume-provisioner.yaml 本地存储对象 https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/local-pv/local-volume-provisioner.yaml 修改对应路径
crd.yaml https://raw.githubusercontent.com/pingcap/tidb-operator/master/manifests/crd.yaml
tidb-cluster.yaml https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-cluster.yaml 修改对应Stroage Class
tidb-dashboard.yaml https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-dashboard.yaml
tidb-monitor.yaml https://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会报错。

香橙派4和树莓派4B构建K8S集群实践之八: TiDB,K8s,技术笔记,kubernetes,tidb,容器

 香橙派4和树莓派4B构建K8S集群实践之八: TiDB,K8s,技术笔记,kubernetes,tidb,容器

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 设置访问入口(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

香橙派4和树莓派4B构建K8S集群实践之八: TiDB,K8s,技术笔记,kubernetes,tidb,容器

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

香橙派4和树莓派4B构建K8S集群实践之八: TiDB,K8s,技术笔记,kubernetes,tidb,容器

4. 装好后的容器状况

香橙派4和树莓派4B构建K8S集群实践之八: TiDB,K8s,技术笔记,kubernetes,tidb,容器 至此完成。

5. 遇到的问题

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起不来

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

用tidb-initializer.yaml初始化失败, Init: Error

原因:所含的 image: tnir/mysqlclient 只有amd64体系而没有arm64,导致初始化脚本调用失败,结论:暂不能用。

6. 参考

- 在标准 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 文章来源地址https://www.toymoban.com/news/detail-544061.html

到了这里,关于香橙派4和树莓派4B构建K8S集群实践之八: TiDB的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8s 多集群实践思考和探索

    作者:vivo 互联网容器团队 - Zhang Rong 本文主要讲述了一些对于K8s多集群管理的思考,包括为什么需要多集群、多集群的优势以及现有的一些基于Kubernetes衍生出的多集群管理架构实践。 随着K8s和云原生技术的快速发展,以及各大厂商在自己的数据中心使用K8s的API进行容器化应

    2024年02月09日
    浏览(36)
  • K8S集群实践之九: Ceph

    因香橙派和树莓派资源所限,转移到基于VirtualBox建立的VMs继续实践。 虚拟机环境列表: Host Name IP 配置 备注 k8s-c0-master0 10.0.3.6 Ubuntu 22.04.3 LTS 8核32G, 200G(sda) + 100G(sdb) 虚拟机 k8s-c0-node0 10.0.3.7 Ubuntu 22.04.3 LTS 4核8G, 200G(sda) + 100G(sdb) ... k8s-c0-node1 10.0.3.8 Ubuntu 22.04.3 LTS 4核8G, 200G(sda)

    2024年02月08日
    浏览(31)
  • k8s实践之mysql集群搭建(十五)

    先下载 k8s实践之mysql集群搭建资料 主从模式简介: 当master主服务器上的数据发生改变时,则将其改变写入二进制(binlog)事件日志文件中; slave从服务器会在一定时间间隔内对master主服务器上的二进制日志进行探测,探测其是否发生过改变(通过二进制文件的大小是否不同

    2024年02月14日
    浏览(33)
  • Jenkins构建项目并部署到K8S实践

    本次实践使用gitee上的开源项目悟空CRM9.0进行构建并部署到k8S中 悟空CRM9.0项目简介: 悟空CRM-基于jfinal+vue+ElementUI的前后端分离CRM系统。 项目gitee地址:https://gitee.com/wukongcrm/72crm-java.git 软件 版本 IP 备注 K8S 1.26.x 192.168.1.124 192.168.1.124为K8S集群master01节点IP地址 Harbor 2.6.2 192.168.1.

    2024年02月20日
    浏览(50)
  • K8s集群nginx-ingress监控告警最佳实践

    本文分享自华为云社区《K8s集群nginx-ingress监控告警最佳实践》,作者:可以交个朋友。 nginx-ingress作为K8s集群中的关键组成部分。主要负责k8s集群中的服务发布,请求转发等功能。如果在访问服务过程中出现404和502等情况,需要引起注意。 可以通过CCE集群插件kube-prometheus-s

    2024年04月22日
    浏览(25)
  • 基于 k8s+docker 环境构建一个高可用、高性能的 web 集群。

    目录 项目架构图 项目描述 项目环境 环境准备 IP地址规划 关闭selinux和firewall 配置静态ip地址 修改主机名 升级系统(可做可不做) 添加hosts解析 项目步骤 一.使用ProcessOn设计了整个集群的架构,规划好服务器的IP地址,使用kubeadm安装k8s单master的集群环境(1个master+2个node节点

    2024年02月07日
    浏览(46)
  • 云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

    基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。 Note: 由于是测试环境,以下创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。 共用到了三台

    2024年02月19日
    浏览(36)
  • 构建 dotnet&vue 应用镜像->推送到 Nexus 仓库->部署为 k8s 服务实践

    前面分享了 k8s 的部署安装,本篇来点实操,将会把一个 .net core + vue 的项目(zhontai),打包构建成 docker 镜像,推送到 nexus 镜像仓库,并部署到 k8s 中 要实现项目的部署,除了准备要部署的环境(k8s),还需要准备项目所用到的各中间件,本文旨在分享部署的一个整体流程

    2024年02月03日
    浏览(37)
  • 本地k8s集群搭建保姆级教程(3)-安装k8s集群

    1.1 增加镜像替换脚本 注意:请在master机器上执行 添加脚本内容: 1.2 查看k8s版本 1.3 执行脚本 2.1 初始化master节点 在master机器上执行如下命令: 说明: –apiserver-advertise-address= 你master节点的ip 看到如下内容,说明master节点初始化成功 图片中最后一行记得要保存起来,worker节

    2024年02月15日
    浏览(31)
  • k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

    1.1、部署方式的变迁 传统部署时代: 在物理服务器上运行应用程序 无法为应用程序定义资源边界 导致资源分配问题 例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包