Ubuntu 18.04 搭建 Kubernetes 1.27.4 集群全流程(附问题排查)
本文详细讲解在 Ubuntu 18.04 系统上部署 K8s 1.27.4 集群的完整步骤,含 2 台机器(Master 192.168.10.100/Node 192.168.10.101,均 2C4G80G)的环境准备、共通配置(禁 swap、阿里源替换、Docker 安装 + 镜像加速)、Master 节点(kubeadm/kubelet/kubectl 安装、containerd 配置、集
虚拟机安装流程:https://www.borimooc.com/video/19436.htm
基于文档,在Ubuntu 18.04 系统上安装Kubernetes 1.27.4需先完成环境准备(最少 2 台机器,Master 节点192.168.10.100、Node 节点192.168.10.101等,配置均为 2C4G80G),所有节点需执行共通步骤(禁止 swap 分区、设置主机名与 /etc/hosts、配置 net.bridge 网络参数、替换为阿里软件源、安装 Docker 并配置阿里云镜像加速器及代理);随后 Master 节点需安装 kubeadm、kubelet、kubectl(版本 1.27.4),配置 containerd(修改 sandbox_image、开启 SystemdCgroup、设置镜像加速),通过自定义 kubeadm-config.yaml 初始化集群并安装 Calico 网络;Node 节点完成同 Master 的工具与 containerd 配置后,使用 Master 生成的 token 执行 kubeadm join 加入集群,同时文档还提供了 token 过期处理、kubelet 日志排查等问题解决方法及 crictl/ctr 等常用命令。

操作流程
1. 环境准备
- 虚拟化工具:支持 vmware 等虚拟化软件。
- 机器数量与配置:最少需 2 台机器(1 个 Master+1 个 Node),推荐配置如下表,可扩展 1 个可选 Node 节点:
虚拟机主机名 虚拟机 IP 地址 配置大小 备注 k8s-master1 192.168.10.100 2C4G80G 必须 k8s-node1 192.168.10.101 2C4G80G 必须 k8s-node2 192.168.10.102 2C4G80G 可选 - 连接要求:使用 Xshell 等 SSH 工具连接虚拟机,确保虚拟机可访问外网(用于拉取软件包与镜像)。
2. 所有节点共通操作(Master 与 Node 均需执行)
2.1 禁止 swap 分区
- 暂时禁止:执行命令
sudo swapoff -a
(重启后失效)。 - 永久禁止:执行
sudo vi /etc/fstab
,注释掉文件中包含 “swap” 的一行(重启后生效)。
2.2 配置主机名与 /etc/hosts
- 设置主机名:Master 节点执行
sudo hostnamectl set-hostname k8s-master1
,Node 节点执行sudo hostnamectl set-hostname k8s-node1
(对应节点名)。 - 修改 /etc/hosts:执行
sudo vi /etc/hosts
,在文件末尾添加集群节点 IP 与主机名映射,示例:192.168.10.100 k8s-master1 192.168.10.101 k8s-node1
。
2.3 配置网络参数(开启桥接转发)
- 生成配置文件:执行以下命令创建内核参数配置文件:
bash
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
- 生效配置:执行
sudo sysctl --system
使参数立即生效(Ubuntu 20.04 默认无需此步骤)。 - 设置时区:执行
timedatectl set-timezone Asia/Shanghai
(可先通过tzselect
查询时区)。
2.4 修改软件源为阿里源
- 备份默认源:
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
。 - 编辑新源:执行
sudo vi /etc/apt/sources.list
,添加阿里 Ubuntu 18.04(代号 bionic)源,共 10 行(含 deb 与 deb-src):plaintext
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
- 更新源与软件:
sudo apt update
(更新软件包列表)、sudo apt upgrade
(更新软件)。
2.5 安装并配置 Docker
- 安装依赖包:
sudo apt install -y apt-transport-https ca-certificates software-properties-common
。 - 安装常用工具:
sudo apt install -y vim curl net-tools python-pip
(推荐安装,方便后续操作)。 - 添加 Docker GPG key:
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
。 - 设置 Docker 阿里镜像源:
bash
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
- 安装 Docker CE:先执行
sudo apt update
,再执行sudo apt install docker-ce
。 - 启动并设开机自启:
sudo systemctl start docker
(启动)、sudo systemctl enable docker
(开机自启)。 - 配置 Docker 镜像加速器(解决拉取慢问题):
- 创建目录:
sudo mkdir -p /etc/docker
。 - 生成配置:
bash
sudo tee /etc/docker/daemon.json <<-'EOF' "registry-mirrors": ["https://d3ul9gtx.mirror.aliyuncs.com"] EOF
- 重启生效:
sudo systemctl daemon-reload
、sudo systemctl restart docker
。
- 创建目录:
- 可选配置 Docker 代理(需代理环境时):
- 创建目录:
mkdir /etc/systemd/system/docker.service.d/
。 - 编辑代理文件:
vi /etc/systemd/system/docker.service.d/http-proxy.conf
,添加:plaintext
[Service] Environment="HTTP_PROXY=http://192.168.10.199:7890/" Environment="HTTPS_PROXY=http://192.168.10.199:7890/"
- 重启生效:
systemctl daemon-reload
、systemctl restart docker
。
- 创建目录:
3. Master 节点安装 Kubernetes(1.27.4)
3.1 安装 kubeadm、kubelet、kubectl
- 安装依赖:
sudo apt update && sudo apt install -y ca-certificates curl software-properties-common apt-transport-https
。 - 添加 K8s 阿里源 GPG key:
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
。 - 添加 K8s 源:
bash
sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF
- 安装指定版本(1.27.4):
bash
sudo apt update sudo apt install -y kubelet=1.27.4-00 kubeadm=1.27.4-00 kubectl=1.27.4-00
- 锁定版本(防止意外升级):
sudo apt-mark hold kubelet kubeadm kubectl
。
3.2 配置 containerd(解决 K8s 镜像拉取问题)
- 创建目录:
mkdir -p /etc/containerd
。 - 生成默认配置:
containerd config default | sudo tee /etc/containerd/config.toml
。 - 编辑配置文件(
sudo vi /etc/containerd/config.toml
),修改 3 处关键参数:sandbox_image
:将默认的k8s.gcr.io/pause:3.6
改为registry.aliyuncs.com/google_containers/pause:3.9
(阿里源镜像,避免境外拉取失败)。SystemdCgroup
:在[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
下,将false
改为true
(适配 Systemd 管理)。config_path
:在[plugins."io.containerd.grpc.v1.cri".registry]
下,设置为/etc/containerd/certs.d
(指定镜像加速配置目录)。
- 配置 containerd 镜像加速:
- 创建目录:
mkdir /etc/containerd/certs.d/docker.io -pv
(针对 Docker Hub 镜像)。 - 生成加速配置:
bash
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF server = "https://docker.io" [host."https://b9pmyelo.mirror.aliyuncs.com"] capabilities = ["pull", "resolve"] EOF
- 创建目录:
- 加载内核模块:
- 生成模块配置:
bash
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF
- 生效模块:
sudo modprobe overlay
、sudo modprobe br_netfilter
。
- 生成模块配置:
- 重启 containerd:
systemctl restart containerd
,检查状态:systemctl status containerd
(确保为 running)。
3.3 初始化 K8s 集群
- 生成默认配置文件:
sudo kubeadm config print init-defaults > kubeadm-config.yaml
。 - 编辑配置文件(
sudo vi kubeadm-config.yaml
),修改 4 处关键参数:参数名 修改内容 目的 advertiseAddress 改为 Master 内网 IP(如 192.168.10.100) 确保节点访问 API Server name 改为 k8s-master1 与主机名一致 imageRepository 改为registry.aliyuncs.com/google_containers 用阿里源拉取 K8s 镜像 serviceSubnet 改为 10.244.0.0/16 与后续 Calico 网络匹配 - 执行初始化:
sudo kubeadm init --config kubeadm-config.yaml --v=5
(--v=5
用于输出详细日志,方便排错)。- 若初始化失败,执行
sudo kubeadm reset
重置后重新操作。
- 若初始化失败,执行
- 配置 kubectl 权限(普通用户使用):
bash
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 若为 root 用户,直接执行
export KUBECONFIG=/etc/kubernetes/admin.conf
。
- 若为 root 用户,直接执行
3.4 部署 Calico 网络插件(必选,否则 Pod 无法通信)
- 克隆仓库(需代理时加
-c http.proxy
参数):bash
git clone -c http.proxy="http://192.168.10.199:7890" https://github.com/dotbalo/k8s-ha-install.git/ # 或无代理时:git clone https://github.com/dotbalo/k8s-ha-install.git
- 切换分支:
cd k8s-ha-install
、git checkout manual-installation-v1.26.x
。 - 进入 Calico 目录:
cd /root/k8s-ha-install/calico
,备份配置:cp calico.yaml calico.yaml.bak
。 - 核对网段:执行
cat /etc/kubernetes/manifests/kube-apiserver.yaml
,确认--service-cluster-ip-range=10.244.0.0/16
(与 kubeadm-config.yaml 一致)。 - 修改 Calico 网段:
sudo vi calico.yaml
,搜索CALICO_IPV4POOL_CIDR
,将value
改为"172.16.0.0/16"
。 - 部署 Calico:
kubectl apply -f calico.yaml
(若后续更新配置,执行kubectl replace -f calico.yaml
)。 - 验证:
kubectl get pod -n kube-system
,若未添加 Node 节点,部分 Calico Pod(如 calico-node)异常属正常。
4. Node 节点安装 Kubernetes
4.1 安装 kubeadm、kubelet、kubectl
- 步骤与 Master 节点完全一致:安装依赖、添加 K8s 阿里源、安装 1.27.4 版本工具、锁定版本(参考 3.1)。
4.2 配置 containerd
- 步骤与 Master 节点完全一致:生成配置、修改 3 处参数、配置镜像加速、加载内核模块、重启 containerd(参考 3.2)。
4.3 安装依赖包
- 执行
pip install --upgrade pip
(升级 pip)、pip install python-zunclient
(安装 K8s 相关依赖)。
4.4 加入 K8s 集群
- 执行 Master 节点初始化成功后输出的
kubeadm join
命令(示例,需以实际输出为准):bash
kubeadm join 192.168.10.100:6443 --token ltlaym.3aj9nwrqmk2lra7v \ --discovery-token-ca-cert-hash sha256:d819b5e8078d40c937087bcae418862f86ef5d2aa8276ed46be6e036b4e93993
- 注意:此命令不可在 Master 节点执行,仅用于 Node 节点加入。
5. 问题排查
- 通用排查命令:
- 查看 kubelet 日志(定位启动失败原因):
journalctl -fxeu kubelet
。 - 检查 10250 端口(K8s 节点通信端口)占用:
sudo netstat -tunlp | grep 10250
。 - 验证集群状态:
kubectl get node
(查看节点是否 Ready)、kubectl get pod -A
(查看所有 Pod 状态)。 - 查看异常 Pod 详情:
kubectl logs -f <Pod名称> -n kube-system
(日志)、kubectl describe pod <Pod名称> -n kube-system
(描述信息)。
- 查看 kubelet 日志(定位启动失败原因):
- Token 过期问题(Node 无法加入集群时常见):
- 检查 Token:在 Master 执行
kubeadm token list
,无输出则表示过期。 - 生成新 Token:
kubeadm token create
(记录生成的 Token)。 - 计算新的
discovery-token-ca-cert-hash
:bash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
- 替换 Token 与 Hash:将新 Token 和 Hash 代入
kubeadm join
命令,重新在 Node 执行。
- 检查 Token:在 Master 执行
6. 常用命令(containerd 与 K8s 管理)
6.1 crictl 命令(K8s 容器管理专用)
- 配置:创建
/etc/crictl.yaml
,添加runtime-endpoint: unix:///run/containerd/containerd.sock
(指定容器运行时端点)。 - 常用操作:
命令 功能 crictl images 查看 K8s 环境下的镜像 crictl pods 查看所有 Pod crictl pods --name <Pod 名称> 查看指定名称的 Pod crictl ps 查看运行中的容器 crictl ps -a 查看所有容器(含已停止) crictl exec -i -t <容器 ID> < 命令 > 在容器内执行命令(如 ls) crictl logs <容器 ID> 查看容器所有日志 crictl logs --tail=2 <容器 ID> 查看容器最近 2 行日志 crictl pull <镜像名>(如 busybox) 拉取镜像
6.2 ctr 与 Docker 命令对比(containerd 原生工具)
Containerd 命令(ctr) | Docker 命令 | 功能 |
---|---|---|
ctr task ls | docker ps | 查看运行中的容器 |
ctr image ls | docker images | 查看镜像列表 |
ctr image pull <镜像名> | docker pull <镜像名> | 拉取镜像 |
ctr image push <镜像名> | docker push <镜像名> | 推送镜像 |
ctr image import <镜像 tar 包> | docker load -i <镜像 tar 包> | 导入本地镜像包 |
ctr run -d <镜像名> < 容器名 > | docker run -d --name=<容器名> < 镜像名 > | 后台运行容器 |
ctr image tag <原镜像> < 新镜像 > | docker tag <原镜像> < 新镜像 > | 为镜像打标签 |
4. 关键问题与答案
问题 1:安装 Kubernetes 1.27.4 前,Master 和 Node 节点必须完成的 “共通核心配置” 有哪些?这些配置的核心目的是什么?
答案:共通核心配置有 5 项,目的分别如下:
- 禁止 swap 分区:执行
sudo swapoff -a
(暂时)和注释 /etc/fstab 中 swap 行(永久),目的是避免 K8s 调度时因 swap 分区导致性能波动,K8s 要求必须禁用 swap。 - 配置主机名与 /etc/hosts:设置主机名并添加集群 IP - 主机名映射,目的是确保集群内节点间能通过主机名通信,避免 IP 依赖。
- 开启桥接网络转发:配置 net.bridge.bridge-nf-call-iptables=1 并生效,目的是让 K8s 的 Service 和 Pod 网络规则能通过 iptables 正常转发,保证网络通信。
- 替换为阿里软件源:将 Ubuntu 默认源改为阿里源,目的是解决境外源下载慢或失败问题,加速 apt 软件包(如 Docker、kube 工具)的安装。
- 安装并配置 Docker:安装 docker-ce 并配置阿里镜像加速器,目的是为 K8s 提供容器运行时(初期依赖 Docker,后续通过 containerd 适配),同时解决 Docker 镜像拉取慢问题。
问题 2:Master 节点初始化 K8s 集群时,kubeadm-config.yaml 的核心修改参数有哪些?为何必须修改这些参数?
答案:需修改 4 个核心参数,修改原因与 K8s 部署稳定性和可用性直接相关:
advertiseAddress: 192.168.10.100
:必须改为 Master 节点的内网 IP(而非默认的 1.2.3.4),原因是该地址是 API Server 对外暴露的通信地址,若用默认值,Node 节点无法定位 API Server,导致集群无法组建。imageRepository: registry.aliyuncs.com/google_containers
:必须替换默认的 k8s.gcr.io 源,原因是 k8s.gcr.io 为境外仓库,国内环境无法直接访问,替换为阿里源可确保 K8s 核心镜像(如 apiserver、controller-manager)能正常拉取。serviceSubnet: 10.244.0.0/16
:必须设置为与后续 Calico 网络匹配的网段,原因是 ServiceSubnet 是 K8s Service 的 IP 分配范围,若与 Calico 的 Pod 网段冲突,会导致 Service 与 Pod 无法通信。name: k8s-master1
:必须改为 Master 节点的实际主机名,原因是该参数用于标识 Master 节点在集群中的名称,需与hostnamectl
设置的主机名一致,否则节点身份识别会失败。
问题 3:Node 节点执行 kubeadm join 时提示 “token 过期”,从 “问题定位” 到 “解决操作” 的完整流程是什么?(需明确操作节点与命令)
答案:完整流程需在 Master 节点操作,分 4 步:
- 定位问题:在 Master 节点执行
kubeadm token list
,若命令无输出,即可确认 “token 过期”(K8s 默认 token 有效期为 24 小时)。 - 生成新 token:在 Master 节点执行
kubeadm token create
,命令会输出新 token(如gi0150.yhebhisi5rd4qu2y
),记录该 token。 - 计算新的 discovery-token-ca-cert-hash:在 Master 节点执行以下命令,获取 CA 证书的 SHA256 哈希值(如
2b69d7200704a4f82c26ad5b62bd97d8cb5a211165afa8de87cdf3973395aa2c
):bash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
- 更新 join 命令并执行:在 Node 节点,将新 token 和新 hash 代入
kubeadm join
命令,示例:bash
kubeadm join 192.168.10.100:6443 --token gi0150.yhebhisi5rd4qu2y \ --discovery-token-ca-cert-hash sha256:2b69d7200704a4f82c26ad5b62bd97d8cb5a211165afa8de87cdf3973395aa2c --v=5
执行后,在 Master 节点用kubectl get node
可查看 Node 是否成功加入(状态为 Ready)。
更多推荐
所有评论(0)