【Linux】面向小白,全流程无脑,VMware Workstation Pro + Ubuntu20.04虚拟机安装+Docker+MySQL+Redis+PgSQL+K8s+sh自动化脚本配置环境
想要↓选密码来偷懒时,是无法选中的,因为你点击聚焦到当前会话,浮窗就消失了),而且多个会话窗口如果重叠,密码选中会卡住,所以。这里也可以选22、24版本的ubuntu,只是后续apt配置可能不同,默认软件版本不同。可以预装软件,不推荐在这里勾选,版本可能比较旧,后续都可以根据需要单独下。这里要关闭当前终端,重新打开,才会发现主机名发生变化 (⊙o⊙)不用再输密码),输入一次密码,避免等会命令批量执
目录
Ⅰ、最新VMware Workstation Pro安装
安装 VMware Workstation Pro 虚拟机软件:官网安装https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion

1. 注册后点击跳转到下载页
2. 搜索VMware Workstation Pro
3. 选择版本
4. 勾选许可,下载
5. 填写信息
6. 跳转回来,下载
7. 点击安装包,改下安装路径D盘,别的都默认就行
Ⅱ、ubuntu20.04安装
在阿里镜像下载ubuntu20.04镜像文件(.iso):http://mirrors.aliyun.com/ubuntu-releases/
这里也可以选22、24版本的ubuntu,只是后续apt配置可能不同,默认软件版本不同
1. 我们选server版本,而不是desktop,体积小,适合开发

2. 打开之前安装的VMware Workstation Pro新建虚拟机
3. 选择典型就可以配置内存、cpu,硬盘
4. 这里选刚下载的镜像位置
这个镜像文件在虚拟机安装好后可以移动,虚拟机不受影响
推荐找个大的盘分类镜像文件放好,便于之后虚拟机下饺子
5. 配置账号信息
6. 虚拟机主机名配置和安装位置选择
为什么让你把主机名简短?不然你后续开发一行输不完命令
7. 磁盘大小设置
关于虚拟机磁盘扩容,可以看我的这篇:【docker】docker pull拉取中不断重复下载问题,解决方案之一,磁盘空间扩容
8. cpu、内存,网络配置更改


9. 配置完成后勾选打开虚拟机,确定,等待进入下面页面
- 选语言,默认English,直接回车

- 选第二个,跳过更新

- 这是英语键盘布局,直接done

- 分配的ip地址,后续安装好后,可以
ip addr查看
- 这是代理配置,不推荐在这里设置,后续也可以自行设置

- 这是apt包管理器的镜像配置,
apt install要用的,也可以后续设置
- 磁盘配置,不用改,直接↓,Done

- 确认设置,有误可以reset,没问题直接done

- 确认continue

- 填写虚拟机名,用户账号密码

这里填写对后续的影响
- 这里要勾选SSH远程连接,远程连接软件(Xshell,finalshell,MobaXterm_Personal,WindTerm)
- 个人推荐WindTerm:https://github.com/kingToolbox/WindTerm
- 界面炫酷,速度快,批量发送可同时操作多个虚拟机,支持主机文件与虚拟机互传
- 现在先继续操作,可以在等会安装系统,等待的时候下载安装WindTerm
以下所有安装配置全部使用 WindTerm操作

-
可以预装软件,不推荐在这里勾选,版本可能比较旧,后续都可以根据需要单独下

-
等待出现取消更新按钮,可以直接选,也可以不选,等他更新完再点reboot,(不点取消更新会快点)

-
如果选了取消更新,等大概5-6分钟,出现跳转,就可以用WindTerm连接了

-
WindTerm里新建会话

-
填写ip,点击连接

这里为萌新演示下怎么在虚拟机查ip
- 回到WindTerm点击连接,跳转,设置用户名密码

- 这里填写虚拟机的登录用户名密码

- 确定后这里可以勾选



- 连接成功

Ⅲ、最基础的虚拟机环境配置
- 改ubuntu镜像源配置(APT包管理器源)
apt install,需要切换到国内镜像源,提速,这里推荐阿里镜像,点进去:https://developer.aliyun.com/mirror/ubuntu
-
找到对应版本复制

-
这里我用windTerm演示多主机同时更改apt源,


-
第一次执行sudo会要导入密码,可以先
sudo -v更新用户权限(15 分钟不用再输密码),输入一次密码,避免等会命令批量执行被打断输密码
-
四个虚拟机全自己输入密码(这里有个bug,多会话窗口,想要↓选密码来偷懒时,是无法选中的,因为你点击聚焦到当前会话,浮窗就消失了),而且多个会话窗口如果重叠,密码选中会卡住,所以直接输入密码

-
然后开始改apt源,就是前面打开阿里镜像站的ubuntu20.04的apt源覆盖写入命令,直接复制我下面给出的这个命令(使用tee将两个EOF内包裹的内容覆盖写入
/etc/apt/sources.list),解决小白不会用vim自己改的问题
sudo tee /etc/apt/sources.list <<EOF
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
EOF
-
粘贴到传输区,执行

