Skip to content

Ubuntu克隆和K8s ​

Ubuntu克隆必做项 ​

一、修改IP地址,避免冲突 ​

# 1. 查看netplan配置文件
ls /etc/netplan/
# 输出类似:00-installer-config.yaml

# 2. 编辑配置文件
vim /etc/netplan/00-installer-config.yaml

# 4. 生效配置
netplan apply

# 5. 验证IP
ip a

二、清理机器唯一标识 ​

# 1. 重置machine-id(systemd唯一标识,kubeadm依赖)
rm -f /etc/machine-id /var/lib/dbus/machine-id
dbus-uuidgen --ensure=/etc/machine-id
dbus-uuidgen --ensure

# 2. 重置产品UUID(虚拟机唯一标识)
rm -f /etc/uuid
uuidgen > /etc/uuid

# 3. 清理cloud-init残留(克隆后会残留Master的配置)
cloud-init clean
rm -rf /var/lib/cloud/*

三、重启 ​

reboot

Ubuntu 22.04 部署 K8s 1.30 完整步骤(1 Master + 2 Node) ​

Ubuntu官网:Ubuntu 24.04.4 (Noble Numbat)

账号密码 ​

输入项推荐填写内容说明
Your nameqinlang你的昵称,仅展示
Your server's namek8s-master-181主机名,集群唯一,标识主节点
Pick a usernameqinlang登录用户名,普通用户 + sudo 权限
Choose a passwordQl@123456(示例)强密码,三个节点统一
Confirm your passwordQl@123456(和上面一致)确认密码

环境规划 ​

角色主机名IP
Masterk8s-master10.0.0.181
Node1k8s-node-0110.0.0.182
Node2k8s-node-0210.0.0.183

一、所有节点统一环境准备(必须执行) ​

1. 设置主机名(对应节点执行) ​

bash
# Master节点执行
hostnamectl set-hostname k8s-master-01

# Node1节点执行
hostnamectl set-hostname k8s-node-01

# Node2节点执行
hostnamectl set-hostname k8s-node-02

2. 配置 hosts 解析,软连接解析(所有节点执行) ​

bash
cat >> /etc/hosts << EOF
10.0.0.81 k8s-master-01
10.0.0.82 k8s-node-01
10.0.0.83 k8s-node-02
EOF


rm -rf /etc/resolv.conf
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved

3. 关闭防火墙、Swap、SELinux(所有节点执行) ​

bash
# 关闭防火墙
systemctl stop ufw
systemctl disable ufw

# 关闭Swap(K8s强制要求)
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 关闭SELinux(Ubuntu默认未安装,可跳过)

4. 增大文件打开数量、加载内核模块、配置内核参数(所有节点执行) ​

ubuntu新版

# 临时加载模块(立即生效)
modprobe br_netfilter
modprobe nf_conntrack    # Ubuntu 没有 ip_conntrack, 已经合并到

# 开机自己自动加载模块
cat > /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
nf_conntrack
EOF

# 确认是否加载成功
lsmod | grep br_netfilter
lsmod | grep nf_conntrack
bash
# 增大文件打开数量
cat > /etc/security/limits.d/k8s.conf <<'EOF'
* soft nofile 65535 
* hard nofile 131070 
EOF
 
ulimit -Sn 
ulimit -Hn

# 加载内核模块
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter


# 内核优化
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp.keepaliv.probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp.max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp.max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.top_timestamps = 0
net.core.somaxconn = 16384
EOF
 
# 立即生效
sysctl --system

5.同步集群时间(所有节点执行) ​

方案一:可以只看这一步~!!!!!!!

# 所有节点先设置时区
timedatectl set-timezone Asia/Shanghai

# =====================》chrony服务端:服务端我们可以自己搭建,也可以直接用公网上的时间服务器,所以是否部署服务端看你自己
# 1、安装
apt -y install chrony
​
# 2、修改配置文件
mv /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak
​
cat > /etc/chrony/chrony.conf << EOF
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
server ntp5.aliyun.com iburst minpoll 4 maxpoll 10
server ntp6.aliyun.com iburst minpoll 4 maxpoll 10
server ntp7.aliyun.com iburst minpoll 4 maxpoll 10
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
allow 0.0.0.0/0
local stratum 10
keyfile /etc/chrony.keys
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
 
EOF
​
# 4、启动chronyd服务
systemctl restart chronyd.service # 最好重启,这样无论原来是否启动都可以重新加载配置
systemctl enable chrony.service
systemctl status chronyd.service
 
# =====================》chrony客户端:在需要与外部同步时间的机器上安装,启动后会自动与你指定的服务端同步时间
# 下述步骤一次性粘贴到每个客户端执行即可
# 1、安装chrony
apt -y install chrony
# 2、需改客户端配置文件
mv /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak
cat > /etc/chrony/chrony.conf << EOF
server k8s-master-01 iburst
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
local stratum 10
keyfile /etc/chrony.key
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
 
EOF
# 3、启动chronyd
systemctl restart chronyd.service
systemctl enable chrony.service
systemctl status chronyd.service
 
# 4、验证
chronyc sources -v

方案二:

设置时区为上海

timedatectl set-timezone Asia/Shanghai

安装ntpdate并与阿里云同步

sudo apt install -y ntpsec-ntpdate
ntpdate ntp.aliyun.com

设置自动同步

crontab -e

0 0 * * * ntpdate ntp.aliyun.com

6.更新系统软件、安装ipvs、换国内源 ​

更新系统软件
sudo apt updata
sudo apt upgrade -y


安装ipvs和相关命令
apt install wget expect vim net-tools ntp bash-completion ipvsadm ipset jq iptables conntrack sysstat libseccomp2 -y

配置ipvsadm模块
# 开机自动加载
sudo tee /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
nf_conntrack
EOF

# 重启
reboot

# 然后查看
lsmod | grep ip_vs


# 换国内源
# 备份原有配置
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak

# 写入清华国内源(Ubuntu 24.04 专用新版格式)
sudo cat > /etc/apt/sources.list.d/ubuntu.sources <<EOF
Types: deb
URIs: http://cn.archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF

# 更新源(生效)
sudo apt update

验证源
cat /etc/apt/sources.list.d/ubuntu.sources

7. 安装 Containerd(所有节点执行) ​

bash
#安装containerd
apt update && apt install -y containerd

#查看版本
containerd -v

# 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 关键:修改配置使用SystemdCgroup(K8s 1.22+强制要求)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# 2. 替换 pause 镜像为国内阿里云(解决拉取失败)
sed -i 's#registry.k8s.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' /etc/containerd/config.toml

# 重启Containerd
systemctl restart containerd
systemctl enable containerd

8. 安装 Kubeadm、Kubelet、Kubectl(所有节点执行) ​

方案一:

#1 导入 k8s 仓库密钥,如果 /etc/apt/keyrings 目录不存在,先创建:
sudo mkdir -p -m 755 /etc/apt/keyrings

#2 下载 k8s 包仓库的公共签名密钥。解释一下,密钥中有一个 v1.33,所有版本都是用的这个格式的密钥,即使你改为其他版本,下载的都是一个密钥,不影响,不过你想改也行:
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg && \
sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg

#3 添加 k8s 的 apt 仓库,使用其他版本的替换地址中的 v1.33 就行:
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list

#4 更新 apt 索引,并且安装,还要防止软件更新,三步:
sudo apt update && \
sudo apt install -y kubelet kubectl kubeadm && \
sudo apt-mark hold kubelet kubeadm kubectl # 将这三个软件包标记为“保持(hold)状态”,意思是 阻止它们被 apt upgrade 或自动升级。

#5 启动 kubelet,并且设置开机自启:
sudo systemctl enable --now kubelet # 先设置开启启动,并不是立即启动kubelet
sudo systemctl status kubelet # 现在查看到启动时失败的,因为还没有生成配置文件,这点后面做

# 查看 kubeadm 版本
kubeadm version
kubeadm config images list

方案二:

bash
# 在物理机下载好对应的deb包(kubeadm、kubelet、kubeclt、cri-tools、kubernetes-cni)导入到ubuntu中
https://mirrors.ustc.edu.cn/kubernetes/core%3A/stable%3A/v1.30/deb/amd64/

#先安装系统依赖
apt update && apt install -y conntrack ebtables ethtool iproute2 iptables socat

#安装
实例安装:dpkg -i 文件名.deb

dpkg -i kubernetes-cni_1.30.14-1.1_amd64.deb
dpkg -i cri-tools_1.30.14-1.1_amd64.deb
dpkg -i kubelet_1.30.14-1.1_amd64.deb
dpkg -i kubeadm_1.30.14-1.1_amd64.deb
dpkg -i kubectl_1.30.14-1.1_amd64.deb

#修复依赖
apt -f install -y

#锁定版本
apt-mark hold kubelet kubeadm kubectl kubernetes-cni cri-tools

# 安装完验证
# 检查三个核心组件版本,必须完全一致!
kubeadm version
kubelet --version
kubectl version --client

二、Master 节点初始化(仅 Master 执行) ​

部署方案一(更偏向于自定义部署,详细可以参考kubeadm部署k8s1.30 – Egon林海峰):

kubeadm config print init-defaults > kubeadm.yaml

vim kubeadm.yaml

  • 改api-server的名字 advertiseAddress: k8s-master name: k8s-master-01

  • 改镜像仓库:imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

  • 修改版本 kubernetesVersion: 1.33.11

  • networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 #添加这个

  • 在最后一行添加,记得带上三个-

    apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs 记得也要带上三个-

    apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd

部署

kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification --ignore-preflight-errors=Swap

补充说明

kubeadm join 10.0.0.77:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:d5228d1e93179d31a10a2f35d0d19e7bdc6351b48a9dd1b1f589fc3c8fc76840 
    
这个命令中有一个 --token,它是会过期的,过期时间好像是 24 小时,如果 token 过期了,执行:
kubeadm token create
生成新的 token,替换命令中的 --token。
此外,kubeadm join 命令后面的 --discovery-token-ca-cert-hash 如果你也没记下来的话,可以从主节点的 CA 证书中提取哈希值,执行:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null \
| sha256sum | awk '{print $1}'
同样的,提取到的哈希值替换命令中 --discovery-token-ca-cert-hash 的值就行。

去污点

kubectl taint nodes k8s-master-01 node-role.kubernetes.io/control-plane-

部署方案二:

1. 初始化集群 ​

bash
初始化之前记得先看版本,下面版本别填错了
kubeadm init \
  --apiserver-advertise-address=10.0.0.77 \
  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
  --kubernetes-version=v1.33.11 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

2. 初始化成功后,配置 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

3. 保存 Node 加入命令(重要!) ​

初始化成功后会输出类似命令,复制保存,后面 Node 加入要用:

bash
kubeadm join 10.0.0.181:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

三、安装 Flannel 网络插件(仅 Master 执行) ​

1. 下载 Flannel 配置文件 ​

bash
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

2. 替换国内镜像(解决拉取失败) ​

bash
# 替换为南京大学镜像
sed -i 's#ghcr.io#ghcr.nju.edu.cn#g' kube-flannel.yml

3. 部署 Flannel ​

bash
kubectl apply -f kube-flannel.yml

四、Node 节点加入集群(仅 Node 执行) ​

在两个 Node 节点分别执行刚才保存的 join 命令: ​

bash
# 示例(替换为你实际的命令)
kubeadm join 10.0.0.181:6443 --token abcdef.0123456789abcdef \
  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

五、验证集群状态(仅 Master 执行) ​

1. 等待 1-2 分钟,查看节点状态 ​

bash
kubectl get nodes

成功结果:所有节点状态为 Ready

NAME           STATUS   ROLES           AGE   VERSION
k8s-master     Ready    control-plane   5m    v1.30.0
k8s-node-01    Ready    <none>          3m    v1.30.0
k8s-node-02    Ready    <none>          3m    v1.30.0

2. 查看 Pod 状态 ​

bash
kubectl get pods -n kube-system

成功结果:所有 Pod 状态为 Running(包括 coredns、flannel)


六、可选:给 Node 节点打 Worker 标签(仅 Master 执行) ​

bash
kubectl label node k8s-node-01 node-role.kubernetes.io/worker=
kubectl label node k8s-node-02 node-role.kubernetes.io/worker=

常见问题避坑 ​

  1. 节点 NotReady:检查 Flannel Pod 是否 Running,检查防火墙是否关闭,检查 /etc/cni/net.d/ 是否有配置
  2. Containerd 启动失败:确认 SystemdCgroup = true 已配置
  3. 镜像拉取失败:必须替换为国内镜像源
  4. Swap 未关闭:必须永久关闭 Swap,否则 kubelet 无法启动

需要我帮你生成一键部署脚本或者补充故障排查命令吗?

七、部署网络插件calico(重要,只在主节点上做) ​

注意

  • 要看是否兼容k8s
  • 要看是否兼容内核

这里我们部署calico,如果你想部署flannel那么见:https://egonlin.com/?p=10762

我们走到这步后还没有完成,因为集群只是在主节点上初始化了,其他机器要想加入集群,还得使用网络插件将它们连接起来,所以得安装一个网络插件,有很多个,选 calico 就行。

calico的官网github地址: https://github.com/projectcalico/calico

说明: Calico v3.30支持k8s的版本v1.31、v1.32、v1.33,见: https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements

部署时看你会遇见镜像问题,提前拉取

# 注意不用加sudo前缀执行,因为那样会导致无法使用上面export设置的环境变量
cat > /tmp/pull.sh << 'EOF'
ctr --namespace k8s.io image pull docker.io/calico/cni:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/csi:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/goldmane:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/kube-controllers:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/node-driver-registrar:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/node:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/pod2daemon-flexvol:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/typha:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/whisker-backend:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/whisker:v3.30.3
ctr --namespace k8s.io image pull docker.io/calico/apiserver:v3.30.3
EOF

sh /tmp/pull.sh

unset http_proxy
unset https_proxy

ctr --namespace k8s.io images list |grep docker.io |awk '{print $1}' # 查看结果

按照官网给的教程安装:

修改custom-resources.yaml

找到cidr这一行,内容修改如下:
	cidr: 10.244.0.0/16

再安装

bash
#1 安装operator
kubectl create -f
https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/tigera-operator.yaml

#2 安装CR
kubectl create -f
https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/custom-resources.yaml

如果报错连接不上的话将文件手动下载下来再执行,或者你手动打开复制

bash
wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/tigera-operator.yaml
# 或者
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/tigera-operator.yaml

下面部署的时候会遇到一些镜像问题,在所有节点上执行下述命令把镜像先下载到本地

bash
export http_proxy="http://192.168.1.100:7892"
export https_proxy="http://192.168.1.100:7892"

kubectl命令提示(在所有节点执行) ​

# 卸载多余的,重新正确安装
apt remove bash-completion* -y
apt install bash-completion -y

# 正确加载系统 bash-completion(关键!)
source /usr/share/bash-completion/bash_completion

# 重新生成 kubectl 补全
kubectl completion bash > ~/.kube/completion.bash.inc
source ~/.kube/completion.bash.inc

# 写入配置永久生效
echo "source /usr/share/bash-completion/bash_completion" >> ~/.bashrc
echo "source ~/.kube/completion.bash.inc" >> ~/.bashrc

# 立即生效
source ~/.bashrc

注意!!! ​

要在k8s集群开代理,记得把内网段no_proxy,不然calico网络组件通信不了,非常重要!!!!!!!

用 VitePress 构建