> For the complete documentation index, see [llms.txt](https://darren.gitbook.io/project/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://darren.gitbook.io/project/k8s-yun-wei-pai-cha/untitled-1/k8s-you-hua.md).

# k8s 优化

### <https://jeremyxu2010.github.io/2019/11/kubernetes%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2%E8%BF%90%E8%90%A5%E5%AE%9E%E8%B7%B5%E6%80%BB%E7%BB%93/> <a href="#kubernetes" id="kubernetes"></a>

### kubernetes大规模集群优化 <a href="#kubernetes" id="kubernetes"></a>

#### 内核参数调化 <a href="#heading" id="heading"></a>

增大部分内核选项，在`/etc/sysctl.conf`文件中添加下面片断：

|   |   |
| - | - |

#### etcd性能优化 <a href="#etcd" id="etcd"></a>

1. Etcd对磁盘写入延迟非常敏感，因此对于负载较重的集群，etcd一定要使用local SSD或者高性能云盘。可以使用`fio`测量磁盘实际顺序 IOPS。

|   |   |
| - | - |

1. 由于etcd必须将数据持久保存到磁盘日志文件中，因此来自其他进程的磁盘活动可能会导致增加写入时间，结果导致etcd请求超时和临时leader丢失。因此可以给etcd进程更高的磁盘优先级，使etcd服务可以稳定地与这些进程一起运行。

|   |   |
| - | - |

1. 默认etcd空间配额大小为 2G，超过 2G 将不再写入数据。通过给etcd配置 `--quota-backend-bytes` 参数增大空间配额，最大支持 8G。

|   |   |
| - | - |

1. 如果etcd leader处理大量并发客户端请求，可能由于网络拥塞而延迟处理follower对等请求。在follower 节点上可能会产生如下的发送缓冲区错误的消息：

|   |   |
| - | - |

可以通过提高etcd对于对等网络流量优先级来解决这些错误。在 Linux 上，可以使用 tc 对对等流量进行优先级排序：

|   |   |
| - | - |

1. 为了在大规模集群下提高性能，可以将events存储在单独的 ETCD 实例中，可以配置kube-apiserver参数：

|   |   |
| - | - |

#### docker优化 <a href="#docker" id="docker"></a>

1. 配置docker daemon并行拉取镜像，以提高镜像拉取效率，在`/etc/docker/daemon.json`中添加以下配置：

|   |   |
| - | - |

1. 可以使用local SSD或者高性能云盘作为docker容器的持久数据目录，在`/etc/docker/daemon.json`中添加以下配置：

|   |   |
| - | - |

1. 启动pod时都会拉取pause镜像，为了减小拉取pause镜像网络带宽，可以每个node预加载pause镜像，在每个node节点上执行以下命令：

|   |   |
| - | - |

#### kubelet优化 <a href="#kubelet" id="kubelet"></a>

1. 设置 `--serialize-image-pulls=false`， 该选项配置串行拉取镜像，默认值时true，配置为false可以增加并发度。但是如果docker daemon 版本小于 1.9，且使用 aufs 存储则不能改动该选项。
2. 设置`--image-pull-progress-deadline=30`， 配置镜像拉取超时。默认值时1分，对于大镜像拉取需要适量增大超时时间。
3. kubelet 单节点允许运行的最大 Pod 数：`--max-pods=110`（默认是 110，可以根据实际需要设置）

#### kube-apiserver优化 <a href="#kube-apiserver" id="kube-apiserver"></a>

1. 设置 `--apiserver-count` 和 `--endpoint-reconciler-type`，可使得多个 kube-apiserver 实例加入到 Kubernetes Service 的 endpoints 中，从而实现高可用。
2. 设置 `--max-requests-inflight` 和 `--max-mutating-requests-inflight`，默认是 200 和 400。 节点数量在 1000 - 3000 之间时，推荐：

|   |   |
| - | - |

节点数量大于 3000 时，推荐：

|   |   |
| - | - |

1. 使用`--target-ram-mb`配置kube-apiserver的内存，按以下公式得到一个合理的值：

|   |   |
| - | - |

#### kube-controller-manager优化 <a href="#kube-controller-manager" id="kube-controller-manager"></a>

1. kube-controller-manager可以通过 leader election 实现高可用，添加以下命令行参数：

|   |   |
| - | - |

1. 限制与kube-apiserver通信的qps，添加以下命令行参数：

|   |   |
| - | - |

#### kube-scheduler优化 <a href="#kube-scheduler" id="kube-scheduler"></a>

1. kube-scheduler可以通过 leader election 实现高可用，添加以下命令行参数：

|   |   |
| - | - |

1. 限制与kube-apiserver通信的qps，添加以下命令行参数：

|   |   |
| - | - |

#### pod优化 <a href="#pod" id="pod"></a>

在运行Pod的时候也需要注意遵循一些最佳实践。

1. 为容器设置资源请求和限制，尤其是一些基础插件服务

|   |   |
| - | - |

在k8s中，会根据pod的limit 和 requests的配置将pod划分为不同的qos类别：

|   |   |
| - | - |

当机器可用资源不够时，kubelet会根据qos级别划分迁移驱逐pod。被驱逐的优先级：`BestEffort > Burstable > Guaranteed`。

1. 对关键应用使用 nodeAffinity、podAffinity 和 podAntiAffinity 等保护，使其调度分散到不同的node上。比如kube-dns 配置：
2. 尽量使用控制器来管理容器（如 Deployment、StatefulSet、DaemonSet、Job 等）

### kubernetes集群数据备份与还原 <a href="#kubernetes-1" id="kubernetes-1"></a>

#### etcd数据 <a href="#etcd-1" id="etcd-1"></a>

**备份**

备份数据前先找到etcd集群当前的leader：

|   |   |
| - | - |

然后登录到leader节点，备份snapshot db文件：

|   |   |
| - | - |

**还原**

将备份的snaphost db文件上传到各个etcd节点，使用以下命令还原数据：

|   |   |
| - | - |

#### harbor <a href="#harbor" id="harbor"></a>

如果使用harbor作为镜像仓库与chart仓库，可使用脚本将harbor中所有的镜像和chart导入导出。

**备份**

|   |   |
| - | - |

**还原**

|   |   |
| - | - |

#### pvc对应的存储卷 <a href="#pvc" id="pvc"></a>

集群中其它应用数据一般是保存在pvc对应的存储卷中的。

**备份**

首先根据pvc找到对应的pv：

|   |   |
| - | - |

找到pv的挂载目录：

|   |   |
| - | - |

使用rsync命令备份数据：

|   |   |
| - | - |

**还原**

首先根据pvc找到对应的pv：

|   |   |
| - | - |

找到pv的挂载目录：

|   |   |
| - | - |

使用rsync命令备份数据：

|   |   |
| - | - |

#### 备份数据管理 <a href="#heading-7" id="heading-7"></a>

所有备份出的数据可以存放在一个目录下，并使用[restic](https://github.com/restic/restic)工具保存到多个后端存储系统上，如：

|   |   |
| - | - |

DONE.

### 参考 <a href="#heading-8" id="heading-8"></a>

1. <https://www.flftuu.com/2019/03/12/%E5%A4%A7%E8%A7%84%E6%A8%A1%E9%9B%86%E7%BE%A4%E9%85%8D%E7%BD%AE%E4%BC%98%E5%8C%96/>
2. <https://testerhome.com/topics/7509>
3. <https://etcd.io/docs/v3.4.0/tuning/>
4. <https://docs.docker.com/engine/reference/commandline/dockerd/>
5. <https://kubernetes.io/docs/setup/best-practices/cluster-large/>
6. <https://www.jianshu.com/p/904a3f2b6579>
7. <https://github.com/restic/restic>
8. <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#sftp>