-
sudo apt update
-
四台机更新成功

-
到此,初学者已经可以用apt install安装各种东西,流畅游玩ubuntu
Ⅳ、docker安装
参考官方文档:https://docs.docker.com/engine/install/ubuntu/
Docker镜像源配置参考:【docker】细致且具有时效性的docker在ubuntu的安装,新鲜出炉
apt安装与从Docker官方安装对比
| 特性 | sudo apt install docker.io |
Docker官方源安装 |
|---|---|---|
| 版本 | Ubuntu仓库维护的稳定版(可能较旧、可选版本少) | Docker官方最新版、可选全版本 |
| 安装命令 | sudo apt install docker.io |
通过脚本或添加官方源安装 |
| 更新方式 | apt upgrade |
需手动添加官方源并更新 |
| 兼容性 | 与Ubuntu深度集成,但功能可能受限 | 完整支持最新功能和插件 |
以下给出
3种,2 种安装方式
一、apt快速安装(初学者)
1 apt源更新
建议一条条执行,如果全部复制到会话窗口一同执行,在apt update没做完时,后续命令已经发出,可能被忽略。- 如果不是耗时很长的命令,可以一同执行
以下所有代码,如果处于同一代码区内,则可以统一执行
- 保存并更新系统包索引:
sudo apt-get update - 基于APT安装Docker
sudo apt install docker.io - 验证安装:
docker --version # 示例输出:Docker version 26.1.3, build 26.1.3-0ubuntu1
2 解决常见问题
解决权限问题- 问题``现象一:运行
docker run hello-world时提示权限不足。 必须加sudo - 解决方案:
- 将当前用户添加到Docker组:
sudo usermod -aG docker $USER - 使新组生效(无需重启):
newgrp docker
- 将当前用户添加到Docker组:
配置Docker镜像加速源- 问题现象二:拉取镜像时提示连接超时(无法访问Docker Hub)。
- 操作步骤: (
如果你不会用vim,请直接跳到 4)
- 编辑Docker配置文件:
sudo vim /etc/docker/daemon.json
- 写入镜像加速源(2025年6月5日可用列表):
{
"registry-mirrors": [
"https://hub.xdark.top/",
"https://hub.littlediary.cn/",
"https://dockerpull.org/",
"https://hub.crdz.gq/",
"https://docker.1panel.live/",
"https://docker.unsee.tech/",
"https://docker.udayun.com/",
"https://docker.kejilion.pro/",
"https://registry.dockermirror.com/",
"https://docker.rainbond.cc/",
"https://hub.geekery.cn/",
"https://docker.1panelproxy.com/",
"https://docker.linkedbus.com/",
"https://docker.nastool.de/"
]
}
- 重载配置并重启Docker服务:
sudo systemctl daemon-reload
sudo systemctl restart docker.service
- 一键操作,这里直接全部复制,统一执行
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
"registry-mirrors": [
"https://hub.xdark.top/",
"https://hub.littlediary.cn/",
"https://dockerpull.org/",
"https://hub.crdz.gq/",
"https://docker.1panel.live/",
"https://docker.unsee.tech/",
"https://docker.udayun.com/",
"https://docker.kejilion.pro/",
"https://registry.dockermirror.com/",
"https://docker.rainbond.cc/",
"https://hub.geekery.cn/",
"https://docker.1panelproxy.com/",
"https://docker.linkedbus.com/",
"https://docker.nastool.de/"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker.service
3 验证Docker运行
-
拉取并运行测试镜像:
docker pull hello-worlddocker run hello-world
二、apt指定版本安装
如果你需要安装特定版本的软件包,可以使用 包名=版本号 格式:
这里指定安装,Docker 20.10.25
sudo apt-get update
# 列出可用的Docker版本
apt list -a docker.io
# 安装指定版本(例如20.10.25-0ubuntu1~20.04.1)
sudo apt install docker.io=20.10.25-0ubuntu1~20.04.1

三、通过官方安装方式(安装最新版本)
# 更新系统并安装必要工具
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# 添加Docker官方GPG密钥(仍使用Docker官方密钥保证安全性)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 添加阿里云Docker镜像源(替换官方源)
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
四、完全卸载(闲着没事干可以卸载重新尝试各种方式重装)
# 0. 先停止所有容器(关键步骤!)
sudo docker stop $(sudo docker ps -aq)
# 1. 卸载 Docker 软件包
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io
# 2. 删除残留文件和配置
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm -rf /etc/docker
# 3. 删除 Docker 镜像源
sudo rm -f /etc/apt/sources.list.d/docker.list
# 4. 删除 Docker GPG 密钥
sudo rm -f /etc/apt/keyrings/docker.gpg
# 5. 清理未使用的依赖(可选)
sudo apt-get autoremove -y
Ⅴ、在docker中起mysql、redis、pgsql
参考文章:
docker安装软件_docker_GeekPlusA-云原生
docker常用安装:mysql+redis+nginx - 酒红色 - 博客园
如需安装其他容器,可访问dockerhub官方仓库:https://hub.docker.com/search?q=redis
- 相比手动安装配置数据库,为什么使用 Docker 启动数据库容器更好?
| 优势 | 说明 |
|---|---|
| 1. 快速部署 | 一个命令即可启动数据库,无需手动下载安装、配置文件、初始化脚本。 |
| 2. 环境隔离 | 每个容器是独立运行的,不会与宿主机已有数据库冲突,版本切换方便。 |
| 3. 易于重建 | 删除容器不影响数据(因挂载了数据卷),可随时重启或重新部署。 |
| 4. 统一管理 | 所有数据库以 Docker 容器运行,可统一使用 docker ps/start/stop 管理。 |
| 5. 跨平台一致性 | 同一配置可在任何支持 Docker 的系统上运行,避免“在我电脑能跑”的问题。 |
| 6. 自动重启支持 | 配置 --restart unless-stopped 可保证服务在宕机或重启后自动恢复。 |
| 7. 不污染系统 | 容器中的数据库不会写入宿主系统目录,无需担心卸载残留或依赖冲突。 |
一、容器卷目录新建
- 执行以下命令,确保
/opt/docker/mysql、/opt/docker/redis、/opt/docker/postgres目录存在并正确归属当前用户
sudo mkdir -p /opt/docker/mysql/data /opt/docker/mysql/conf \
/opt/docker/redis/data \
/opt/docker/postgres/data
sudo chown -R $USER:$USER /opt/docker
二、MySQL 安装(推荐版本:5.7 或 8.0)
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /opt/docker/mysql/data:/var/lib/mysql \
-v /opt/docker/mysql/conf:/etc/mysql/conf.d \
--restart unless-stopped \
mysql:8.0
说明:
-v /opt/docker/mysql/data:/var/lib/mysql:持久化数据。-v /opt/docker/mysql/conf:/etc/mysql/conf.d:挂载配置文件目录,可自定义my.cnf。--restart unless-stopped:容器异常退出时自动重启。
三、Redis 安装(推荐版本:6.2 或 7)
docker run -d \
--name redis \
-p 6379:6379 \
-v /opt/docker/redis/data:/data \
--restart unless-stopped \
redis:7 \
redis-server --appendonly yes
说明:
--appendonly yes:启用 AOF 持久化。- 如需设置密码,可添加参数:
redis-server --requirepass 123456。
四、PostgreSQL 安装(推荐版本:13 或 15)
docker run -d \
--name postgres \
-p 5432:5432 \
-e POSTGRES_PASSWORD=123456 \
-v /opt/docker/postgres/data:/var/lib/postgresql/data \
--restart unless-stopped \
postgres:15
说明:
-v /opt/docker/postgres/data:/var/lib/postgresql/data:持久化数据。- 默认用户为
postgres,密码为123456。([cnblogs.com][2])
六、TiDB 安装 [TiDB-v8.5.2(MySQL 8.0.11 协议兼容)]
docker run -d \
--name tidb \
-p 4000:4000 \
-p 10080:10080 \
-v /opt/docker/tidb/data:/var/lib/tidb \
-v /opt/docker/tidb/conf:/etc/tidb \
--restart unless-stopped \
pingcap/tidb:v8.5.2 \
--store unistore \
--path /var/lib/tidb
参数说明
-p 4000:4000:TiDB 的 MySQL 兼容端口(你可以用 Navicat / MySQL client 直接连)。-p 10080:10080:TiDB HTTP API。-v /opt/docker/tidb/data:/var/lib/tidb:挂载数据目录,重启容器或宿主机数据不会丢。-v /opt/docker/tidb/conf:/etc/tidb:挂载配置目录,你可以放置自定义配置文件(可选)。--store unistore:单机模式,存储和计算在同一个容器里,适合测试。
五、启动命令
# MySQL 容器(默认 root / 123456)
docker start mysql
docker exec -it mysql bash
mysql -uroot -p123456
# 登录后 MySQL 常用命令:
# SHOW DATABASES;
# CREATE DATABASE testdb;
# USE testdb;
# Redis 容器(默认无密码)
docker start redis
docker exec -it redis redis-cli
# Redis 常用命令:
# SET key value
# GET key
# KEYS *
# FLUSHALL # 清空所有数据(慎用)
# PostgreSQL 容器(默认 postgres / 123456)
docker start postgres
docker exec -it postgres bash
psql -U postgres
# 登录后 PostgreSQL 常用命令:
# \l -- 列出数据库
# CREATE DATABASE testdb;
# \c testdb -- 切换数据库
# \dt -- 查看表
Ⅵ、k8s安装部署
关于k8s的两种安装方式选择
| 安装方式 | 容器运行时 | 工具/命令 | 特点 | 是否推荐初学者 | 企业常用 |
|---|---|---|---|---|---|
kubeadm + containerd (不需要自己下载cri-dockerd) |
containerd (默认支持CRI) | kubeadm + containerd |
官方推荐方式、轻量、安全稳定,安装速度快 | 最推荐(新) | 是 |
kubeadm + Docker(需自己下载 cri-dockerd) |
Docker(不原生支持CRI) | kubeadm + cri-dockerd |
过渡方案,较繁琐,速度慢 | 不推荐(旧) | 逐渐淘汰 |
-
从kubeadm + Docker到kubeadm + containerd的演进历史:
- Kubernetes1.23 及以前版本:用的 kubeadm + Docker 安装方式,此时Kubernetes 是支持直接用 Docker 来跑容器的,但实际上是通过一个接口(叫 CRI - Container Runtime Interface)去调用容器引擎的。
Docker 本身并不支持 CRI,K8s 是通过一个中间插件(dockershim)来兼容 Docker。
- K8s 1.24 开始,k8s官方移除了对 Docker 的原生支持,Kubernetes 1.24 之后彻底移除了 dockershim,也就是说,尽管你本地还可以装 Docker,但 K8s 不再理你了。所以怎么办?使用 containerd 代替 Docker,因为它原生支持 CRI、被 Kubernetes 官方推荐、并且已经是大多数企业生产环境的选择。
结论:Docker更像“套壳 containerd 的开发者友好工具”,而 containerd 是底层运行时,更适合 Kubernetes。
从 Kubernetes 1.24 开始,不要再用 Docker 做容器运行时了,推荐直接用 containerd,因为它原生支持 Kubernetes 所需的接口(CRI),而 Docker 不是。
- 我已经安装了docker,用它来跑了几个容器,那么会不会与k8s冲突?
| 会不会影响 K8s 安装? | |
|---|---|
| 我现在用 Docker 启动了数据库容器 | 不会影响 |
| 后续我想用 containerd 安装 K8s | 完全兼容,共存无冲突,各自分离,docker管docker的,k8s管k8s的 |
| 后续我想用 Docker+cri 安装 K8s | 兼容,但是k8s运行的和docker自己运行的容器都在一起显示,容易混淆 |
出于学习目的,以下给出新旧两种方式,自行取舍
一、kubeadm + containerd的k8s安装方式(三节点 Kubernetes 1.28)
部分参考Sunzz大佬的文章https://www.cnblogs.com/Sunzz/p/15184167.html
(大佬文中使用的 Kubernetes 版本是 v1.20、v1.21 且是kubeadm + Docker安装)
kubernetes官方文档:https://kubernetes.io/docs/home/
- 安装清单
| 组件名称 | 用途 | 适用节点 | 备注 |
|---|---|---|---|
| kubeadm | 初始化与管理 K8s 集群 | 所有节点 | 官方推荐安装工具 |
| kubelet | 每台主机的 K8s 守护进程 | 所有节点 | 会启动 Pod 并与 master 通信 |
| kubectl | K8s 命令行客户端 | 仅 Master 节点 | 用于管理集群 |
| containerd | 容器运行时,K8s 的底层依赖 | 所有节点 | 替代 Docker,官方推荐 |
| CNI 插件(如 flannel) | 网络通信支持 | 所有节点 | Pod 间网络通信必须组件 |
| 镜像加速器 & 国内源 | 解决国内拉取镜像慢或失败 | 所有节点 | 用于应对 GFW 问题 |
| chrony | 时间同步 | 所有节点 | 避免因时间不同步导致证书失败 |
| swap 禁用、iptables 设置 | 系统初始化配置 | 所有节点 | 保证 kubelet 能正常工作 |
占个坑,有空再说 …
二、kubeadm + Docker的k8s安装方式
- 安装清单
| 组件名称 | 用途 | 适用节点 | 版本 | 备注 |
|---|---|---|---|---|
| kubeadm | 初始化与管理K8s集群 | 所有节点 | v1.24.1 |
官方推荐工具,需与kubelet、kubectl版本匹配 |
| kubelet | 节点守护进程,管理Pod生命周期 | 所有节点 | v1.24.1 |
需通过systemd启动,依赖containerd/cri-dockerd |
| kubectl | K8s命令行客户端 | 仅Master节点 | v1.24.1 |
支持YAML配置文件管理集群资源 |
| cri-dockerd | 容器运行时接口(替代Docker) | 所有节点 | v0.3.1 |
需与K8s版本兼容,例如K8s v1.24支持cri-dockerd v0.3.1 |
| Docker | 容器运行时 | 所有节点 | 20.10.17 |
需配置cgroup driver为systemd,使用阿里云镜像加速器 |
| CNI插件(flannel) | 网络通信与策略控制 | 所有节点 | - | 提供Pod网络,需匹配K8s版本 |
| 阿里云镜像加速器 | 加速镜像拉取 | 所有节点 | - | 配置地址为https://mirrors.aliyun.com |
| ntpdate | 时间同步服务 | 所有节点 | - | 使用ntpdate进行时间同步 |
| 系统配置(firewalld/桥接) | 网络与资源初始化 | 所有节点 | - | 需关闭firewalld,配置iptables规则,禁用swap,设置主机名和hosts文件 |
一、环境安装配置(至少准备三台虚拟机,每台虚拟机都执行以下操作)
1. docker 20.10.17
之前安装了的版本不对的可能会有问题,可以使用上文提到的完全卸载,重新安装
- 由于命令比较多,推荐使用sh脚本安装
使用流程:
vim ubuntu.sh新建一个脚本文件- 把下面的复制进去就行
- 先
sudo -v,更新用户权限 - 然后
chmod 755 ./ubuntu.sh添加执行权限 - 然后直接
./ubuntu.sh
#!/bin/bash
set -euo pipefail
# 更新系统并安装安装必要工具
echo "1. 更新系统并安装基础工具..."
sudo apt-get update || echo "忽略略非致命更新警告,继续执行"
sudo apt-get install -y ca-certificates curl gnupg
# 处理Docker GPG密钥(强制覆盖旧密钥)
echo "2. 配置Docker GPG密钥..."
sudo install -m 0755 -d /etc/apt/keyrings
DOCKER_GPG="/etc/apt/keyrings/docker.gpg"
# 强制删除并重新下载密钥(确保最新)
if [ -f "$DOCKER_GPG" ]; then
echo " - 检测到旧密钥,强制覆盖..."
sudo rm -f "$DOCKER_GPG"
fi
# 带重试机制下载官方密钥(最多5次重试)
echo " - 从官方源下载GPG密钥(最多重试5次)..."
RETRY=5
for ((i=1; i<=RETRY; i++)); do
# 先确保旧文件不存在
if [ -f "$DOCKER_GPG" ]; then
sudo rm -f "$DOCKER_GPG"
fi
if curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o "$DOCKER_GPG"; then
echo " - 官方GPG密钥下载成功"
break
else
echo " - 第$i次下载失败,5秒后重试..."
if [ $i -eq $RETRY ]; then
echo " - 达到最大重试次数,下载失败"
exit 1
fi
sleep 5
fi
done
sudo chmod a+r "$DOCKER_GPG"
# 添加阿里云Docker镜像源
echo "3. 配置阿里云Docker镜像源..."
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=$DOCKER_GPG] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 手动导入缺失的GPG公钥(解决NO_PUBKEY错误)
echo "4. 确保GPG密钥生效..."
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8 || {
echo " - 直接导入密钥到信任库..."
gpg --no-default-keyring --keyring "$DOCKER_GPG" --export 7EA0A9C3F273FCD8 | sudo apt-key add -
}
# 更新包索引并安装指定版本Docker
echo "5. 安装Docker 20.10.17..."
sudo apt-get update || echo " - 忽略非致命更新警告"
VERSION_STRING=5:20.10.17~3-0~ubuntu-$(lsb_release -cs)
sudo apt-get install -y docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io
# 验证安装结果
echo "6. 验证安装..."
if docker --version; then
echo " - Docker安装成功"
else
echo " - Docker安装失败"
exit 1
fi
# 配置Docker用户组(避免每次使用sudo)
echo "7. 配置Docker用户权限..."
if ! getent group docker > /dev/null; then
sudo groupadd docker
echo " - 创建docker用户组"
else
echo " - docker用户组已存在"
fi
sudo usermod -aG docker $USER
echo " - 当前用户已加入docker组"
echo " - 提示:执行 'newgrp docker' 或重新登录使权限生效"
有的时候网络问题会导致,官方密钥拉取失败,请重新
./ubuntu.sh
- 成功安装

