diff --git a/.vuepress/public/install-script/flannel/flannel-v0.14.0.yaml b/.vuepress/public/install-script/flannel/flannel-v0.14.0.yaml
new file mode 100644
index 0000000..6092a5d
--- /dev/null
+++ b/.vuepress/public/install-script/flannel/flannel-v0.14.0.yaml
@@ -0,0 +1,223 @@
+---
+apiVersion: policy/v1beta1
+kind: PodSecurityPolicy
+metadata:
+ name: psp.flannel.unprivileged
+ annotations:
+ seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
+ seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
+ apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
+ apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
+spec:
+ privileged: false
+ volumes:
+ - configMap
+ - secret
+ - emptyDir
+ - hostPath
+ allowedHostPaths:
+ - pathPrefix: "/etc/cni/net.d"
+ - pathPrefix: "/etc/kube-flannel"
+ - pathPrefix: "/run/flannel"
+ readOnlyRootFilesystem: false
+ # Users and groups
+ runAsUser:
+ rule: RunAsAny
+ supplementalGroups:
+ rule: RunAsAny
+ fsGroup:
+ rule: RunAsAny
+ # Privilege Escalation
+ allowPrivilegeEscalation: false
+ defaultAllowPrivilegeEscalation: false
+ # Capabilities
+ allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
+ defaultAddCapabilities: []
+ requiredDropCapabilities: []
+ # Host namespaces
+ hostPID: false
+ hostIPC: false
+ hostNetwork: true
+ hostPorts:
+ - min: 0
+ max: 65535
+ # SELinux
+ seLinux:
+ # SELinux is unused in CaaSP
+ rule: 'RunAsAny'
+---
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: flannel
+rules:
+- apiGroups: ['extensions']
+ resources: ['podsecuritypolicies']
+ verbs: ['use']
+ resourceNames: ['psp.flannel.unprivileged']
+- apiGroups:
+ - ""
+ resources:
+ - pods
+ verbs:
+ - get
+- apiGroups:
+ - ""
+ resources:
+ - nodes
+ verbs:
+ - list
+ - watch
+- apiGroups:
+ - ""
+ resources:
+ - nodes/status
+ verbs:
+ - patch
+---
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: flannel
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: flannel
+subjects:
+- kind: ServiceAccount
+ name: flannel
+ namespace: kube-system
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: flannel
+ namespace: kube-system
+---
+kind: ConfigMap
+apiVersion: v1
+metadata:
+ name: kube-flannel-cfg
+ namespace: kube-system
+ labels:
+ tier: node
+ app: flannel
+data:
+ cni-conf.json: |
+ {
+ "name": "cbr0",
+ "cniVersion": "0.3.1",
+ "plugins": [
+ {
+ "type": "flannel",
+ "delegate": {
+ "hairpinMode": true,
+ "isDefaultGateway": true
+ }
+ },
+ {
+ "type": "portmap",
+ "capabilities": {
+ "portMappings": true
+ }
+ }
+ ]
+ }
+ net-conf.json: |
+ {
+ "Network": "10.244.0.0/16",
+ "Backend": {
+ "Type": "vxlan"
+ }
+ }
+---
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+ name: kube-flannel-ds
+ namespace: kube-system
+ labels:
+ tier: node
+ app: flannel
+spec:
+ selector:
+ matchLabels:
+ app: flannel
+ template:
+ metadata:
+ labels:
+ tier: node
+ app: flannel
+ spec:
+ affinity:
+ nodeAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ nodeSelectorTerms:
+ - matchExpressions:
+ - key: kubernetes.io/os
+ operator: In
+ values:
+ - linux
+ hostNetwork: true
+ priorityClassName: system-node-critical
+ tolerations:
+ - operator: Exists
+ effect: NoSchedule
+ serviceAccountName: flannel
+ initContainers:
+ - name: install-cni
+ image: quay.io/coreos/flannel:v0.14.0
+ command:
+ - cp
+ args:
+ - -f
+ - /etc/kube-flannel/cni-conf.json
+ - /etc/cni/net.d/10-flannel.conflist
+ volumeMounts:
+ - name: cni
+ mountPath: /etc/cni/net.d
+ - name: flannel-cfg
+ mountPath: /etc/kube-flannel/
+ containers:
+ - name: kube-flannel
+ image: quay.io/coreos/flannel:v0.14.0
+ command:
+ - /opt/bin/flanneld
+ args:
+ - --ip-masq
+ - --kube-subnet-mgr
+ resources:
+ requests:
+ cpu: "100m"
+ memory: "50Mi"
+ limits:
+ cpu: "100m"
+ memory: "50Mi"
+ securityContext:
+ privileged: true
+ capabilities:
+ add: ["NET_ADMIN", "NET_RAW"]
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ volumeMounts:
+ - name: run
+ mountPath: /run/flannel
+ - name: flannel-cfg
+ mountPath: /etc/kube-flannel/
+ volumes:
+ - name: run
+ hostPath:
+ path: /run/flannel
+ - name: cni
+ hostPath:
+ path: /etc/cni/net.d
+ - name: flannel-cfg
+ configMap:
+ name: kube-flannel-cfg
diff --git a/.vuepress/public/install-script/v1.21.x/init_master.sh b/.vuepress/public/install-script/v1.21.x/init_master.sh
index 53f7cbf..959f40a 100644
--- a/.vuepress/public/install-script/v1.21.x/init_master.sh
+++ b/.vuepress/public/install-script/v1.21.x/init_master.sh
@@ -50,13 +50,3 @@ kubeadm init --config=kubeadm-config.yaml --upload-certs
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
-
-# 安装 calico 网络插件
-# 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
-echo ""
-echo "安装calico-3.17.1"
-rm -f calico-3.17.1.yaml
-kubectl create -f https://kuboard.cn/install-script/v1.21.x/calico-operator.yaml
-wget https://kuboard.cn/install-script/v1.21.x/calico-custom-resources.yaml
-sed -i "s#192.168.0.0/16#${POD_SUBNET}#" calico-custom-resources.yaml
-kubectl create -f calico-custom-resources.yaml
diff --git a/install/install-k8s.md b/install/install-k8s.md
index 1bd836b..bc1953c 100644
--- a/install/install-k8s.md
+++ b/install/install-k8s.md
@@ -15,7 +15,7 @@ meta:
## 文档特点
-
+
参考此免费文档,98%以上的概率,您能够顺利完成 K8S 安装,极个别的问题可以到QQ群里免费答疑。
@@ -185,7 +185,7 @@ default via 172.21.0.1 dev eth0
-**请将脚本最后的 1.21.0 替换成您需要的版本号(必须是 1.21 的小版本,不能是 1.19.1 等),**
+**请将脚本最后的 1.21.2 替换成您需要的版本号(必须是 1.21 的小版本,不能是 1.19.1 等),**
脚本中间的 v1.21.x 不要替换
> docker hub 镜像请根据自己网络的情况任选一个
@@ -195,7 +195,7 @@ default via 172.21.0.1 dev eth0
> * 第十行为阿里云 docker hub 镜像
``` sh
# 在 master 节点和 worker 节点都要执行
-# 最后一个参数 1.21.0 用于指定 kubenetes 版本,支持所有 1.21.x 版本的安装
+# 最后一个参数 1.21.2 用于指定 kubenetes 版本,支持所有 1.21.x 版本的安装
# 腾讯云 docker hub 镜像
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloud 镜像
@@ -204,13 +204,13 @@ default via 172.21.0.1 dev eth0
# export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
# 阿里云 docker hub 镜像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
-curl -sSL https://kuboard.cn/install-script/v1.21.x/install_kubelet.sh | sh -s 1.21.0
+curl -sSL https://kuboard.cn/install-script/v1.21.x/install_kubelet.sh | sh -s 1.21.2
```
-手动执行以下代码,结果与快速安装相同。***请将脚本第79行(已高亮)的 ${1} 替换成您需要的版本号,例如 1.21.0***
+手动执行以下代码,结果与快速安装相同。***请将脚本第79行(已高亮)的 ${1} 替换成您需要的版本号,例如 1.21.2***
> docker hub 镜像请根据自己网络的情况任选一个
> * 第四行为腾讯云 docker hub 镜像
@@ -218,7 +218,7 @@ curl -sSL https://kuboard.cn/install-script/v1.21.x/install_kubelet.sh | sh -s 1
> * 第八行为阿里云 docker hub 镜像
``` sh
# 在 master 节点和 worker 节点都要执行
-# 最后一个参数 1.21.0 用于指定 kubenetes 版本,支持所有 1.21.x 版本的安装
+# 最后一个参数 1.21.2 用于指定 kubenetes 版本,支持所有 1.21.x 版本的安装
# 腾讯云 docker hub 镜像
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloud 镜像
@@ -250,7 +250,7 @@ export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
::: danger 关于初始化时用到的环境变量
* **APISERVER_NAME** 不能是 master 的 hostname
* **APISERVER_NAME** 必须全为小写字母、数字、小数点,不能包含减号
-* **POD_SUBNET** 所使用的网段不能与 ***master节点/worker节点*** 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
+* **POD_SUBNET** 所使用的网段不能与 ***master节点/worker节点*** 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.0/16 命令,不做修改
:::
@@ -258,7 +258,7 @@ export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
-**请将脚本最后的 1.21.0 替换成您需要的版本号(必须是 1.21 的小版本,不能是 1.19.1 等),**
+**请将脚本最后的 1.21.2 替换成您需要的版本号(必须是 1.21 的小版本,不能是 1.19.1 等),**
脚本中间的 v1.21.x 不要替换
``` sh {10}
@@ -269,15 +269,15 @@ export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
-export POD_SUBNET=10.100.0.1/16
+export POD_SUBNET=10.100.0.0/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
-curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.0
+curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.2
```
-手动执行以下代码,结果与快速初始化相同。***请将脚本第21行(已高亮)的 ${1} 替换成您需要的版本号,例如 1.21.0***
+手动执行以下代码,结果与快速初始化相同。***请将脚本第21行(已高亮)的 ${1} 替换成您需要的版本号,例如 1.21.2***
``` sh
# 只在 master 节点执行
@@ -287,7 +287,7 @@ export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
-export POD_SUBNET=10.100.0.1/16
+export POD_SUBNET=10.100.0.0/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
```
@@ -311,7 +311,7 @@ To see the stack trace of this error execute with --v=5 or higher
请执行如下命令:
> 在原命令的最后增加参数 `/coredns`
``` sh
-curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.0 /coredns
+curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.2 /coredns
```
@@ -330,7 +330,7 @@ curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.
* 环境变量 ***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 命令,不做修改
+ * **POD_SUBNET** 所使用的网段不能与 ***master节点/worker节点*** 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.0/16 命令,不做修改
* 重新初始化 master 节点前,请先执行 `kubeadm reset -f` 操作
@@ -375,8 +375,45 @@ kubectl get nodes -o wide
+## 安装网络插件
+
+网络插件可以选择 calico 或者 flannel(任意选择其一即可)。
+
+
+
+
+
+::: danger 阿里云
+如果您在阿里云上安装 K8S,建议使用 flannel,有多个案例表明 calico 与阿里云存在兼容性问题。
+:::
+
+``` sh
+export POD_SUBNET=10.100.0.0/16
+kubectl apply -f https://kuboard.cn/install-script/v1.21.x/calico-operator.yaml
+wget https://kuboard.cn/install-script/v1.21.x/calico-custom-resources.yaml
+sed -i "s#192.168.0.0/16#${POD_SUBNET}#" calico-custom-resources.yaml
+kubectl apply -f calico-custom-resources.yaml
+```
+
+
+
+
+``` sh
+export POD_SUBNET=10.100.0.0/16
+kubectl apply -f https://kuboard.cn/install-script/v1.21.x/calico-operator.yaml
+wget https://kuboard.cn/install-script/flannel/flannel-v0.14.0.yaml
+sed -i "s#10.244.0.0/16#${POD_SUBNET}#" flannel-v0.14.0.yaml
+kubectl apply -f https://kuboard.cn/install-script/flannel/flannel-v0.14.0.yaml
+```
+
+
+
+
+
+
## 初始化 worker节点
### 获得 join命令参数
@@ -512,69 +549,6 @@ demo-worker-a-2 Ready 3m56s v1.21.x
```
-
-
-## 安装 Ingress Controller
-
-
-
-
-
-**在 master 节点上执行**
-
-部分情况下,下面的这条指令,您需要执行两次才能成功。
-
-``` sh
-# 只在 master 节点执行
-kubectl apply -f https://kuboard.cn/install-script/v1.21.x/nginx-ingress.yaml
-```
-
-
-
-
-
-**在 master 节点上执行**
-
-只在您想选择其他 Ingress Controller 的情况下卸载
-
-``` sh
-# 只在 master 节点执行
-kubectl delete -f https://kuboard.cn/install-script/v1.21.x/nginx-ingress.yaml
-```
-
-
-
-
-<<< @/.vuepress/public/install-script/v1.21.x/nginx-ingress.yaml
-
-
-
-
-
-
-**配置域名解析**
-
-将域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)
-
-**验证配置**
-
-在浏览器访问 a.demo.yourdomain.com,将得到 404 NotFound 错误页面
-
-::: tip 提示
-
-许多初学者在安装 Ingress Controller 时会碰到问题,请不要灰心,可暂时跳过 ***安装 Ingress Controller*** 这个部分,等您学完 www.kuboard.cn 上 [Kubernetes 入门](/learning/k8s-basics/kubernetes-basics.html) 以及 [通过互联网访问您的应用程序](/learning/k8s-intermediate/service/ingress.html) 这两部分内容后,再来回顾 Ingress Controller 的安装。
-
-也可以参考 [Install Nginx Ingress](https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/)
-
-:::
-
-::: warning
-如果您打算将 Kubernetes 用于生产环境,请参考此文档 [Installing Ingress Controller](https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/),完善 Ingress 的配置
-:::
-
-