高可用 kubernetes 集群部署实践

前言

Kubernetes(k8s) 凭借着其优良的架构,灵活的扩展能力,丰富的应用编排模型,成为了容器编排领域的事实标准。越来越多的企业拥抱这一趋势,选择 k8s 作为容器化应用的基础设施,逐渐将自己的核心服务迁移到 k8s 之上。

可用性对基础设施而言至关重要。各大云计算厂商纷纷推出了高可用、可扩展的 k8s 托管服务,其中比较有代表性的有 Amazon EKS、Azure Kubernetes Service (AKS)、Google Kubernetes Engine、阿里云容器服务 Kubernetes 版等。

虽然公有云托管的 k8s 服务百花齐放,但很多企业仍有自建集群的需求。正是这样的原因,促进了一大批出色的 k8s 集群部署方案的诞生,他们的特点如下表所示。

部署方案特点
Kubeadm1. 官方出品的部署工具,提供了 k8s 集群生命周期管理的领域知识。
2. 旨在成为更高级别工具的可组合构建块。
Kubespray1. 支持在裸机和 AWS、GCE、Azure 等众多云平台上部署 k8s。
2. 基于 Ansible Playbook 定义 k8s 集群部署任务。
3. 支持大部分流行的 Linux 发行版。
Kops1. 仅支持在 AWS、GCE 等少数云平台上部署 k8s。
2. 建立在状态同步模型上,用于 dry-run 和自动幂等性。
3. 能够自动生成 Terraform 配置。
Rancher Kubernetes Engine(RKE)1. 著名的开源企业级容器管理平台 Rancher 提供的轻量级 k8s 安装工具。
2. 支持在裸机、虚拟机、公有云上部署和管理 k8s 集群。

上述方案中,RKE 在易用性和灵活性上占有优势。本文接下来将介绍如何通过 RKE 部署一套高可用 k8s 集群,文中使用的 RKE 版本为v0.2.2

高可用 k8s 集群架构

首先需要了解高可用 k8s 集群的架构特点,下图是官方推荐的高可用集群架构图。

其核心思想是让 k8s master 节点中的各类组件具备高可用性,消除单点故障。

  • kube-apiserver - 对外暴露了 k8s API,是整个集群的访问入口。由于 apiserver 本身无状态,可以通过启动多个实例并结合负载均衡器实现高可用。
  • etcd - 用于存储 k8s 集群的网络配置和对象的状态信息,是整个集群的数据中心。可以通过启动奇数个 etcd 实例建立一个冗余的,可靠的数据存储层。
  • kube-scheduler - 为新创建的 pod 选择一个供他们运行的节点。一个集群只能有一个活跃的 kube-scheduler 实例,可以同时启动多个 kube-scheduler 并利用领导者选举功能实现高可用。
  • kube-controller-manager - 集群内部的管理控制中心。一个集群只能有一个活跃的 kube-controller-manager 实例,可以同时启动多个 kube-controller-manager 并利用领导者选举功能实现高可用。

此外,构建集群的时还需要注意下列问题。

  • 节点上 k8s 进程的可靠性。需要让 kubelet、kube-scheduler、kube-controller-manager 等进程在出现故障后能自动重启。
  • 为 worker node 中的非 pod 进程预留资源,防止他们将与 pod 争夺资源导致节点资源短缺。

使用 RKE 构建高可用 k8s 集群

节点规划

构建集群的第一步是将拥有的服务器按节点功能进行划分,下表展示了笔者环境下的节点规划情况。

IP角色
192.168.0.10部署节点
192.168.0.11k8s master - api-server, etcd, scheduler, controller-manager
192.168.0.12k8s master - api-server, etcd, scheduler, controller-manager
192.168.0.13k8s master - api-server, etcd, scheduler, controller-manager
192.168.0.14k8s worker - kubelet, kube-proxy
192.168.0.15k8s worker - kubelet, kube-proxy
192.168.0.16k8s worker - kubelet, kube-proxy
192.168.0.17k8s worker - kubelet, kube-proxy

规划说明:

  1. 单独选择了一台机器192.168.0.10作为部署节点。如果机器数不多,可以将部署节点加入到 k8s 集群中。
  2. 为了保证可用性,择了三台机器部署 k8s master 组件。如果有条件,可以将 etcd 和 master 中的其他组件分开部署,这样可以根据需要更灵活地控制实例个数。例如,在访问压力不大但对数据可靠性要求比较高的情况下,可以专门选择 5 台机器部署 etcd,另外选择 3 台机器部署 master 中的其他组件。
  3. 剩余四台机器作为 k8s worker 节点。节点个数需要根据实际情况动态调整。当有 pod 因资源不足一直处于 pending 状态时,可以对 worker 进行扩容。当 node 的资源利用率较低时,且此 node 上存在的 pod 都能被重新调度到其他 node 上运行时,可以对 worker 进行缩容。

