Kubernetes 上的 TiDB 集群环境需求

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

软件版本要求

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

配置防火墙

建议关闭防火墙:

  1. systemctl stop firewalld
  2. systemctl disable firewalld

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

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

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

    1. firewall-cmd --permanent --add-port=10250/tcp
    2. firewall-cmd --permanent --add-port=10255/tcp
    3. firewall-cmd --permanent --add-port=8472/udp
    4. firewall-cmd --permanent --add-port=30000-32767/tcp
    5. firewall-cmd --add-masquerade --permanent
    6. systemctl restart firewalld

配置 Iptables

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

  1. iptables -P FORWARD ACCEPT

禁用 SELinux

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

关闭 Swap

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

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

内核参数设置

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

  1. modprobe br_netfilter
  2. cat <<EOF > /etc/sysctl.d/k8s.conf
  3. net.bridge.bridge-nf-call-ip6tables = 1
  4. net.bridge.bridge-nf-call-iptables = 1
  5. net.bridge.bridge-nf-call-arptables = 1
  6. net.core.somaxconn = 32768
  7. vm.swappiness = 0
  8. net.ipv4.tcp_syncookies = 0
  9. net.ipv4.ip_forward = 1
  10. fs.file-max = 1000000
  11. fs.inotify.max_user_watches = 1048576
  12. fs.inotify.max_user_instances = 1024
  13. net.ipv4.conf.all.rp_filter = 1
  14. net.ipv4.neigh.default.gc_thresh1 = 80000
  15. net.ipv4.neigh.default.gc_thresh2 = 90000
  16. net.ipv4.neigh.default.gc_thresh3 = 100000
  17. EOF
  18. sysctl --system

配置 Irqbalance 服务

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

  1. systemctl enable irqbalance
  2. systemctl start irqbalance

CPUfreq 调节器模式设置

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

  1. cpupower frequency-set --governor performance

Ulimit 设置

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

  1. cat <<EOF >> /etc/security/limits.conf
  2. root soft nofile 1048576
  3. root hard nofile 1048576
  4. root soft stack 10240
  5. EOF
  6. sysctl --system

Docker 服务

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

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

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

    1. cat > /etc/docker/daemon.json <<EOF
    2. {
    3. "exec-opts": ["native.cgroupdriver=systemd"],
    4. "log-driver": "json-file",
    5. "log-opts": {
    6. "max-size": "100m"
    7. },
    8. "storage-driver": "overlay2",
    9. "storage-opts": [
    10. "overlay2.override_kernel_check=true"
    11. ],
    12. "data-root": "/data1/docker"
    13. }
    14. EOF

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

  2. 设置 Docker daemon 的 ulimit。

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

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

      1. cat > /etc/systemd/system/docker.service.d/limit-nofile.conf <<EOF
      2. [Service]
      3. LimitNOFILE=1048576
      4. EOF

      集群环境要求 - 图1注意

      请勿将 LimitNOFILE 的值设置为 infinity。由于 systemd 的 buginfinitysystemd 某些版本中指的是 65536

    3. 重新加载配置。

      1. 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 参数来实现:

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

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

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

TiDB 集群资源需求

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

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