2. cri-docker 0.3.1
-
(不懂代理是啥的忽略下面的wget命令)因为是github链接,如果虚拟机没有代理,直接wget可能会连不上(多试几次),可以自己先在windows上下载,然后传到虚拟机https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1.amd64.tgz
-
有代理可直接wget
如果想要快速配置代理,可以参考:【Linux】虚拟机代理,自动化脚本修改~/.bashrc
# 下载
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1.amd64.tgz
- 演示下,在主机下载好cri-docker,之后上传到虚拟机,WindTerm的文件上传功能



- 下载完后
tar -zxvf cri-dockerd-0.3.1.amd64.tgz -C /tmp
sudo cp /tmp/cri-dockerd/cri-dockerd /usr/bin/
- 配置和启动cri-dockerd服务
克隆失败多clone几次,4-5次,就可以成功,实在不行,还是在自己电脑下载,传到虚拟机
# 获取systemd配置文件
git clone https://github.com/Mirantis/cri-dockerd.git
sudo cp cri-dockerd/packaging/systemd/* /etc/systemd/system/
- 修改cri-docker服务配置
- 使用流程:
vim cri-service.sh新建一个脚本文件- 把下面的复制进去就行
- 先
sudo -v,更新用户权限 - 然后
chmod 755 ./cri-service.sh添加执行权限 - 然后直接
sudo ./cri-service.sh
#!/bin/bash
SERVICE_FILE="/etc/systemd/system/cri-docker.service"
NETWORK_PLUGIN="cni"
PAUSE_IMAGE="registry.aliyuncs.com/google_containers/pause:3.7"
RUNTIME_ENDPOINT="fd://" # 明确指定端点值
# 检测 cri-dockerd 实际路径
CRI_DOCKERD_PATH=$(which cri-dockerd)
if [ -z "$CRI_DOCKERD_PATH" ]; then
echo "错误:未找到 cri-dockerd 命令,请先安装 cri-dockerd"
exit 1
fi
# 确保脚本以root权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:此脚本需要root权限执行,请使用sudo或切换到root用户"
exit 1
fi
# 1. 清理目标参数(关键修复:先删除所有相关参数,避免重复)
echo "正在清理旧参数..."
sed -i -e 's/--network-plugin=[^ ]*//g' \
-e 's/--pod-infra-container-image=[^ ]*//g' \
-e 's/--container-runtime-endpoint=[^ ]*//g' "$SERVICE_FILE"
# 2. 移除多余空格(避免参数间空格混乱)
sed -i 's/ */ /g; s/ ^//; s/ $//' "$SERVICE_FILE"
# 3. 构建完整的ExecStart命令(确保参数唯一)
NEW_EXEC_START="ExecStart=${CRI_DOCKERD_PATH} --network-plugin=${NETWORK_PLUGIN} --pod-infra-container-image=${PAUSE_IMAGE} --container-runtime-endpoint=${RUNTIME_ENDPOINT}"
# 4. 应用新配置
sed -i "/^ExecStart=/c${NEW_EXEC_START}" "$SERVICE_FILE"
# 5. 重启服务并验证
echo "正在重启cri-docker服务..."
systemctl daemon-reload && systemctl restart cri-docker || {
echo "服务重启失败,请检查日志"
exit 1
}
# 验证结果
echo "===== 最终配置 ====="
grep "ExecStart=" "$SERVICE_FILE"
3. 其他环境配置
修改 Docker 的 cgroup driver 为 systemd
由于Kubernetes中kubelet组件默认使用的cgroupdriver 为 “systemd”,所以我们将docker的cgroupdriver也修改为 “systemd”
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json << 'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://hub.xdark.top/",
"https://hub.littlediary.cn/",
"https://dockerpull.org/",
"https://hub.crdz.gq/",
"https://docker.1panel.live/",
"https://docker.unsee.tech/",
"https://docker.udayun.com/",
"https://docker.kejilion.pro/",
"https://registry.dockermirror.com/",
"https://docker.rainbond.cc/",
"https://hub.geekery.cn/",
"https://docker.1panelproxy.com/",
"https://docker.linkedbus.com/",
"https://docker.nastool.de/"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
关闭防火墙(ubuntu默认不启用)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
禁用 SELinux
sudo apt update -y && sudo apt install -y selinux-utils
getenforce # 查看状态,输出为 Enforcing 表示启用中
sudo setenforce 0 # 临时关闭
禁用 swap
free # 查看 swap 情况
sudo swapoff -a # 临时关闭 swap
sudo sed -i.bak '/\sswap\s/s/^/#/' /etc/fstab # 永久关闭:注释掉 /etc/fstab 中含 swap 的行
分别修改三个节点的hosts文件
使用sudo vim /etc/hosts,将127.0.0.1 后面对应的主机名变更一下,方便区分,这里把master节点(192.168.88.142),改为k8smaster
vim中的操作:
方向键移动光标,按x删除,i于当前光标处进入编辑,此时可以输入字符,输完按Esc退出编辑模式,按:进入底线命令模式,wq保存退出,