环境准备

在完成节点规划后,需要进行环境准备工作,主要包含以下内容:

  1. 安装 RKE - 需要在部署节点(192.168.0.10)上安装 RKE 二进制包,具体安装方法可参考 download-the-rke-binary。
  2. 配置 SSH 免密登录 - 由于 RKE 通过 SSH tunnel 安装部署 k8s 集群,需要配置 RKE 所在节点到 k8s 各节点的 SSH 免密登录。如果 RKE 所在节点也需要加入到 k8s 集群中,需要配置到本机的 SSH 免密登录。
  3. 安装 docker - 由于 RKE 通过 docker 镜像rancher/hyperkube启动 k8s 组件,因此需要在 k8s 集群的各个节点(192.168.0.11 ~ 192.168.0.17 这 7 台机器)上安装 docker。
  4. 关闭 swap - k8s 1.8 开始要求关闭系统的 swap,如果不关闭,默认配置下 kubelet 将无法启动。这里需要关闭所有 k8s worker 节点的 swap。

配置 cluster.yml

在完成环境准备后,需要通过 cluster.yml 描述集群的组成和 k8s 的部署方式。

配置集群组成

配置文件 cluster.yml 中的 nodes 配置项用于描述集群的组成。根据节点规划,对于 k8s master 节点,指定其角色为controlplaneetcd。对于 k8s worker 节点,指定其角色为worker

nodes:- address: 192.168.0.1user: adminrole:- controlplane- etcd...- address: 192.168.0.7user: adminrole:- worker

设置资源预留

K8s 的 worker node 除了运行 pod 类进程外,还会运行很多其他的重要进程,包括 k8s 管理进程,如 kubelet、dockerd,以及系统进程,如 systemd。这些进程对整个集群的稳定性至关重要,因此需要为他们专门预留一定的资源。

笔者环境中的 worker 设置如下:

  • 节点拥有 32 核 CPU,64Gi 内存和 100Gi 存储。
  • 为 k8s 管理进程预留了 1 核 CPU,2Gi 内存和 1Gi 存储。
  • 为系统进程预留了 1 核 CPU,1Gi 内存和 1Gi 存储。
  • 为内存资源设置了 500Mi 的驱逐阈值,为磁盘资源设置了 10% 的驱逐阈值。

在此场景下,节点可分配的 CPU 资源是 29 核,可分配的内存资源是 60.5Gi,可分配的磁盘资源是 88Gi。对于不可压缩资源,当 pod 的内存使用总量超过 60.5Gi 或者磁盘使用总量超过 88Gi 时,QoS 较低的 pod 将被优先驱逐。对于可压缩资源,如果节点上的所有进程都尽可能多的使用 CPU,则 pod 类进程加起来不会使用超过 29 核的 CPU 资源。

上述资源预留设置在 cluster.yml 中具体形式如下。

services:kubelet:extra_args:cgroups-per-qos: Truecgroup-driver: cgroupfskube-reserved: cpu=1,memory=2Gi,ephemeral-storage=1Gikube-reserved-cgroup: /runtime.servicesystem-reserved: cpu=1,memory=1Gi,ephemeral-storage=1Gisystem-reserved-cgroup: /system.sliceenforce-node-allocatable: pods,kube-reserved,system-reservedeviction-hard: memory.available<500Mi,nodefs.available<10%

关于资源预留更详细的内容可参考文章 Reserve Compute Resources for System Daemons。

部署 k8s 集群

当 cluster.yml 文件配置完成后,可以通过命令rke up完成集群的部署任务。下图展示了通过 RKE 部署的 k8s 集群架构图。

该架构有如下特点:

  1. 集群中的各个组件均通过容器方式启动,并且设置重启策略为always。这样当他们出现故障意外退出后,能被自动拉起。
  2. Master 节点上的 kube-scheduler、kube-controller-manager 直接和本机的 API server 通信。
  3. Worker 节点上的 nginx-proxy 拥有 API server 的地址列表,负责代理 kubelet、kube-proxy 发往 API server 的请求。
  4. 为了让集群具有灾备能力,master 节点上的 etcd-rolling-snapshots 会定期保存 etcd 的快照至本地目录/opt/rke/etcd-snapshots中。

配置负载均衡器

