Kubernetes 上的 TiDB 集群环境需求

本文介绍在 Kubernetes 上部署 TiDB 集群的软硬件环境需求。

软件版本要求

软件名称版本
DockerDocker CE 18.09.6
Kubernetesv1.12.5+
CentOSCentOS 7.6,内核要求为 3.10.0-957 或之后版本
Helmv3.0.0+

配置防火墙

建议关闭防火墙:

systemctl stop firewalld systemctl disable firewalld

如果无法关闭 firewalld 服务,为了保证 Kubernetes 正常运行,需要打开以下端口:

  1. 在 Master 节点上,打开以下端口,然后重新启动服务:

    firewall-cmd --permanent --add-port=6443/tcp firewall-cmd --permanent --add-port=2379-2380/tcp firewall-cmd --permanent --add-port=10250/tcp firewall-cmd --permanent --add-port=10251/tcp firewall-cmd --permanent --add-port=10252/tcp firewall-cmd --permanent --add-port=10255/tcp firewall-cmd --permanent --add-port=8472/udp firewall-cmd --add-masquerade --permanent # 当需要在 Master 节点上暴露 NodePort 时候设置 firewall-cmd --permanent --add-port=30000-32767/tcp systemctl restart firewalld
  2. 在 Node 节点上,打开以下端口,然后重新启动服务:

    firewall-cmd --permanent --add-port=10250/tcp firewall-cmd --permanent --add-port=10255/tcp firewall-cmd --permanent --add-port=8472/udp firewall-cmd --permanent --add-port=30000-32767/tcp firewall-cmd --add-masquerade --permanent systemctl restart firewalld

配置 Iptables

FORWARD 链默认配置成 ACCEPT,并将其设置到开机启动脚本里:

iptables -P FORWARD ACCEPT

禁用 SELinux

setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

关闭 Swap

Kubelet 正常工作需要关闭 Swap,并且把 /etc/fstab 里面有关 Swap 的那行注释掉:

swapoff -a sed -i 's/^\(.*swap.*\)$/#\1/' /etc/fstab

内核参数设置

按照下面的配置设置内核参数,也可根据自身环境进行微调:

modprobe br_netfilter cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-arptables = 1 net.core.somaxconn = 32768 vm.swappiness = 0 net.ipv4.tcp_syncookies = 0 net.ipv4.ip_forward = 1 fs.file-max = 1000000 fs.inotify.max_user_watches = 1048576 fs.inotify.max_user_instances = 1024 net.ipv4.conf.all.rp_filter = 1 net.ipv4.neigh.default.gc_thresh1 = 80000 net.ipv4.neigh.default.gc_thresh2 = 90000 net.ipv4.neigh.default.gc_thresh3 = 100000 EOF sysctl --system

配置 Irqbalance 服务

Irqbalance 服务可以将各个设备对应的中断号分别绑定到不同的 CPU 上,以防止所有中断请求都落在同一个 CPU 上而引发性能瓶颈。

systemctl enable irqbalance systemctl start irqbalance

CPUfreq 调节器模式设置

为了让 CPU 发挥最大性能,请将 CPUfreq 调节器模式设置为 performance 模式。详细参考在部署目标机器上配置 CPUfreq 调节器模式

cpupower frequency-set --governor performance

Ulimit 设置

TiDB 集群默认会使用很多文件描述符,需要将工作节点上面的 ulimit 设置为大于等于 1048576

cat <<EOF >> /etc/security/limits.conf root soft nofile 1048576 root hard nofile 1048576 root soft stack 10240 EOF sysctl --system

Docker 服务

安装 Docker 时,建议选择 Docker CE 18.09.6 及以上版本。请参考 Docker 安装指南 进行安装。

安装完 Docker 服务以后,执行以下步骤:

  1. 将 Docker 的数据保存到一块单独的盘上,Docker 的数据主要包括镜像和容器日志数据。通过设置 --data-root 参数来实现:

    cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "data-root": "/data1/docker" } EOF

    上面会将 Docker 的数据目录设置为 /data1/docker

  2. 设置 Docker daemon 的 ulimit。

    1. 创建 docker service 的 systemd drop-in 目录 /etc/systemd/system/docker.service.d

      mkdir -p /etc/systemd/system/docker.service.d
    2. 创建 /etc/systemd/system/docker.service.d/limit-nofile.conf 文件,并配置 LimitNOFILE 参数的值,取值范围为大于等于 1048576 的数字即可。

      cat > /etc/systemd/system/docker.service.d/limit-nofile.conf <<EOF [Service] LimitNOFILE=1048576 EOF
    3. 重新加载配置。

      systemctl daemon-reload && systemctl restart docker

Kubernetes 服务

参考 Kubernetes 官方文档,部署一套多 Master 节点高可用集群。

Kubernetes Master 节点的配置取决于 Kubernetes 集群中 Node 节点个数,节点数越多,需要的资源也就越多。节点数可根据需要做微调。

Kubernetes 集群 Node 节点个数Kubernetes Master 节点配置
1-51vCPUs 4GB Memory
6-102vCPUs 8GB Memory
11-1004vCPUs 16GB Memory
101-2508vCPUs 32GB Memory
251-50016vCPUs 64GB Memory
501-500032vCPUs 128GB Memory

安装完 Kubelet 之后,执行以下步骤:

  1. 将 Kubelet 的数据保存到一块单独盘上(可跟 Docker 共用一块盘),Kubelet 主要占盘的数据是 emptyDir 所使用的数据。通过设置 --root-dir 参数来实现:

    echo "KUBELET_EXTRA_ARGS=--root-dir=/data1/kubelet" > /etc/sysconfig/kubelet systemctl restart kubelet

    上面会将 Kubelet 数据目录设置为 /data1/kubelet

  2. 通过 kubelet 设置预留资源,保证机器上的系统进程以及 Kubernetes 的核心进程在工作负载很高的情况下仍然有足够的资源来运行,从而保证整个系统的稳定。

TiDB 集群资源需求

请根据服务器建议配置来规划机器的配置。

另外,在生产环境中,尽量不要在 Kubernetes Master 节点部署 TiDB 实例,或者尽可能少地部署 TiDB 实例。因为网卡带宽的限制,Master 节点网卡满负荷工作会影响到 Worker 节点和 Master 节点之间的心跳信息汇报,导致比较严重的问题。