K8s
简单来说,Kubernetes(通常简称为 K8s,因为 K 和 s 之间有 8 个字母)是一个开源的容器编排平台。
如果把 Docker 容器比作一只只“运货的集装箱”,那么 K8s 就是那台巨大的“自动化起重机”和“港口调度系统”。
部署Kubernetes+docker
1. 为什么需要 K8s?
在只有几个容器时,手动管理很简单。但当你有成百上千个容器在几十台服务器上运行,且需要处理升级、扩容、宕机恢复时,靠人工是不可能的。K8s 解决了以下痛点:
- 自动化部署与回滚:你只需要告诉 K8s “我要运行 5 个版本的 A 应用”,它会自动帮你部署。如果更新出错了,它能一键退回。
- 自我修复 (Self-healing):如果某个容器挂了,K8s 会立即发现并重启一个新的;如果某台服务器坏了,它会把上面的容器搬到其他健康的机器上。
- 水平伸缩 (Scaling):根据流量大小,自动增加或减少容器的数量。
- 负载均衡:它会自动给一组容器分配统一的 IP 和域名,并平衡进入的流量。
k8s本质上就是一个管理容器的软件

k8s里有非常经典的3大接口
| 接口 | 负责什么 | 通俗理解 | 典型插件 |
|---|---|---|---|
| CRI (运行时) | 怎么跑容器? | 就像电脑的CPU插槽,不论是 Intel 还是 AMD,只要接口对就能跑。 | containerd, CRI-O |
| CNI (网络) | 怎么通信? | 就像电脑的网卡驱动,决定了你是走拨号、光纤还是 5G。 | Flannel, Calico |
| CSI (存储) | 数据存哪? | 就像电脑的USB接口,你可以插 U 盘、移动硬盘或外接阵列。 | Ceph, NFS, 云硬盘 |
核心组件
kube-apiserver:
etcd:是一个数据库软件的名字 --》key:value --》go语言开发一致且高可用的键值存储,用作Kubernetes所有集群数据后台数据库。
scheduler:调度器 --》安排我们需要启动的pod到那个node上去运行,有哪些调度策略/方法
controller-manager 控制器管理员
一些常用的kubernetes命令
虚拟机配置
为所有虚拟机器配置防火墙
#禁用firewalld和selinux
systemctl stop firewalld
systemctl disable firewalld
关闭selinux和防火墙
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
配置静态ip
ip add #先查看你的网卡信息
ip route #查看你的网关
nmcli con mod "ens160" \ #填你的网卡名
ipv4.method manual \ #修改为手动模式
ipv4.addresses "192.168.1.8/24" \ #修改为你预留的ip地址
ipv4.gateway "192.168.1.1" \ #修改为你之前ip route看到的网关地址
添加ip映射(每个机器都需要脚本没有写)
vi /etc/hosts
末尾添加以下内容
192.168.245.143 master-1
192.168.245.144 node-1
192.168.245.145 node-2
配置 Docker 加速器(每个节点)
1. 修改/创建 Docker 配置文件
Docker 的官方配置文件位于 /etc/docker/daemon.json。如果该文件不存在,直接创建;如果已存在,则修改其内容。
# 1. 创建目录
sudo mkdir -p /etc/docker
# 2. 写入加速器配置
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.land007.top"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
注意:"exec-opts": ["native.cgroupdriver=systemd"] 是 Kubernetes 集群必需的配置,它能确保 Docker 和 Kubelet 使用相同的 Cgroup 驱动,防止集群崩溃。
2. 重启 Docker 服务
配置写入后,必须重新加载配置并重启服务才能生效。
# 1. 重新加载系统配置
sudo systemctl daemon-reload
# 2. 重启 Docker
sudo systemctl restart docker
3. 验证是否配置成功
执行以下命令,查看输出信息中的 Registry Mirrors 部分:
docker info | grep -A 5 "Registry Mirrors"
预期输出:
Registry Mirrors:
https://docker.m.daocloud.io/
https://hub-mirror.c.163.com/
https://mirror.baidubce.com/
https://docker.land007.top/
机器初始化脚本(关闭selinux和防火墙,配置静态ip)
#!/bin/bash
# 1. 修改主机名
read -p "请输入这台机器的主机名 (例如 node-1): " NEW_HOSTNAME
if [ -n "$NEW_HOSTNAME" ]; then
hostnamectl set-hostname "$NEW_HOSTNAME"
echo "主机名已修改为: $NEW_HOSTNAME"
else
echo "未输入主机名,保持原样。"
fi
# 2. 禁用防火墙和 SELinux
echo "--- 正在处理防火墙和 SELinux ---"
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
# 3. 自动检测网络环境
IFACE=$(ip -o link show | awk -F': ' '{print $2}' | grep -vE 'lo|docker|cni|veth|cali' | head -n 1)
GATEWAY=$(ip route | grep default | awk '{print $3}')
# 4. 交互式配置静态 IP
echo "检测到默认网卡: $IFACE"
read -p "请输入静态 IP (当前网关 $GATEWAY): " TARGET_IP
read -p "请输入掩码长度 (默认 24): " NETMASK
NETMASK=${NETMASK:-24}
if [ -n "$TARGET_IP" ]; then
nmcli con mod "$IFACE" \
ipv4.method manual \
ipv4.addresses "$TARGET_IP/$NETMASK" \
ipv4.gateway "$GATEWAY" \
ipv4.dns "114.114.114.114,8.8.8.8"
nmcli con up "$IFACE"
echo "静态 IP $TARGET_IP 配置成功!"
else
echo "跳过 IP 配置。"
fi
# 5. K8s 内核参数优化 (重要)
echo "--- 正在优化 K8s 内核参数 ---"
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
echo "------------------------------------------------"
echo "基础环境配置完成!"
echo "当前主机名: $(hostname)"
echo "当前 IP 地址: $(ip addr show $IFACE | grep 'inet ' | awk '{print $2}')"
echo "------------------------------------------------"
docker安装
镜像下载docker
#先安装一些docker的必要依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加阿里云Docker源(国内下载快)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装最新版Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
设置systemctl管理
#启动并设置开机自启
systemctl start docker&& systemctl enable docker
验证安装
#docker --version

