Ⅰ、最新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
  • 个人推荐WindTermhttps://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.04apt源覆盖写入命令,直接复制我下面给出的这个命令(使用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
  • 解决方案
    1. 将当前用户添加到Docker组:
      sudo usermod -aG docker $USER  
      
    2. 使新组生效(无需重启):
      newgrp docker  
      

  • 配置Docker镜像加速源
  • 问题现象二:拉取镜像时提示连接超时(无法访问Docker Hub)。
  • 操作步骤: (如果你不会用vim,请直接跳到 4
  1. 编辑Docker配置文件:
sudo vim /etc/docker/daemon.json  
  1. 写入镜像加速源(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/"  
  ]  
}  
  1. 重载配置并重启Docker服务:
sudo systemctl daemon-reload 
 
sudo systemctl restart docker.service  
  1. 一键操作这里直接全部复制,统一执行
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-world  
    
    docker 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.2MySQL 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 + Dockerkubeadm + containerd演进历史:

    1. Kubernetes1.23 及以前版本:用的 kubeadm + Docker 安装方式,此时Kubernetes 是支持直接用 Docker 来跑容器的,但实际上是通过一个接口(叫 CRI - Container Runtime Interface)去调用容器引擎的。

    Docker 本身并不支持 CRI,K8s 是通过一个中间插件(dockershim)来兼容 Docker

    1. 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

如果想要快速配置代理,可以参考:【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 driversystemd

由于Kubernetes中kubelet组件默认使用的cgroupdriver 为 “systemd”,所以我们将dockercgroupdriver也修改为 “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命令加入集群。"

https://github.com/0voice

Logo

一站式 AI 云服务平台

更多推荐