文章目录
- [Kubernetes 1.20 集群部署完整教程](#Kubernetes 1.20 集群部署完整教程)
-
- 前言
- 一、环境说明
-
- [1.1 节点配置清单](#1.1 节点配置清单)
- [1.2 前置要求](#1.2 前置要求)
- 二、所有节点环境初始化(必做)
-
- [2.1 关闭防火墙(避免端口拦截)](#2.1 关闭防火墙(避免端口拦截))
- [2.2 关闭 SELinux(避免权限限制)](#2.2 关闭 SELinux(避免权限限制))
- [2.3 清空 iptables 规则(避免规则冲突)](#2.3 清空 iptables 规则(避免规则冲突))
- [2.4 禁用 Swap 分区(K8s 核心要求)](#2.4 禁用 Swap 分区(K8s 核心要求))
- [2.5 加载 ip_vs 模块(优化 K8s 服务调度)](#2.5 加载 ip_vs 模块(优化 K8s 服务调度))
- [2.6 修改主机名(按节点角色执行)](#2.6 修改主机名(按节点角色执行))
-
- [Master 节点(192.168.10.19)](#Master 节点(192.168.10.19))
- [Node01 节点(192.168.10.20)](#Node01 节点(192.168.10.20))
- [Node02 节点(192.168.10.21)](#Node02 节点(192.168.10.21))
- [2.7 配置 hosts 文件(节点间域名解析)](#2.7 配置 hosts 文件(节点间域名解析))
- [2.8 调整内核参数(适配 K8s 网络要求)](#2.8 调整内核参数(适配 K8s 网络要求))
- [三、所有节点安装 Docker](#三、所有节点安装 Docker)
-
- [3.1 安装 Docker 依赖包](#3.1 安装 Docker 依赖包)
- [3.2 配置 Docker 阿里云 YUM 源(加速安装)](#3.2 配置 Docker 阿里云 YUM 源(加速安装))
- [3.3 安装 Docker CE 版本](#3.3 安装 Docker CE 版本)
- [3.4 配置 Docker 优化参数](#3.4 配置 Docker 优化参数)
- [3.5 启动 Docker 并设置开机自启](#3.5 启动 Docker 并设置开机自启)
- [四、所有节点安装 kubeadm、kubelet、kubectl](#四、所有节点安装 kubeadm、kubelet、kubectl)
-
- [4.1 配置 K8s 阿里云 YUM 源](#4.1 配置 K8s 阿里云 YUM 源)
- [4.2 安装指定版本(1.20.11)](#4.2 安装指定版本(1.20.11))
- [4.3 设置 kubelet 开机自启](#4.3 设置 kubelet 开机自启)
- [五、部署 K8s Master 节点(仅在 master01 执行)](#五、部署 K8s Master 节点(仅在 master01 执行))
-
- [5.1 准备 K8s 镜像(本地加载,避免网络拉取失败)](#5.1 准备 K8s 镜像(本地加载,避免网络拉取失败))
- [5.2 复制镜像到 Node 节点(避免重复上传)](#5.2 复制镜像到 Node 节点(避免重复上传))
- [5.3 初始化 kubeadm(基于配置文件,方法一)](#5.3 初始化 kubeadm(基于配置文件,方法一))
-
- [5.3.1 生成默认配置文件](#5.3.1 生成默认配置文件)
- [5.3.2 修改配置文件(关键参数调整)](#5.3.2 修改配置文件(关键参数调整))
- [5.3.3 执行初始化](#5.3.3 执行初始化)
- [5.4 配置 kubectl 命令行工具](#5.4 配置 kubectl 命令行工具)
- [5.5 修复集群不健康问题(可选)](#5.5 修复集群不健康问题(可选))
- [六、部署 Flannel 网络插件(所有节点执行)](#六、部署 Flannel 网络插件(所有节点执行))
-
- [6.1 加载 Flannel 本地镜像(所有节点)](#6.1 加载 Flannel 本地镜像(所有节点))
- [6.2 在 Master 节点创建 Flannel 资源](#6.2 在 Master 节点创建 Flannel 资源)
- [七、Node 节点加入集群(仅在 node01、node02 执行)](#七、Node 节点加入集群(仅在 node01、node02 执行))
-
- [7.1 执行 join 命令(从 Master 日志获取)](#7.1 执行 join 命令(从 Master 日志获取))
- [7.2 验证节点状态(Master 节点执行)](#7.2 验证节点状态(Master 节点执行))
- [八、集群功能测试(Master 节点执行)](#八、集群功能测试(Master 节点执行))
-
- [8.1 创建 Nginx 部署](#8.1 创建 Nginx 部署)
- [8.2 暴露 NodePort 服务(外部访问)](#8.2 暴露 NodePort 服务(外部访问))
- [8.3 扩展副本数(测试调度功能)](#8.3 扩展副本数(测试调度功能))
- [8.4 测试访问](#8.4 测试访问)
- [九、部署 Kubernetes Dashboard(Master 节点执行)](#九、部署 Kubernetes Dashboard(Master 节点执行))
-
- [9.1 准备配置文件并修改](#9.1 准备配置文件并修改)
- [9.2 部署 Dashboard](#9.2 部署 Dashboard)
- [9.3 创建管理员账号并绑定权限](#9.3 创建管理员账号并绑定权限)
- [9.4 访问 Dashboard](#9.4 访问 Dashboard)
- 十、内核参数优化(可选,所有节点执行)
- 十一、总结
Kubernetes 1.20 集群部署完整教程
前言
本文专注于通过 kubeadm 工具快速部署 Kubernetes 1.20 版本集群,全程采用「方法一」(本地镜像+配置文件部署),规避网络依赖问题。集群包含 1 个 Master 控制节点、2 个 Worker 工作节点,搭配 Flannel 网络插件实现 Pod 通信,以及 Dashboard 可视化管理界面,适用于测试环境或企业内网搭建。所有命令均附带详细注释,步骤清晰易懂,新手也能顺利完成部署~
一、环境说明
1.1 节点配置清单
| 节点角色 | 主机名 | IP地址 | 硬件配置 | 所需组件 |
|---|---|---|---|---|
| Master 控制节点 | master01 | 192.168.10.19 | 2C/4G(CPU核心数≥2) | docker、kubeadm、kubelet、kubectl、flannel |
| Worker 工作节点 | node01 | 192.168.10.20 | 2C/2G | docker、kubeadm、kubelet、kubectl、flannel |
| Worker 工作节点 | node02 | 192.168.10.21 | 2C/2G | docker、kubeadm、kubelet、kubectl、flannel |
1.2 前置要求
- 操作系统:所有节点均为 CentOS 7.x(内核版本 ≥ 3.10)
- 网络要求:节点之间网络互通,无防火墙拦截关键端口
- 环境限制:禁用 Swap 分区(K8s 强制要求)
- 提前准备安装包:
- K8s 1.20.11 镜像压缩包:
v1.20.11.zip - Flannel 镜像包:
flannel.tar - Flannel 配置文件:
kube-flannel.yml - Dashboard 配置文件:
recommended.yaml
- K8s 1.20.11 镜像压缩包:
二、所有节点环境初始化(必做)
以下操作需在 master01、node01、node02 所有节点执行,确保集群环境一致性。
2.1 关闭防火墙(避免端口拦截)
bash
# 停止防火墙服务(临时关闭)
systemctl stop firewalld
# 禁止防火墙开机自启(永久关闭)
systemctl disable firewalld
2.2 关闭 SELinux(避免权限限制)
bash
# 临时关闭 SELinux(当前会话生效,无需重启)
setenforce 0
# 永久关闭 SELinux(修改配置文件,重启后生效)
sed -i 's/enforcing/disabled/' /etc/selinux/config
2.3 清空 iptables 规则(避免规则冲突)
bash
# 清空filter表规则、nat表规则、mangle表规则,删除自定义链
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
2.4 禁用 Swap 分区(K8s 核心要求)
bash
# 临时关闭 Swap 分区(当前会话生效)
swapoff -a
# 永久关闭 Swap 分区(注释 /etc/fstab 中 Swap 相关配置)
# & 符号代表上一次匹配的 Swap 配置行,用 # 注释
sed -ri 's/.*swap.*/#&/' /etc/fstab
2.5 加载 ip_vs 模块(优化 K8s 服务调度)
K8s 的 kube-proxy 支持 ipvs 模式,性能优于默认的 iptables 模式,提前加载相关模块:
bash
# 遍历 ip_vs 相关模块文件,逐一加载
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do
echo $i # 输出当前加载的模块名称,方便排查
# 检查模块是否存在,存在则加载(忽略错误输出)
/sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i
done
2.6 修改主机名(按节点角色执行)
Master 节点(192.168.10.19)
bash
hostnamectl set-hostname master01 # 设置主机名为 master01
Node01 节点(192.168.10.20)
bash
hostnamectl set-hostname node01 # 设置主机名为 node01
Node02 节点(192.168.10.21)
bash
hostnamectl set-hostname node02 # 设置主机名为 node02
2.7 配置 hosts 文件(节点间域名解析)
bash
# 编辑 /etc/hosts 文件,添加节点 IP 与主机名映射(无需 DNS 服务器)
vim /etc/hosts
添加以下内容并保存:
192.168.10.19 master01
192.168.10.20 node01
192.168.10.21 node02
2.8 调整内核参数(适配 K8s 网络要求)
bash
# 创建 K8s 专用内核参数配置文件
cat > /etc/sysctl.d/kubernetes.conf << EOF
# 开启网桥模式,允许网桥流量传递到 iptables 链(Pod 网络通信必需)
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
# 关闭 IPv6 协议(避免与 IPv4 冲突,简化网络配置)
net.ipv6.conf.all.disable_ipv6=1
# 开启 IPv4 转发(容器跨节点通信必需)
net.ipv4.ip_forward=1
EOF
# 立即生效内核参数(无需重启系统)
sysctl --system
三、所有节点安装 Docker
K8s 依赖 Docker 作为容器运行时,所有节点统一安装 Docker CE 版本。
3.1 安装 Docker 依赖包
bash
# 安装 yum 工具、设备映射器、LVM2 等基础依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
3.2 配置 Docker 阿里云 YUM 源(加速安装)
bash
# 添加阿里云 Docker 镜像源,替代官方源(国内访问更快)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.3 安装 Docker CE 版本
bash
# 安装 Docker 核心组件(docker-ce 为 Docker 引擎,docker-ce-cli 为命令行工具)
yum install -y docker-ce docker-ce-cli containerd.io
3.4 配置 Docker 优化参数
bash
# 创建 Docker 配置目录(默认可能不存在)
mkdir /etc/docker
# 编写 Docker 配置文件 daemon.json
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"], # 阿里云镜像加速器(加速镜像拉取)
"exec-opts": ["native.cgroupdriver=systemd"], # 与 K8s 统一 Cgroup 驱动(提升稳定性)
"log-driver": "json-file", # 日志存储格式(支持按大小轮转,方便管理)
"log-opts": {
"max-size": "100m" # 单个日志文件最大 100M(避免磁盘被日志占满)
}
}
EOF
# 若阿里云加速器不可用,替换为华为云加速器(取消以下注释并执行)
# cat > /etc/docker/daemon.json <<EOF
# {
# "registry-mirrors": ["https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com"],
# "exec-opts": ["native.cgroupdriver=systemd"],
# "log-driver": "json-file",
# "log-opts": {
# "max-size": "100m"
# }
# }
# EOF
3.5 启动 Docker 并设置开机自启
bash
# 重新加载系统服务配置(使 Docker 配置生效)
systemctl daemon-reload
# 启动 Docker 服务
systemctl restart docker.service
# 设置 Docker 开机自启(确保服务器重启后自动运行)
systemctl enable docker.service
# 验证 Cgroup 驱动配置(输出 "Cgroup Driver: systemd" 则配置正确)
docker info | grep "Cgroup Driver"
四、所有节点安装 kubeadm、kubelet、kubectl
这三个是 K8s 核心组件:kubeadm 用于集群初始化,kubelet 是节点代理(管理 Pod 生命周期),kubectl 是集群命令行管理工具。
4.1 配置 K8s 阿里云 YUM 源
bash
# 创建 K8s YUM 源配置文件
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes # 仓库名称(自定义)
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 # 阿里云镜像源(国内快速访问)
enabled=1 # 启用该仓库
gpgcheck=0 # 禁用 GPG 校验(加速安装,避免校验失败)
repo_gpgcheck=0 # 禁用仓库 GPG 校验
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg # GPG 密钥地址(备用)
EOF
4.2 安装指定版本(1.20.11)
bash
# 安装 1.20.11 版本(三个组件版本必须一致,避免兼容性问题)
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
4.3 设置 kubelet 开机自启
bash
# K8s 组件(如 apiserver、etcd)均以 Pod 形式运行,kubelet 是节点核心代理,必须开机自启
systemctl enable kubelet.service
五、部署 K8s Master 节点(仅在 master01 执行)
Master 节点是集群控制中心,负责调度、管理整个集群,以下操作仅在 master01 节点执行。
5.1 准备 K8s 镜像(本地加载,避免网络拉取失败)
bash
# 1. 上传提前下载的 v1.20.11.zip 镜像压缩包到 /opt 目录
# 2. 解压压缩包到 /opt/k8s 目录(统一存储 K8s 镜像)
unzip v1.20.11.zip -d /opt/k8s
# 3. 进入镜像目录,批量加载所有 K8s 镜像
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do
docker load -i $i # 加载单个镜像文件(-i 指定输入文件)
done
5.2 复制镜像到 Node 节点(避免重复上传)
bash
# 把 master 节点的 K8s 镜像目录复制到 node01 和 node02 节点(scp 远程复制)
scp -r /opt/k8s root@node01:/opt
scp -r /opt/k8s root@node02:/opt
# ########################## 重要 ##########################
# 需在 node01 和 node02 节点单独执行以下命令加载镜像:
# cd /opt/k8s/v1.20.11
# for i in $(ls *.tar); do docker load -i $i; done
# ##########################################################
5.3 初始化 kubeadm(基于配置文件,方法一)
5.3.1 生成默认配置文件
bash
# 生成 kubeadm 默认配置文件到 /opt 目录(基于默认配置修改,更高效)
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
5.3.2 修改配置文件(关键参数调整)
bash
# 编辑配置文件,调整 Master IP、版本、网段等关键参数
vim /opt/kubeadm-config.yaml
按以下内容修改(重点关注标注行):
yaml
11 localAPIEndpoint:
12 advertiseAddress: 192.168.10.19 # 改为 Master 节点 IP(192.168.10.19),用于集群内部通信
13 bindPort: 6443 # API Server 监听端口(默认 6443,无需修改)
...
34 kubernetesVersion: v1.20.11 # K8s 版本(必须与安装版本一致)
35 networking:
36 dnsDomain: cluster.local # DNS 域名(默认,无需修改)
37 podSubnet: "10.244.0.0/16" # Pod 网段(必须与 Flannel 默认网段一致,否则网络不通)
38 serviceSubnet: 10.96.0.0/16 # Service 网段(默认,无需修改)
39 scheduler: {}
# 在文件末尾添加以下内容(启用 kube-proxy ipvs 模式,提升服务调度性能)
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs # 调度模式改为 ipvs(替代默认的 iptables,转发效率更高)
5.3.3 执行初始化
bash
# 基于配置文件初始化 Master 节点,同时输出日志到 kubeadm-init.log(方便后续排查问题)
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
# 参数说明:
# --config:指定初始化配置文件(/opt/kubeadm-config.yaml)
# --upload-certs:自动分发证书到 Node 节点(后续 Node 加入时无需手动复制证书)
# tee kubeadm-init.log:将输出日志保存到文件,同时在终端显示
5.4 配置 kubectl 命令行工具
bash
# kubectl 需通过配置文件与 API Server 通信,加载管理员权限配置
# 1. 创建 kubectl 配置目录(普通用户和 root 用户均需该目录)
mkdir -p $HOME/.kube
# 2. 复制 Master 节点的管理员配置文件(/etc/kubernetes/admin.conf)到该目录
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 3. 修改配置文件权限(普通用户执行,root 用户可跳过,避免权限不足)
chown $(id -u):$(id -g) $HOME/.kube/config
5.5 修复集群不健康问题(可选)
若执行 kubectl get cs 发现 kube-scheduler 或 kube-controller-manager 状态为 Unhealthy,需修改以下配置:
bash
# 编辑 kube-scheduler 配置文件
vim /etc/kubernetes/manifests/kube-scheduler.yaml
# 编辑 kube-controller-manager 配置文件
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
两个文件均修改以下内容:
yaml
# 1. 把 --bind-address=127.0.0.1 改为 Master 节点 IP(192.168.10.19)
--bind-address=192.168.10.19
# 2. 把 httpGet 字段下的 host 从 127.0.0.1 改为 Master 节点 IP(共两处,livenessProbe 和 readinessProbe)
livenessProbe:
httpGet:
host: 192.168.10.19
path: /healthz
port: 10259
readinessProbe:
httpGet:
host: 192.168.10.19
path: /healthz
port: 10259
# 3. 搜索 --port=0,注释掉这一行(允许组件对外提供服务)
# - --port=0
修改完成后重启 kubelet 生效:
bash
systemctl restart kubelet
六、部署 Flannel 网络插件(所有节点执行)
Flannel 是容器网络插件,负责为 Pod 分配 IP 地址,实现跨节点 Pod 通信,必须在 Node 节点加入前部署。
6.1 加载 Flannel 本地镜像(所有节点)
bash
# 1. 上传 flannel.tar 镜像包到所有节点的 /opt 目录
# 2. 加载 Flannel 镜像(所有节点均需加载,否则 Pod 启动失败)
cd /opt
docker load < flannel.tar
6.2 在 Master 节点创建 Flannel 资源
bash
# 1. 上传 kube-flannel.yml 配置文件到 Master 节点的 /opt 目录
# 2. 应用配置文件,创建 Flannel 网络资源
kubectl apply -f kube-flannel.yml
# 验证 Flannel 状态(所有节点的 flannel Pod 均为 Running 则正常)
kubectl get pods -n kube-system | grep flannel
七、Node 节点加入集群(仅在 node01、node02 执行)
Node 节点是工作节点,负责运行实际的应用 Pod,以下操作在 node01 和 node02 节点分别执行。
7.1 执行 join 命令(从 Master 日志获取)
在 Master 节点执行 cat kubeadm-init.log,查找 kubeadm join 开头的命令(集群加入指令),复制到 node01 和 node02 节点执行:
bash
# 示例命令(实际以自己的 kubeadm-init.log 日志为准,请勿直接复制!)
kubeadm join 192.168.10.19:6443 --token wfjo7j.baa0aheyw39w3m7h \
--discovery-token-ca-cert-hash sha256:77100ff66b20100cbd9f1c289788e43aee69c5b4e24cc2c74c2e5d634a074fdc
# 参数说明:
# --token:集群认证令牌(Master 初始化时生成,用于 Node 节点认证)
# --discovery-token-ca-cert-hash:CA 证书哈希值(验证 Master 节点身份,防止伪造)
7.2 验证节点状态(Master 节点执行)
bash
# 查看所有节点状态(STATUS 为 Ready 表示节点加入成功,可正常工作)
kubectl get nodes
# 输出示例(三个节点均为 Ready 则集群基础部署完成):
# NAME STATUS ROLES AGE VERSION
# master01 Ready master 1h v1.20.11
# node01 Ready <none> 30m v1.20.11
# node02 Ready <none> 25m v1.20.11
八、集群功能测试(Master 节点执行)
部署完成后,创建测试应用验证集群是否正常工作。
8.1 创建 Nginx 部署
bash
# 创建名为 nginx 的部署,使用官方 nginx 镜像(测试用)
kubectl create deployment nginx --image=nginx
# 查看 Pod 状态(STATUS 为 Running 表示 Pod 启动成功)
kubectl get pods -o wide
8.2 暴露 NodePort 服务(外部访问)
bash
# 暴露 80 端口(容器内 Nginx 默认端口),服务类型为 NodePort(外部可通过 Node IP+端口访问)
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看服务状态(获取外部访问端口,如 32404,PORT(S) 列显示 80:32404/TCP)
kubectl get svc
8.3 扩展副本数(测试调度功能)
bash
# 扩展 nginx 部署到 3 个副本(K8s 会自动将副本调度到不同 Node 节点)
kubectl scale deployment nginx --replicas=3
# 查看副本状态(3 个 Pod 均为 Running,且分布在 node01、node02 节点)
kubectl get pods -o wide
8.4 测试访问
bash
# 通过任意 Node 节点 IP + 外部端口访问 Nginx(返回 Nginx 欢迎页则正常)
curl http://node01:32404 # 替换为实际的 Node IP 和端口(如 192.168.10.20:32404)
九、部署 Kubernetes Dashboard(Master 节点执行)
Dashboard 是 K8s 可视化管理界面,可通过浏览器查看集群资源、部署应用、监控状态,以下操作在 Master 节点执行。
9.1 准备配置文件并修改
bash
# 1. 上传 recommended.yaml 配置文件到 /opt/k8s 目录
cd /opt/k8s
# 2. 编辑配置文件,将 Service 改为 NodePort 类型(默认仅集群内部可访问,需暴露到外部)
vim recommended.yaml
找到 Service 部分,按以下内容修改:
yaml
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001 # 新增:指定外部访问端口(30000-32767 之间,避免端口冲突)
type: NodePort # 新增:服务类型改为 NodePort(支持外部访问)
selector:
k8s-app: kubernetes-dashboard
9.2 部署 Dashboard
bash
# 应用配置文件,创建 Dashboard 相关资源(Deployment、Service 等)
kubectl apply -f recommended.yaml
9.3 创建管理员账号并绑定权限
默认 Dashboard 无管理员权限,需创建账号并绑定 cluster-admin 角色(超级管理员):
bash
# 1. 创建 serviceaccount(命名空间:kube-system)
kubectl create serviceaccount dashboard-admin -n kube-system
# 2. 绑定 cluster-admin 角色(授予超级管理员权限,方便管理所有资源)
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 3. 获取登录 Token(复制输出结果中的 token 字符串,用于浏览器登录)
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
9.4 访问 Dashboard
- 浏览器访问:
https://MasterIP:30001(如https://192.168.10.19:30001) - 浏览器提示「不安全连接」,选择「添加例外」→「确认安全例外」(自签名证书正常现象)
- 登录方式选择「Token」,粘贴上一步获取的 Token,点击「登录」
- 成功登录后,可查看集群节点、Pod、Service 等资源,支持可视化部署应用
十、内核参数优化(可选,所有节点执行)
为提升集群稳定性和性能,可优化内核参数(适用于生产环境):
bash
# 覆盖之前的内核参数配置文件,添加优化项
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0 # 禁用 TCP 连接快速回收(避免网络异常)
vm.swappiness=0 # 禁止使用 Swap 空间,仅当系统内存不足(OOM)时允许使用
vm.overcommit_memory=1 # 不检查物理内存是否够用(提升 Pod 调度效率)
vm.panic_on_oom=0 # 开启 OOM(内存不足时杀死进程,避免系统挂起)
fs.inotify.max_user_instances=8192 # 提高 inotify 最大实例数(支持更多文件监控)
fs.inotify.max_user_watches=1048576 # 提高 inotify 最大监控文件数
fs.file-max=52706963 # 指定系统最大文件句柄数(支持更多进程)
fs.nr_open=52706963 # 单个进程最大文件句柄数(仅内核 4.4 以上版本支持)
net.ipv6.conf.all.disable_ipv6=1 # 关闭 IPv6
net.netfilter.nf_conntrack_max=2310720 # 提高最大连接跟踪数(支持更多网络连接)
EOF
# 生效优化后的内核参数
sysctl --system
十一、总结
至此,Kubernetes 1.20 集群(1 Master + 2 Worker)已部署完成,包含核心功能:
- 集群基础架构:Master 节点控制 + Worker 节点运行应用
- 网络通信:Flannel 插件实现跨节点 Pod 通信
- 可视化管理:Dashboard 界面便捷操作集群
- 功能验证:Nginx 部署、服务暴露、副本扩展均正常