cri-docker源码安装
去官方网站获取压缩包https://github.com/Mirantis/cri-dockerd/releases,
https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.23/cri-dockerd-0.3.23.amd64.tgz
上传文件到虚拟机
1、准备二进制文件
确保你的可执行文件位于正确路径,并拥有运行权限。
# 赋予执行权限
chmod +x /root/cri-dockerd/cri-dockerd
2、创建 Socket 文件
Socket 文件负责定义 Kubernetes 与 Docker 通信的端点。
- 文件路径****:
**/etc/systemd/system/cri-docker.socket** - 配置内容:
[Unit]
Description=Docker Systemd Container Runtime Interface Socket
PartOf=cri-docker.service
[Socket]
# Kubernetes 访问 Docker 的通信路径
ListenStream=/var/run/cri-dockerd.sock
[Install]
WantedBy=sockets.target
3、创建 Service 服务文件
该文件定义了后台进程的启动参数和依赖关系。
- 文件路径****:
**/etc/systemd/system/cri-docker.service** - 配置内容:
[Unit]
Description=Docker Systemd Container Runtime Interface
After=network-online.target docker.service
Requires=cri-docker.socket
[Service]
Type=notify
# 重点:这里使用绝对路径指向你当前的位置
ExecStart=/root/cri-dockerd/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10
# 如果程序需要读取当前目录下的配置文件,建议加上这一行
WorkingDirectory=/root/cri-dockerd/
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[Install]
WantedBy=multi-user.target
4、启动并验证服务
按照以下顺序执行命令以生效配置:
# 1. 重新加载 systemd 守护进程
systemctl daemon-reload
# 2. 启用并立即启动 Socket
systemctl enable --now cri-docker.socket
# 3. 启用并立即启动 Service
systemctl enable --now cri-docker.service
# 4. 检查运行状态
systemctl status cri-docker
cri-docker总结
| 检查点 | 描述 |
|---|---|
| 绝对路径 | ExecStart<br>必须指向 /root/cri-dockerd/cri-dockerd<br>。 |
| 依赖关系 | Service<br>依赖于 Socket<br>,必须确保 Socket 先启动。 |
| 权限 | 二进制文件必须有 +x<br>权限,否则会报 Permission denied<br>。 |
Kubernetes安装
1. 配置 Kubernetes Yum 源
国内环境建议使用阿里云镜像源,速度最快:
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/repodata/repomd.xml.key
EOF
2. 安装 K8s 核心三件套
# 安装最新版
yum install -y kubelet kubeadm kubectl
# 设置 kubelet 开机自启(现在还起不来,因为没初始化,但要设为 enable)
systemctl enable kubelet
3. 初始化集群(最关键的一步)
这一步必须告诉 **kubeadm** 使用你刚才配置好的 **cri-dockerd**。
执行初始化命令:
Bash
kubeadm init \
--apiserver-advertise-address=$(hostname -I | awk '{print $1}') \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.35.0 \
--cri-socket unix:///var/run/cri-dockerd.sock \
--pod-network-cidr=10.244.0.0/16
参数解释:
**--cri-socket**: 必须指向**/var/run/cri-dockerd.sock**,否则它会去找默认的 containerd。**--image-repository**: 使用阿里云镜像源,避免被墙。**--pod-network-cidr**: 这是给 Flannel 等网络插件预留的地址段。
4. 必备的小工具:conntrack
还记得刚才 **cri-dockerd** 日志里的警告吗?在初始化前,最好把这个装上:
yum install -y conntrack-tools
关闭分区
1. 关闭 Swap(内存交换分区)
为什么要关? Kubernetes 的调度器(Scheduler)在分配资源时,是假设你的物理内存是“实打实”的。如果允许使用 Swap,当物理内存不足时,系统会把数据存到磁盘上,这会导致程序运行速度极度变慢,且会让 Kubelet 无法准确判断节点的压力情况。
操作步骤:
# 临时关闭(立即生效,重启后失效)
swapoff -a
# 永久关闭(防止重启后又开了)
# 使用 sed 命令直接注释掉 /etc/fstab 中包含 swap 的那一行
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
2. 开启内核转发(IP Forwarding)
为什么要开? Kubernetes 本质上是一个复杂的虚拟网络。Pod 运行在不同的节点上,它们之间的通信需要通过 Linux 内核进行数据包的转发。如果不开启,你的 Pod 可能连外网都上不了,甚至 Node 之间都无法通信。
操作步骤:
# 1. 创建转发配置文件
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 2. 立即应用配置
sysctl --system
3. 安装 conntrack
为什么要装?conntrack(Connection Tracking)是 Linux 内核用于跟踪网络连接状态的工具。Kubernetes 的 Service(比如负载均衡)重度依赖 iptables 或 IPVS 规则,而这些规则需要 conntrack 来追踪数据包到底属于哪个连接。
如果你不装,你会发现 cri-dockerd 日志里一直在报错,且 K8s 的网络服务会变得极其不稳定。
操作步骤:
# CentOS / RHEL / AlmaLinux
yum install -y conntrack-tools
# Ubuntu / Debian
# apt-get install -y conntrack
总结:如何验证?
配置完这三项后,你的机器就从“普通服务器”变身为“准 K8s 节点”了。
- 验证 Swap:输入
free -h,看到Swap那一行显示为0B即可。 - 验证转发:输入
sysctl net.ipv4.ip_forward,看到= 1即可。 - 验证 conntrack:输入
conntrack --version,有输出版本号即可。
init集群初始化(仅在master节点执行)
初始化
kubeadm init \
--apiserver-advertise-address=<你master节点的ip> \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.35.0 \
--cri-socket unix:///var/run/cri-dockerd.sock \
--pod-network-cidr=192.168.0.0/16
成功执行后会得到

记住你的token和256
kubeadm join 192.168.245.143:6443 --token 2fbmo4.jolz018zlx9rmzd1 \
--discovery-token-ca-cert-hash sha256:b63a2cf1e05115f8260a81afc4198b98653ecf4e5f7dc60a539225afe0e2c3f0
创建配置目录并给用户执行权限(在master节点上执行)
# 创建配置目录
mkdir -p $HOME/.kube
# 拷贝集群管理配置文件到当前用户目录下
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 赋予当前用户对配置文件的读写权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config
将node节点加入集群
# 在 Node 节点上运行(请替换为你自己的 token 和 hash)
kubeadm join 192.168.245.143:6443 --token 1q9lrd.wy04lh4odezywttl \
--discovery-token-ca-cert-hash sha256:b63a2cf1e05115f8260a81afc4198b98653ecf4e5f7dc60a539225afe0e2c3f0 \
--cri-socket unix:///var/run/cri-dockerd.sock
添加成功的标志
kubectl get nodes #查看节点信息