在完成了集群部署后,可以通过 API server 访问 k8s。由于环境中启动了多个 kube-apiserver 实例以实现高可用,需要为这些实例架设一个负载均衡器。这里在192.168.0.10上部署了一台 nginx 实现了负载均衡的功能,nginx.conf 的具体配置如下。

...
stream {upstream apiserver {server 192.168.0.11:6443 weight=5 max_fails=3 fail_timeout=60s;server 192.168.0.12:6443 weight=5 max_fails=3 fail_timeout=60s;server 192.168.0.13:6443 weight=5 max_fails=3 fail_timeout=60s;}server {listen 6443;proxy_connect_timeout 1s;proxy_timeout 10s;proxy_pass apiserver;}
}
...

这时,通过负载均衡器提供的端口访问 API server 会出现异常Unable to connect to the server: x509: certificate is valid for xxx, not 192.168.0.10。这里需要将负载均衡器的 IP 地址或域名加入到 API server 的 PKI 证书中,可以通过 cluster.yml 中的 authentication 配置项完成此功能。

authentication:strategy: x509sans:- "192.168.0.10"

修改完 cluster.yml 后,运行命令rke cert-rotate

验证

在完成上述所有步骤后,可以通过命令kubectl get nodes查看节点状态。如果所有节点的状态均为 Ready,则表示集群部署成功。

NAME            STATUS    ROLES              AGE    VERSION
192.168.0.11    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.12    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.13    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.14    Ready     worker             1d     v1.13.5
192.168.0.15    Ready     worker             1d     v1.13.5
192.168.0.16    Ready     worker             1d     v1.13.5
192.168.0.17    Ready     worker             1d     v1.13.5

总结

Rancher Kubernetes Engine(RKE)为用户屏蔽了创建 k8s 集群的复杂细节,简化了部署步骤,降低了构建门槛。对于那些有自建 k8s 集群需求的企业是一个不错的选择。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还不知道 AWS 是什么?这 11 个重点带你认识 AWS !

作者 | Sajan Agrawal译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国云计算的出现使软件行业受益匪浅。大多数公司已经改变了策略&#xff0c;将现有的项目转移到云上&#xff0c;并在此基础上构建新的项目。今天&#xff0c;让我们了解一个名为亚马逊网络服务云&…

KeeperErrorCode = Unimplemented for /test

使用Curator时报错&#xff0c;原因是因为版本问题 zookeeper版本&#xff1a;zookeeper-3.4.8 cuartor版本&#xff1a;3.2.0 看Curator官网的声明&#xff1a; 地址&#xff1a;http://curator.apache.org/ The are currently two released versions of Curator, 2.x.x and 3…

Java-用户交互Scanner

