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 的配置 -::: - -