分别修改三个节点主机名
# master节点
sudo hostnamectl set-hostname k8smaster
hostname # 查看主机名 应与hosts文件里刚改完的主机名相同
# node1
sudo hostnamectl set-hostname k8snode1
hostname # 查看主机名 应与hosts文件里刚改完的主机名相同
# node2
sudo hostnamectl set-hostname k8snode2
hostname # 查看主机名 应与hosts文件里刚改完的主机名相同
这里要关闭当前终端,重新打开,才会发现主机名发生变化 (⊙o⊙)
二、自动化安装 Kubernetes 三大组件(kubeadm/kubelet/kubectl)每台节点都执行
- 由于命令比较多,推荐使用sh脚本安装
使用流程:
vim kubeadm.sh新建一个脚本文件- 把下面的复制进去就行
- 先
sudo -v,更新用户权限 - 然后
chmod 755 ./kubeadm.sh添加执行权限 - 然后直接
./kubeadm.sh
#!/bin/bash
# 安装基础依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# 导入 Kubernetes GPG 密钥(使用阿里云镜像)
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg
# 写入 Kubernetes 镜像源(阿里云)
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
# 更新并安装指定版本
KUBE_VER="1.24.1-00"
sudo apt-get update
sudo apt-get install -y kubelet=$KUBE_VER kubeadm=$KUBE_VER kubectl=$KUBE_VER
# 锁定版本,防止被自动升级
sudo apt-mark hold kubelet kubeadm kubectl
# 配置 kubelet 使用阿里云的 pause 镜像(关键修改)
sudo tee /etc/default/kubelet <<EOF
sudo tee /etc/default/kubelet <<EOF
KUBELET_EXTRA_ARGS=--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7 --container-runtime=remote --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock
EOF
# 重启 kubelet 使配置生效
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# 检查 kubelet 状态
systemctl status kubelet
- 成功

