From fcc5b257a607cbd04f8b2977bbce026edf582563 Mon Sep 17 00:00:00 2001 From: gjmzj Date: Sat, 8 Jun 2019 23:07:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=9B=86=E7=BE=A4=E8=A7=84?= =?UTF-8?q?=E5=88=92/=E7=AE=A1=E7=90=86=E8=8A=82=E7=82=B9=E7=AD=89?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/op/{AddMaster.md => op-master.md} | 31 +++++++++++++++++--- docs/op/{AddNode.md => op-node.md} | 25 ++++++++++++++-- docs/setup/00-planning_and_overall_intro.md | 29 +++++++++--------- pics/ha-2x.gif | Bin 0 -> 18561 bytes 4 files changed, 64 insertions(+), 21 deletions(-) rename docs/op/{AddMaster.md => op-master.md} (64%) rename docs/op/{AddNode.md => op-node.md} (52%) create mode 100644 pics/ha-2x.gif diff --git a/docs/op/AddMaster.md b/docs/op/op-master.md similarity index 64% rename from docs/op/AddMaster.md rename to docs/op/op-master.md index 5905456..f71153d 100644 --- a/docs/op/AddMaster.md +++ b/docs/op/op-master.md @@ -1,8 +1,8 @@ -## 增加 kube-master 节点 +# 管理 kube-master 节点 -注意:目前仅支持按照本项目`多主模式`(hosts.m-masters.example/hosts.cloud.example)部署的`k8s`集群增加`master`节点 +## 1.增加 kube-master 节点 -新增`kube-master`节点大致流程为: +新增`kube-master`节点大致流程为:tools/03.addmaster.yml - [可选]新节点安装 chrony 时间同步 - 新节点预处理 prepare - 新节点安装 docker 服务 @@ -10,7 +10,7 @@ - 新节点安装 kube-node 服务 - 新节点安装网络插件相关 - 禁止业务 pod调度到新master节点 -- 更新配置 haproxy 负载均衡并重启 +- 更新 node 节点 haproxy 负载均衡并重启 ### 操作步骤 @@ -41,3 +41,26 @@ NAME STATUS ROLES AGE VERSION 192.168.1.11 Ready,SchedulingDisabled 2h v1.9.3 # 新增 master节点 ``` +## 2.删除 kube-master 节点 + + +删除`kube-master`节点大致流程为:tools/13.delmaster.yml +- 检测是否可以删除 +- 迁移节点 pod +- 删除 master 相关服务及文件 +- 删除 node 相关服务及文件 +- 从集群删除 node 节点 +- 从 ansible hosts 移除节点 +- 在 ansible 控制端更新 kubeconfig +- 更新 node 节点 haproxy 配置 + +### 操作步骤 + +``` bash +$ easzctl del-master 192.168.1.11 # 假设待删除节点 192.168.1.11 +``` + +### 验证 + +略 + diff --git a/docs/op/AddNode.md b/docs/op/op-node.md similarity index 52% rename from docs/op/AddNode.md rename to docs/op/op-node.md index 4ca27e3..ac07e79 100644 --- a/docs/op/AddNode.md +++ b/docs/op/op-node.md @@ -1,6 +1,8 @@ -## 增加 kube-node 节点 +# 管理 node 节点 -新增`kube-node`节点大致流程为: +## 1.增加 kube-node 节点 + +新增`kube-node`节点大致流程为:tools/02.addnode.yml - [可选]新节点安装 chrony 时间同步 - 新节点预处理 prepare - 新节点安装 docker 服务 @@ -24,6 +26,23 @@ $ kubectl get node # 验证新节点的网络插件calico 或flannel 的Pod 状态 $ kubectl get pod -n kube-system -# 验证新建负载能否调度到新节点,略 +# 验证新建pod能否调度到新节点,略 ``` +## 2.删除 kube-node 节点 + +删除 node 节点流程:tools/12.delnode.yml +- 检测是否可以删除 +- 迁移节点上的 pod +- 删除 node 相关服务及文件 +- 从集群删除 node + +### 操作步骤 + +``` bash +$ easzctl del-node 192.168.1.11 # 假设待删除节点为 192.168.1.11 +``` + +### 验证 + +略 diff --git a/docs/setup/00-planning_and_overall_intro.md b/docs/setup/00-planning_and_overall_intro.md index aa6f308..99f0e88 100644 --- a/docs/setup/00-planning_and_overall_intro.md +++ b/docs/setup/00-planning_and_overall_intro.md @@ -1,31 +1,32 @@ ## 00-集群规划和基础参数设定 -多节点高可用集群部署步骤与[AllinOne部署](quickStart.md)基本一致,增加LB 负载均衡部署步骤。 +多节点高可用集群部署步骤与[AllinOne部署](quickStart.md)基本一致,增加 node 节点安装 haproxy。 + +- HA 架构 + +![ha-2x](../../pics/ha-2x.gif) - 注意1:请确保各节点时区设置一致、时间同步。 如果你的环境没有提供NTP 时间同步,推荐集成安装[chrony](../guide/chrony.md) -- 注意2:如果需要在公有云上创建多主多节点集群,请结合阅读[在公有云上部署 kubeasz](kubeasz_on_public_cloud.md) +- 注意2:如果需要在公有云上创建多主集群,请结合阅读[在公有云上部署 kubeasz](kubeasz_on_public_cloud.md) ## 高可用集群所需节点配置如下 |角色|数量|描述| |:-|:-|:-| -|easzctl节点|1|运行ansible/easzctl脚本,一般复用deploy节点,但如果需要[管理创建多个集群](easzctl_cmd.md#%E5%85%B8%E5%9E%8B-easzctl-%E5%88%9B%E5%BB%BA%E7%AE%A1%E7%90%86%E7%9A%84%E9%9B%86%E7%BE%A4%E6%8B%93%E6%89%91%E5%A6%82%E4%B8%8B),建议使用独立节点(1c1g)| -|deploy节点|1|运行CA创建、集群部署、插件安装等,一般复用第一个master或node节点| +|管理节点|1|运行ansible/easzctl脚本,可以复用master节点,但如果需要[管理创建多个集群](easzctl_cmd.md#%E5%85%B8%E5%9E%8B-easzctl-%E5%88%9B%E5%BB%BA%E7%AE%A1%E7%90%86%E7%9A%84%E9%9B%86%E7%BE%A4%E6%8B%93%E6%89%91%E5%A6%82%E4%B8%8B),建议使用独立节点(1c1g)| |etcd节点|3|注意etcd集群需要1,3,5,7...奇数个节点,一般复用master节点| -|master节点|2|多master节点需要额外规划一个master VIP(虚地址)| -|lb节点|2|负载均衡节点安装 haproxy+keepalived,一般复用master节点| +|master节点|2|高可用集群至少2个master节点)| |node节点|3|运行应用负载的节点,可根据需要提升机器配置/增加节点数| -项目预定义了4个例子,请修改后完成适合你的集群规划。 +项目预定义了2个例子,请修改后完成适合你的集群规划。 -+ [单节点](../../example/hosts.allinone.example) -+ [单主多节点](../../example/hosts.s-master.example) -+ [多主多节点](../../example/hosts.m-masters.example) -+ [在公有云上部署](../../example/hosts.cloud.example) +- [单节点](../../example/hosts.allinone) + - 注意:在 ha-2x 架构下,单节点可以简单地通过`add-master/add-node/add-etcd`扩容成高可用集群 +- [多主多节点](../../example/hosts.multi-node) ## 部署步骤 -按照[多主多节点](../../example/hosts.m-masters.example)示例的节点配置,准备4台虚机,搭建一个多主高可用集群。 +按照`example/hosts.multi-node`示例的节点配置,准备4台虚机,搭建一个多主高可用集群。 ### 1.基础系统配置 @@ -89,7 +90,7 @@ ssh-copy-id $IPs #$IPs为所有节点地址包括自身,按照提示输入yes ``` bash # 方式一:使用git clone -git clone --depth=1 https://github.com/easzlab/kubeasz.git /etc/ansible +git clone --depth=1 https://github.com/easzlab/kubeasz.git -b dev2 /etc/ansible # 方式二:从发布页面 https://github.com/easzlab/kubeasz/releases 下载源码解压到同样目录 ``` @@ -107,7 +108,7 @@ tar -xvf k8s.1-13-5.tar.gz -C /etc/ansible tar xvf basic_images_kubeasz_1.0.tar.gz -C /etc/ansible/down ``` - 4.3 配置集群参数 - - 4.3.1 必要配置:`cd /etc/ansible && cp example/hosts.m-masters.example hosts`, 然后实际情况修改此hosts文件 + - 4.3.1 必要配置:`cd /etc/ansible && cp example/hosts.multi-node hosts`, 然后实际情况修改此hosts文件 - 4.3.2 可选配置,初次使用可以不做修改,详见[配置指南](config_guide.md) - 4.3.3 验证ansible 安装:`ansible all -m ping` 正常能看到节点返回 SUCCESS diff --git a/pics/ha-2x.gif b/pics/ha-2x.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd8af066446324e0a4ca3c96b6c7dc596ac0cf36 GIT binary patch literal 18561 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 YSH13)uYL9FUjZ9f!48(NgbN4&J5hf^&Hw-a literal 0 HcmV?d00001