Kubernetes 上的 TiDB 集群环境需求

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

软件版本要求

软件名称 版本
Docker Docker CE 18.09.6
Kubernetes v1.12.5+
CentOS CentOS 7.6,内核要求为 3.10.0-957 或之后版本

配置防火墙

建议关闭防火墙:

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:

    vim /etc/systemd/system/docker.service
    LimitNOFILE=1048576
    

    设置 LimitNOFILE 大于等于 1048576

    注意:

    LimitNOFILE 需要显式设置为 1048576 或者更大,而不是默认的 infinity,由于 systemdbuginfinitysystemd 某些版本中指的是 65536

Kubernetes 服务

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

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

Kubernetes 集群 Node 节点个数 Kubernetes Master 节点配置
1-5 1vCPUs 4GB Memory
6-10 2vCPUs 8GB Memory
11-100 4vCPUs 16GB Memory
101-250 8vCPUs 32GB Memory
251-500 16vCPUs 64GB Memory
501-5000 32vCPUs 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 节点之间的心跳信息汇报,导致比较严重的问题。