next方式 public class Demo01 {public static void main(String[] args) {// 创建一个 扫描器对象&#xff0c;用于接收键盘数据Scanner scanner new Scanner(System.in);System.out.println("使用next 方式接收&#xff1a;");// 判断用户有没有输入字符串if (sc…

【ECS最佳实践】基于多块云盘构建LVM逻辑卷

一、LVM简介 LVM是逻辑盘卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制&#xff0c;LVM是建立在硬盘和分区之上的一个逻辑层&#xff0c;来提高磁盘分区管理的灵活性。 LVM最大的特点就是可以对磁盘进行…

剧情反转:今年AI要凉!薪资碾压全行,但人才缺500万!

最近关于AI有两个消息&#xff0c;一个好的&#xff0c;一个坏的。先说好消息。德勤发布《全球人工智能发展白皮书》&#xff0c;预计到2025年&#xff0c;世界人工智能市场规模将超过6万亿美元&#xff01;2017年至2025年复合增长率达30%。毫无疑问&#xff0c;目前AI还是一个…

maven 报错一站式解决方案

文章目录一、本地maven玩耍三部曲1. 先确认项目引用默认的maven配置是否正确2. 查看IntelliJ IDEA查看maven配置是否正确3. 重新导入maven依赖二、本地maven报错5步走2.1. 配置maven阿里云仓库2.2. 删除本地仓库中不完整的jar2.3. 连接外网2.4. 在线下载依赖2.5. 重新导入maven…

如果测试没有梦想,那跟咸鱼有什么区别?

软件质量不是测出来的&#xff0c;但为什么又有这么多测试工程师为了质量而工作&#xff1f;测试是一个成本部门&#xff0c;测试创造的价值是什么&#xff1f;研发的模式在不断地变化&#xff0c;测试的定位如何不断去定义&#xff0c;未来的测试又会是什么形态&#xff1f;今…

使用阿里云极速型NAS构建高可用的GitLab

使用阿里云文件存储NAS构建GitLab高可用环境 GitLab简介 GitLab是一个利用 Ruby on Rails 开发的开源应用程序&#xff0c;实现一个自托管的Git项目仓库&#xff0c;可通过Web界面进行访问公开的或者私人项目。Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得…

The following SDK components were not installed: extra-google-m2repository and platform-tools

安装android studio到最后一步的时候遇见了这个问题 。 android studio安装详见Android Studio 安装 经过查阅多篇博客 把他们的解决方案放在一起一顿操作猛如虎&#xff0c;然后就成了。。。 2篇原文链接我放在这里&#xff1a; Android Studio新建工程时SDK缺少extra-an…

数据库中间件漫谈——看看云时代,它会走向何方

来源 | 阿丸笔记封图| CSDN 下载于视觉中国前言随着业务的发展&#xff0c;MySQL数据库中的表会越来越多&#xff0c;表中的数据量也会越来越大&#xff0c;相应地&#xff0c;数据操作的开销也会越来越大&#xff1b;另外&#xff0c;无论怎样升级硬件资源&#xff0c;单台服务…

即插即用,基于阿里云Ganos快速构建云上开源GIS方案

对于轻量级GIS应用&#xff0c;选择具备时空能力的云上数据库再搭配开源GIS软件&#xff0c;能够快速构建稳定、廉价、实用的GIS解决方案。Ganos是阿里云自研时空基础设施&#xff08;PaaS层&#xff09;的核心引擎&#xff0c;该引擎整合了云上异构计算并行加速、OSS大规模存储…

Knative 初体验:Serving Hello World

通过前面两章的学习你已经掌握了很多 Knative 的理论知识&#xff0c;基于这些知识你应该对 Knative 是谁、它来自哪里以及它要做什么有了一定的认识。可是即便如此你可能还是会有一种犹抱琵琶半遮面&#xff0c;看不清真容的感觉&#xff0c;这就好比红娘拿姑娘的 100 张生活照…

Java-if选择结构

if单选择结构 if双选择结构 if多选择结构 嵌套if结构 https://www.bilibili.com/video/BV12J41137hu?p36&spm_id_frompageDriver

数据仓库介绍与实时数仓案例

1.数据仓库简介 数据仓库是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integrate&#xff09;、相对稳定的&#xff08;Non-Volatile&#xff09;、反映历史变化&#xff08;Time Variant&#xff09;的数据集合&#xff0c;用于支持管理决策…

优酷背后的大数据秘密

在本文中优酷数据中台的数据技术专家门德亮分享了优酷从Hadoop迁移到阿里云MaxCompute后对业务及平台的价值。 本文内容根据演讲视频以及PPT整理而成。 大家好&#xff0c;我是门德亮&#xff0c;现在在优酷数据中台做数据相关的事情。很荣幸&#xff0c;我正好见证了优酷从没…

从提取层、处理层、基础结构入手,带你了解Spark和Kafka!

作者 | Jaskaran S. Puri译者 | 火火酱 责编 | 徐威龙封图| CSDN 下载于视觉中国电子商务市场中典型的一天是这样的&#xff1a;每分钟发生1万个事件流&#xff0c;并且要选择合适的工具对其进行处理。本文将帮助你重新创建一个场景&#xff0c;其中有大量的数据流入&#xff0…

Java-switch选择结构

基本类型 public class SwitchDemo01 {public static void main(String[] args) {// case 穿透char grade B;switch (grade) {case A:System.out.println("优秀");break;case B:System.out.println("良好");break;case C:System.out.println("及格&…

高性能服务器架构思路【不仅是思路】

在服务器端程序开发领域&#xff0c;性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而&#xff0c;服务器端程序在性能问题上应该有何种基本思路&#xff0c;这个却很少被这些项目的文档提及。本文正式希望介绍服务器端解决性能问…

v-if v-show区别(面试题)

v-if、v-show顾名思义就是用来判断视图层展示效果的&#xff0c;在Vue中文社区说明文档的介绍有&#xff1a; 相同点&#xff1a; v-if与v-show都可以动态控制dom元素显示隐藏 不同点&#xff1a; 1.v-if &#xff1a;可以根据表达式的值在DOM中生成或移除一个元素。 v-show:可…

专访世界顶级游戏背后的男人

‍作者 | 华为云和TA的朋友们封图| CSDN 下载于视觉中国如今&#xff0c;对于网易不鸣工作室CEO王希来说&#xff0c;团队的代表作《战意》已经获得阶段性成功。但不为人知的是&#xff0c;从下定决心要做世界顶级游戏&#xff0c;到这款作品萌生想法&#xff0c;再到正式公测&…