diff --git a/install/install-k8s.md b/install/install-k8s.md
index 0489d8e..b3e3229 100644
--- a/install/install-k8s.md
+++ b/install/install-k8s.md
@@ -15,7 +15,7 @@ meta:
## 文档特点
-->
-## 安装 docker / kubelet
+## 安装docker及kubelet
@@ -191,11 +191,6 @@ curl -sSL https://kuboard.cn/install-script/v1.16.2/install_kubelet.sh | sh
## 初始化 master 节点
-::: tip
-* 以 root 身份在 demo-master-a-1 机器上执行
-* 初始化 master 节点时,如果因为中间某些步骤的配置出错,想要重新初始化 master 节点,请先执行 `kubeadm reset` 操作
-:::
-
::: danger 关于初始化时用到的环境变量
* **APISERVER_NAME** 不能是 master 的 hostname
* **APISERVER_NAME** 必须全为小写字母、数字、小数点,不能包含减号
@@ -224,7 +219,7 @@ curl -sSL https://kuboard.cn/install-script/v1.16.2/init_master.sh | sh
``` sh
# 只在 master 节点执行
-# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
+# 替换 x.x.x.x 为 master 节点的内网IP
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
@@ -240,6 +235,26 @@ echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
+
如果出错点这里
+
+
+
+* 请确保您的环境符合 [安装docker及kubelet](#安装docker及kubelet) 中所有勾选框的要求
+* 请确保您使用 root 用户执行初始化命令
+* 执行如下命令
+ ``` sh
+ echo MASTER_IP=${MASTER_IP} && echo APISERVER_NAME=${APISERVER_NAME} && echo POD_SUBNET=${POD_SUBNET}
+ ```
+ 请验证如下几点:
+ * 环境变量 ***MASTER_IP*** 的值应该为 master 节点的 **内网IP**,如果不是,请重新 export
+ * **APISERVER_NAME** 不能是 master 的 hostname
+ * **APISERVER_NAME** 必须全为小写字母、数字、小数点,不能包含减号
+ * **POD_SUBNET** 所使用的网段不能与 ***master节点/worker节点*** 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
+* 重新初始化 master 节点,请先执行 `kubeadm reset -f` 操作
+
+
+
+
**检查 master 初始化结果**
``` sh
@@ -285,7 +300,7 @@ kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery
``` sh
# 只在 worker 节点执行
-# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
+# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
@@ -295,6 +310,97 @@ echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
```
+
如果出错点这里
+
+
+
+### 常见错误原因
+经常在群里提问为什么 join 不成功的情况大致有这几种:
+
+#### worker 节点不能访问 apiserver
+
+ 在worker节点执行以下语句可验证worker节点是否能访问 apiserver
+ ``` sh
+ curl -ik https://apiserver.demo:6443
+ ```
+ 如果不能,请在 master 节点上验证
+ ``` sh
+ curl -ik https://localhost:6443
+ ```
+ 如果 master 节点能够访问 apiserver、而 worker 节点不能,则请检查自己的网络设置
+
+#### worker 节点有多个网卡
+
+ 在worker节点执行
+ ```sh
+ ip address
+ ```
+ 输出结果如下所示:
+ ```
+ 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
+ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+ inet 127.0.0.1/8 scope host lo
+ valid_lft forever preferred_lft forever
+ inet6 ::1/128 scope host
+ valid_lft forever preferred_lft forever
+ 2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000
+ link/ether 52:54:00:9b:eb:48 brd ff:ff:ff:ff:ff:ff
+ inet 172.21.0.12/20 brd 172.21.15.255 scope global eth0
+ valid_lft forever preferred_lft forever
+ inet6 fe80::5054:ff:fe9b:eb48/64 scope link
+ valid_lft forever preferred_lft forever
+ ```
+ 通常只有一个 loopback 地址,和一个 eth0 内网地址,如果您有更多的网卡,kubelet 可能会出现不能使用正确的内网 IP 地址与 apiserver 通信的情况。建议先删除多余网卡,需要的话,在完成 k8s 安装后再重新添加
+
+#### worker 节点与 master 节点不在同一个局域网
+
+ worker 节点必须与 master 节点在同一个局域网内,并且能够互通(安装 kubelet 和 docker 时,已经关闭了防火墙)
+ ``` sh
+ systemctl status firewalld
+ ```
+ 输出结果如下
+ ```
+ ● firewalld.service - firewalld - dynamic firewall daemon
+ Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
+ Active: inactive (dead)
+ Docs: man:firewalld(1)
+ ```
+ 如果您使用云环境,请确保您的安全组配置规则里,master节点和worker节点之间的相互通信是不受阻碍的
+
+### 移除worker节点并重试
+
+::: warning
+正常情况下,您无需移除 worker 节点,如果添加到集群出错,您可以移除 worker 节点,再重新尝试添加
+:::
+
+在准备移除的 worker 节点上执行
+
+``` sh
+# 只在 worker 节点执行
+kubeadm reset -f
+```
+
+在 master 节点 demo-master-a-1 上执行
+
+```sh
+# 只在 master 节点执行
+kubectl get nodes -o wide
+```
+如果列表中没有您要移除的节点,则忽略下一个步骤
+
+``` sh
+# 只在 master 节点执行
+kubectl delete node demo-worker-x-x
+```
+
+::: tip
+* 将 demo-worker-x-x 替换为要移除的 worker 节点的名字
+* worker 节点的名字可以通过在节点 demo-master-a-1 上执行 kubectl get nodes 命令获得
+:::
+
+
+
+
### 检查初始化结果
在 master 节点上执行
@@ -312,38 +418,6 @@ demo-worker-a-1 Ready
2m26s v1.16.2
demo-worker-a-2 Ready 3m56s v1.16.2
```
-## 移除 worker 节点
-
-添加节点出错时,可移除节点重新添加
-
-
-
-::: warning
-正常情况下,您无需移除 worker 节点,如果添加到集群出错,您可以移除 worker 节点,再重新尝试添加
-:::
-
-在准备移除的 worker 节点上执行
-
-``` sh
-# 只在 worker 节点执行
-kubeadm reset
-```
-
-在 master 节点 demo-master-a-1 上执行
-
-``` sh
-# 只在 master 节点执行
-kubectl delete node demo-worker-x-x
-```
-
-::: tip
-* 将 demo-worker-x-x 替换为要移除的 worker 节点的名字
-* worker 节点的名字可以通过在节点 demo-master-a-1 上执行 kubectl get nodes 命令获得
-:::
-
-
-
-