按q退出
三、自动化初始化 Kubernetes Master 节点只需要在master节点执行
- 由于命令比较多,推荐使用sh脚本安装
如果还用WindTerm会话窗口的话记得修改只操作当前会话:
使用流程:
vim k8s_init.sh新建一个脚本文件- 把下面的复制进去就行(记得改自己的ip)
我提供的sh脚本,只需要修改两处:ip、主机名

- 先
sudo -v,更新用户权限 - 然后
chmod 755 k8s_init.sh添加执行权限 - 然后直接
./k8s_init.sh
#!/bin/bash
set -e
# ========== 配置项 ==========
MASTER_IP="192.168.88.142"
MASTER_HOSTNAME="k8smaster"
K8S_VERSION="1.24.1"
POD_CIDR="10.244.0.0/16"
CRI_SOCKET="unix:///var/run/cri-dockerd.sock"
IMAGE_REPO="registry.aliyuncs.com/google_containers"
CONFIG_FILE="kubeadm.init.yaml"
LOG_FILE="kubeadm-init.log"
# ========== 生成配置文件 ==========
echo "[1/5] 生成 kubeadm 配置文件..."
cat > "$CONFIG_FILE" <<EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: ${MASTER_IP}
bindPort: 6443
nodeRegistration:
criSocket: ${CRI_SOCKET}
name: ${MASTER_HOSTNAME}
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v${K8S_VERSION}
controlPlaneEndpoint: "${MASTER_IP}:6443"
imageRepository: ${IMAGE_REPO}
networking:
podSubnet: ${POD_CIDR}
EOF
# ========== 重启相关服务 ==========
echo "[2/5] 重启相关服务..."
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl restart cri-docker.service
sudo systemctl restart cri-docker.socket
sudo systemctl restart kubelet
sudo systemctl enable docker cri-docker cri-docker.socket kubelet
# ========== 拉取镜像 ==========
echo "[3/5] 拉取镜像..."
sudo kubeadm config images pull --config="$CONFIG_FILE"
# ========== 初始化集群 ==========
echo "[4/5] 初始化集群... 日志已记录至 $LOG_FILE"
sudo kubeadm init --config="$CONFIG_FILE" --v=5 2>&1 | tee -a "$LOG_FILE"
# ========== 诊断初始化失败 ==========
if [ $? -ne 0 ]; then
echo "===== 初始化失败,开始诊断 ====="
echo "详细日志请查看: $LOG_FILE"
echo "===== kubelet 服务状态 ====="
sudo systemctl status kubelet -l
echo "===== kubelet 最新日志 ====="
sudo journalctl -xeu kubelet | tail -n 100
echo "===== cri-dockerd 容器状态 ====="
crictl --runtime-endpoint "$CRI_SOCKET" ps -a | grep -E "kube|pause"
echo "===== kube-apiserver 容器日志 ====="
POD_ID=$(crictl --runtime-endpoint "$CRI_SOCKET" ps -a | grep kube-apiserver | awk '{print $1}')
if [ -n "$POD_ID" ]; then
crictl --runtime-endpoint "$CRI_SOCKET" logs "$POD_ID"
fi
echo "===== 诊断完成,请根据以上信息排查问题 ====="
exit 1
fi
# ========== 配置 kubectl ==========
echo "[5/5] 配置 kubectl..."
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# ========== 提示命令 ==========
echo ""
echo "初始化完成!你现在可以尝试以下命令:"
echo ""
echo "查看节点状态: kubectl get nodes"
echo "查看所有 Pod 状态: kubectl get pods -A"
echo ""
echo "请安装网络插件(如 Flannel)后再次查看节点状态,确认 Ready 即完成部署。"
echo ""
echo "工作节点加入命令如下(已自动添加cri-socket参数,直接复制即可):"
# ====== 自动生成带cri-socket参数的加入命令 ======
TOKEN=$(kubeadm token create --print-join-command 2>&1 | grep -oP '(?<=--token\s).*?(?=\s|$)')
CA_CERT_HASH=$(openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //')
JOIN_CMD="sudo kubeadm join ${MASTER_IP}:6443 \
--token ${TOKEN} \
--discovery-token-ca-cert-hash sha256:${CA_CERT_HASH} \
--cri-socket ${CRI_SOCKET}"
echo "$JOIN_CMD"
如果失败可以把生成的日志文件
kubeadm-init.log给ai判断,然后执行下面的重置节点操作,从k8smaster节点初始化重新来
成功!!!
四、master节点配置kubectl
- 这里分开执行,提示覆盖时输入
y回车
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 执行完后,先验证一下是否能看到 master 节点状态
kubectl get nodes

五、将node1 / 2 加入worker节点
- 要在下面红框显示的命令前加
sudo,后加--cri-socket unix:///var/run/cri-dockerd.sock
- 最终的加入工作节点命令如下
sudo kubeadm join 192.168.88.142:6443 \
--token 6sgeay.8axrukvnsidqroxu \
--discovery-token-ca-cert-hash sha256:d76b961fe548cd777dbd5943c0ec6b1244e55346b8e620577c6227a777d469a6 \
--cri-socket unix:///var/run/cri-dockerd.sock
-
加入成功

-
另一台worker节点同操作

-
测试命令,可以看到这里都是NotReady状态,原因是网络还没搭起来,接下来安装网络插件
chenaws@k8smaster:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster NotReady control-plane 7m34s v1.24.1
k8snode1 NotReady <none> 21s v1.24.1
k8snode2 NotReady <none> 11s v1.24.1
chenaws@k8smaster:~$
六、master节点安装网络插件flannel
- 加入worker节点也可以在安装完网络插件之后
vim flannel.sh新建一个脚本文件- 把下面的复制进去就行
- 先
sudo -v,更新用户权限 - 然后
chmod 755 ./flannel.sh添加执行权限 - 然后直接
./flannel.sh
#!/bin/bash
# 下载flannel网络组件定义文件到指定目录
echo "下载flannel网络组件定义文件..."
curl -O https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
# 检查下载是否成功
if [ ! -f "./kube-flannel.yml" ]; then
echo "错误:flannel配置文件下载失败失败"
exit 1
fi
# 应用flannel配置
echo "应用flannel网络配置..."
kubectl apply -f ./kube-flannel.yml
# 等待flannel部署完成
echo "等待flannel部署完成..."
sleep 10
# 修改kube-proxy配置为ipvs模式
echo "修改kube-proxy为ipvs模式..."
kubectl get cm -n kube-system kube-proxy -o yaml | sed 's/mode: ""/mode: "ipvs"/' | kubectl replace -f -
# 重启kube-proxy守护进程
echo "重启kube-proxy守护进程..."
kubectl rollout restart -n kube-system daemonset kube-proxy
# 等待kube-proxy重启完成
echo "等待kube-proxy重启完成..."
sleep 7
# 查看集群状态
echo "当前集群Pod状态:"
kubectl get pod -A
echo "所有操作已完成!"
- 成功配置网络组件(一开始配置好之后,要等好久,才会全部ready)

k8s安装到此结束
七、重置节点
- 任意节点都可以通过下列方式移出集群,如果安装过程失败,也可以执行下列命令重新安装,
- 普通node工作节点在移除后,只需要重新用master的加入命令加入即可,移除master节点后,需要重新初始化
sudo kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
sudo rm -rf /var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni /etc/cni/net.d $HOME/.kube/config
sudo apt install ipvsadm
sudo apt install net-tools
# flannel相关
sudo ipvsadm --clear
sudo ifconfig cni0 down
sudo ip link delete cni0
- 一键重置脚本
#!/bin/bash
# 1. 重置Kubernetes节点
echo "重置Kubernetes节点..."
sudo kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock || true
# 2. 删除Kubernetes相关文件和目录
echo "删除Kubernetes配置文件..."
sudo rm -rf /var/lib/kubelet \
/var/run/kubernetes \
/var/lib/cni \
/etc/cni/net.d \
/etc/kubernetes \
$HOME/.kube/config
# 3. 清理网络配置
echo "清理网络配置..."
sudo ipvsadm --clear
sudo ifconfig cni0 down && sudo ip link delete cni0 || true
sudo ifconfig flannel.1 down && sudo ip link delete flannel.1 || true
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo iptables -X
# 4. 重新安装依赖工具
echo "安装网络工具..."
sudo apt install -y ipvsadm net-tools
echo "节点重置完成!可以重新执行kubeadm join命令加入集群。"
更多推荐












所有评论(0)