ubuntu26.04,使用kubeadm在线安装k8s-v1.34.11(NLB + 3 master + 2 worker节点)

ubuntu 26.04。

集群规划(5 节点)

master节点01,主机名:k8s-master-01,ip:172.21.64.36

master节点02,主机名:k8s-master-02,ip:172.21.64.37

master节点03,主机名:k8s-master-03,ip:172.21.64.38

工作节点01:主机名:k8s-worker-01,ip:172.21.64.39

工作节点02:主机名:k8s-worker-02,ip:172.21.64.40

 
机器名 内网 ip 角色
k8s-master-01 172.21.64.36 master
k8s-master-02 172.21.64.37 master
k8s-master-03 172.21.64.38 master
k8s-worker-01 172.21.64.39 worker
k8s-worker-02 172.21.64.40 worker

 一,清理kubeadm、containerd残留(所有节点执行)

清理旧版k8s残留

#!/usr/bin/env bash
set -euo pipefail

echo -e "===== 开始执行【全场景全覆盖】K8s 终极节点重置(适配kubeadm/sealos/kubekey/kubesray/kubeasz/二进制/deb混合残留)====="

# ======================
# 1. 通用集群重置(kubeadm体系)
# ======================
if command -v kubeadm >/dev/null; then
    kubeadm reset -f || true
fi

# ======================
# 2. 停止所有可能存在的服务(全覆盖)
# ======================
systemctl stop \
containerd kubelet \
kube-apiserver kube-controller-manager kube-scheduler kube-lb \
sealos kube-proxy etcd \
2>/dev/null || true

systemctl disable \
containerd kubelet \
kube-apiserver kube-controller-manager kube-scheduler kube-lb \
sealos kube-proxy etcd \
2>/dev/null || true

# ======================
# 3. 清理【二进制部署残留】控制面服务(你之前无限复活的元凶)
# ======================
rm -f /etc/systemd/system/kube-apiserver.service
rm -f /etc/systemd/system/kube-controller-manager.service
rm -f /etc/systemd/system/kube-scheduler.service
rm -f /etc/systemd/system/kube-lb.service
rm -f /etc/systemd/system/etcd.service
rm -f /etc/systemd/system/kube-proxy.service

# ======================
# 4. 清理 Sealos / Kubekey / KubeSray / Kubeasz 专属服务 & 目录
# ======================
# sealos 残留
rm -rf /var/lib/sealos /etc/sealos /root/.sealos
rm -f /etc/systemd/system/sealos.service

# kubekey/kubesray 残留
rm -rf /var/lib/kubekey /etc/kubekey /opt/kubekey
rm -rf /var/lib/kubesphere /etc/kubesphere

# kubeasz 残留
rm -rf /etc/kubeasz /var/lib/kubeasz

# ======================
# 5. 彻底purge卸载deb包(containerd.io、kubeadm、cri-tools全部purge,删除包+配置)
# ======================
apt purge -y --allow-change-held-packages \
    containerd.io containerd \
    kubeadm kubectl kubelet \
    cri-tools kubernetes-cni \
2>/dev/null || true

apt autoremove -y || true
apt autoclean

# 解除版本锁定,保证下次重装无冲突
apt-mark unhold \
    kubeadm kubelet kubectl \
    containerd.io cri-tools kubernetes-cni \
2>/dev/null || true

# ======================
# 6. 彻底清理所有路径 systemd 单元(解决二进制+deb双路径冲突)
# ======================
rm -f /lib/systemd/system/kubelet.service
rm -f /etc/systemd/system/kubelet.service
rm -rf /etc/systemd/system/kubelet.service.d

rm -f /lib/systemd/system/containerd.service
rm -f /etc/systemd/system/containerd.service
rm -rf /etc/systemd/system/containerd.service.d
rm -f /usr/local/lib/systemd/system/containerd.service

# ======================
# 7. 彻底清理所有路径 k8s/容器二进制
# 覆盖:apt/deb / 二进制解压 / kubekey / sealos
# 新增 cni、crictl 二进制清理
# ======================
rm -f /usr/bin/containerd /usr/bin/ctr /usr/bin/crictl /usr/bin/kube*
rm -f /usr/local/bin/containerd /usr/local/bin/ctr /usr/local/bin/crictl /usr/local/bin/kube*
rm -f /opt/kube/bin/* 2>/dev/null || true

# 清理二进制解压的cni插件二进制
rm -rf /opt/cni/bin/* 2>/dev/null || true

# ======================
# 8. 重载 systemd、清除失效状态
# ======================
systemctl daemon-reload
systemctl reset-failed

# ======================
# 9. 绝杀所有残留进程(杜绝复活、端口占用)
# ======================
pkill -9 -f "kube-apiserver|kube-scheduler|kube-controller-manager|kube-lb|kubelet|containerd|sealos|etcd|crictl" 2>/dev/null || true

# ======================
# 10. 清空所有体系数据目录
# ======================

# 先卸载 Calico cgroup 挂载点(否则 rm 报 Operation not permitted)
umount -R /var/run/calico/cgroup 2>/dev/null || true
umount -R /run/calico/cgroup 2>/dev/null || true

# /var/run 和 /run 是 tmpfs,重启自动清空,无需 rm
rm -rf \
/var/lib/containerd \
/var/lib/cri \
/etc/cni \
/opt/cni \
/root/.kube \
/etc/containerd \
/etc/kubernetes \
/var/lib/kubelet \
/var/lib/etcd \
/var/lib/calico \
/var/lib/sealos \
/var/lib/nerdctl \
/var/lib/kubekey \
/var/lib/kubesphere \
/etc/kubeasz \
/etc/cni/net.d/*

# ======================
# 11. 重置网络栈(解决多工具残留网卡、iptables错乱)
# ======================
iptables -F && iptables -t nat -F && iptables -X && ipvsadm -C
ip link del tunl0 2>/dev/null || true
ip link del cni0 2>/dev/null || true
ip link del flannel.1 2>/dev/null || true
ip link del vxlan.calico 2>/dev/null || true

echo -e "✅ 【k8s残留】清理完成!已purge卸载 containerd.io、cri-tools、kubernetes-cni"

 

二. 前置系统环境配置(所有节点执行)

1. 修改主机名

# master-01节点执行
hostnamectl set-hostname k8s-master-01
# master-02节点执行
hostnamectl set-hostname k8s-master-02
# master-03节点执行
hostnamectl set-hostname k8s-master-03
# worker-01节点执行
hostnamectl set-hostname k8s-worker-01
# worker-02节点执行
hostnamectl set-hostname k8s-worker-02

 

2. 配置 hosts 解析(所有节点统一写入 /etc/hosts)

cat >> /etc/hosts << EOF
172.21.64.36   k8s-master-01
172.21.64.37   k8s-master-02
172.21.64.38   k8s-master-03
172.21.64.39   k8s-worker-01
172.21.64.40   k8s-worker-02
EOF

 

3. 系统内核 & 资源优化

# 关闭永久swap
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

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

# 内核转发、iptables桥接
cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1

# 允许绑定本机不存在的VIP(HA/kube-vip核心)
net.ipv4.ip_nonlocal_bind = 1

# 反向路由过滤 全部宽松模式
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.eth0.rp_filter = 2  #eth0替换为真实的网卡名称(非必填)

# ARP应答策略:仅匹配网卡IP才回复
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1  #eth0替换为真实的网卡名称(非必填)

# ARP宣告策略:严格匹配网卡网段
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2  #eth0替换为真实的网卡名称(非必填)

EOF
sysctl -p

# 加载overlay/iptables内核模块
modprobe overlay
modprobe br_netfilter


#系统开机自动加载里面写的内核模块。
echo "overlay" >> /etc/modules-load.d/k8s.conf
echo "br_netfilter" >> /etc/modules-load.d/k8s.conf
# 开启root密码登录
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/#PubkeyAuthentication no/PubkeyAuthentication yes/' /etc/ssh/sshd_config
systemctl restart ssh systemctl enable ssh

#时间同步
apt install chrony -y
systemctl enable --now chronyd
timedatectl set-timezone Asia/Shanghai

 

4 安装所有软件包

apt update && apt upgrade -y
apt install -y curl wget openssl ca-certificates gnupg lsb-release openssh-server sshpass tar unzip ipset ipvsadm conntrack socat lvm2

 

5. Master 节点单独执行 SSH 免密分发

# master节点生成密钥
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519
# 分发公钥
sshpass -p "root密码" ssh-copy-id root@172.21.64.36
sshpass -p "root密码" ssh-copy-id root@172.21.64.37
sshpass -p "root密码" ssh-copy-id root@172.21.64.38
sshpass -p "root密码" ssh-copy-id root@172.21.64.39
sshpass -p "root密码" ssh-copy-id root@172.21.64.40

# 验证免密连通
ssh root@172.21.64.36 hostname
ssh root@172.21.64.37 hostname
ssh root@172.21.64.38 hostname
ssh root@172.21.64.39 hostname
ssh root@172.21.64.40 hostname

 

6. 批量校验所有节点 SSH 连通性(最关键前置检查)

nodes=(172.21.64.36 172.21.64.37 172.21.64.38 172.21.64.39 172.21.64.40)
for ip in ${nodes[@]};
do
  echo "=== 测试 $ip SSH ==="
  sshpass -p "你的root密码" ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@$ip "hostname; echo 连接正常"
done

 

三,安装nerdctl(所有节点)

由于阿里云ecs服务器不能访问外问,所以通过nerdctl从国内镜像仓库预先拉取镜像。

nerdctl下载地址:https://github.com/containerd/nerdctl/releases/download/v2.3.4/nerdctl-2.3.4-linux-amd64.tar.gz

安装部署nerdctl

curl https://github.com/containerd/nerdctl/releases/download/v2.3.4/nerdctl-2.3.4-linux-amd64.tar.gz
tar -zxvf nerdctl-2.3.4-linux-amd64.tar.gz
mv nerdctl /usr/local/bin/
chmod +x /usr/local/bin/nerdctl

# 同样配置默认命名空间
mkdir -p /etc/nerdctl
cat > /etc/nerdctl/nerdctl.toml <<EOF
namespace = "k8s.io"
address = "/run/containerd/containerd.sock"
cgroup_manager = "systemd"
EOF

 

四,配置apt源(所有节点执行)

1. 配置containerd.io  apt安装源,因为apt自带的 containerd apt源的版本太旧

#!/bin/bash
# 探测信息赋值本地副本变量
local_arch=$(dpkg --print-architecture)
local_ubuntu_codename=$(lsb_release -cs)

# 清理旧docker源
rm -f /etc/apt/sources.list.d/docker.list
rm -f /etc/apt/trusted.gpg.d/docker*.gpg

# 阿里云docker-ce公钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg

# 添加阿里云docker-ce源(包含 containerd.io)
echo "deb [arch=${local_arch} signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu ${local_ubuntu_codename} stable" | tee /etc/apt/sources.list.d/docker.list

apt update

echo -e "\n=== 当前架构:${local_arch},系统代号:${local_ubuntu_codename} ==="
echo -e "\n=== 查看当前源可用 containerd.io 版本 ==="
apt-cache madison containerd.io

 

2. 配置kuberetes v1.34  apt安装源

#!/bin/bash
set -euo pipefail

# ========== 配置项:k8s源分支只写小版本 v1.32 / v1.33 / v1.34 / v1.35 / v1.36 ==========
k8s_apt_branch="v1.34"

# 定义本地变量
local_arch=$(dpkg --print-architecture)
local_ubuntu_codename=$(lsb_release -cs)
local_k8s_apt_branch="${k8s_apt_branch}"

###########################
# 1. 配置 K8s pkgs.k8s.io 源
###########################
rm -f /etc/apt/sources.list.d/kubernetes.list
rm -f /etc/apt/trusted.gpg.d/kubernetes-*.gpg

curl -fsSL "https://pkgs.k8s.io/core:/stable:/${local_k8s_apt_branch}/deb/Release.key" | gpg --dearmor -o "/etc/apt/trusted.gpg.d/kubernetes-${local_k8s_apt_branch}.gpg"

echo "deb [signed-by=/etc/apt/trusted.gpg.d/kubernetes-${local_k8s_apt_branch}.gpg] https://pkgs.k8s.io/core:/stable:/${local_k8s_apt_branch}/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
apt update

echo -e "\n========== 可用 kubeadm 版本列表 =========="
apt-cache madison kubeadm

 

五,安装基础组件(所有节点执行)

1. 安装containerd

#!/usr/bin/env bash
set -euo pipefail

# ======================
# 版本变量区
# k8s v1.34 配套pause固定版本:3.10.1,不是kubelet版本
# ======================
local_pause_version="3.10.1"

# ======================
# 前提:已经配置好 docker‑ce apt源(阿里云docker镜像源)
# 卸载系统自带旧 containerd,避免包冲突
# ======================
apt-get update
# 卸载ubuntu系统源的 containerd,防止混淆
apt purge -y containerd containerd.io 2>/dev/null || true

# 1. 安装 docker‑ce源 containerd.io
apt-get install -y containerd.io

# 2. 停止服务,修改配置前必须停止
systemctl stop containerd || true

# 3. 生成标准配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 4. SystemdCgroup = true
sed -i -e 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 5. pause镜像域名保持registry.k8s.io,直接用版本变量拼接tag
sed -i -E "s#^(\s*)sandbox = 'registry\.k8s\.io/pause:[0-9.]+'#\1sandbox = 'registry.k8s.io/pause:${local_pause_version}'#" /etc/containerd/config.toml

# 6. systemd重载,启动
systemctl daemon-reload
systemctl enable --now containerd

# 7. 验证服务
sleep 3
systemctl status containerd --no-pager | head -15
ls -la /run/containerd/containerd.sock
containerd --version

# 校验输出
echo "pause配置版本: ${local_pause_version}"
echo "=== config.toml sandbox行 ==="
grep -n "sandbox =" /etc/containerd/config.toml

 

2. 安装kubeadm / kubelet / kubectl / cri-tools / kuberntes-cni (安装当前k8s源的最新版本)

#!/bin/bash
set -euo pipefail

# ========= 安装当前k8s源的最新版本 =========

apt-get -y install \
kubeadm \
kubelet \
kubectl \
cri-tools \
kubernetes-cni

# 锁定版本防止apt自动升级
apt-mark hold kubeadm kubelet kubectl cri-tools kubernetes-cni containerd.io

# 生成crictl配置文件
cat > /etc/crictl.yaml <<'INNER'
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
INNER

systemctl enable --now kubelet

echo -e "\n===== 版本校验 ====="
kubelet --version

3. 仅在master-01节点拉取kubeadm的7个镜像并导出镜像

kubeadm用的7个镜像需要离线下载,由于不同版本的containerd的国内代理配置方法不一样,而且就算配置了国内代理也未必好用,所以先通过国内镜像仓库预下载所需要的镜像。

#!/bin/bash
set -euo pipefail
# 从kubeadm里自动获取k8s版本(v1.34.11)
k8s_version=$(kubeadm version -o short)

# 定义文件名变量
img_list_file="k8s-images-${k8s_version}.list"
img_tar="k8s-images-${k8s_version}.tar"
# 基础目录
mkdir -p /data/k8s/k8s-${k8s_version}
cd /data/k8s/k8s-${k8s_version}

# 获取kubeadm需要全部镜像列表
kubeadm config images list --kubernetes-version "${k8s_version}" > "${img_list_file}"
cat "${img_list_file}"

# DaoCloud镜像加速预下载镜像:m.daocloud.io/
while read -r img; do
  ctr -n k8s.io images pull --platform linux/amd64 "m.daocloud.io/${img}"
done < "${img_list_file}"

# 重标签为原生镜像,删除daocloud前缀镜像
while read -r img; do
  ctr -n k8s.io images tag "m.daocloud.io/${img}" "${img}"
  ctr -n k8s.io images rm "m.daocloud.io/${img}"
done < "${img_list_file}"

# ctr export输出裸tar磁盘文件,不做gzip压缩
ctr -n k8s.io images export "${img_tar}" $(grep -v '^$' "${img_list_file}")

ls -lh "${img_tar}"

 

4. 把镜像批量上传到其它四个节点,并且导入镜像

#!/bin/bash
set -euo pipefail
# 从kubeadm里自动获取k8s版本(v1.34.11)
k8s_version=$(kubeadm version -o short)
img_tar="/data/k8s/k8s-${k8s_version}/k8s-images-${k8s_version}.tar"
remote_dir="/data/k8s/k8s-${k8s_version}"
remote_tar="${remote_dir}/k8s-images-${k8s_version}.tar"

# 节点IP列表
node_list=(
172.21.64.37
172.21.64.38
172.21.64.39
172.21.64.40
)

# 循环分发+远程导入镜像
for node_ip in "${node_list[@]}"; do
    echo -e "\n===== 处理节点 ${node_ip} ====="
    # 创建目录,删除旧tar包,避免残留损坏文件
    ssh "root@${node_ip}" "mkdir -p ${remote_dir} && rm -f ${remote_tar}"
    # scp拷贝镜像包到远程节点指定目录
    scp "${img_tar}" "root@${node_ip}:${remote_tar}"

    # ssh远程使用ctr导入到k8s.io命名空间
    ssh "root@${node_ip}" "ctr -n k8s.io image import ${remote_tar}"

    echo "节点 ${node_ip} 镜像导入完成,tar包保留:${remote_tar}"
done

echo -e "\n全部节点镜像分发导入完毕"

 

四. 下载适配 k8s-v1.34.11的calico.yaml / ingress-nginx.yaml部署文件及镜像(仅在master-01节点执行)

calico-v1.32.1, ingress-nginx-v1.15.1适配 k8s-v1.34.x / v1.35.x / v1.36.x

calico-v3.32.1:https://raw.githubusercontent.com/projectcalico/calico/v3.32.1/manifests/calico.yaml

ingress-nginx-controler-v1.15.1:https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.15.1/deploy/static/provider/cloud/deploy.yaml

1. 下载yaml文件(如果下载失败,手动下载到本地,再上传)

cd /data/k8s/k8s_$(kubeadm version -o short)
calico_version="v1.32.1" ingress-nginx_version="v1.15.1" calico_yaml="calico-${calico_version}.yaml" ingress_yaml="ingress-nginx-${ingress-nginx_version}.yaml" curl -fSL -o "${calico_yaml}" \ https://mirror.ghproxy.com/https://raw.githubusercontent.com/projectcalico/calico/${calico_version}/manifests/calico.yaml curl -fSL -o "${ingress_yaml}" \ https://mirror.ghproxy.com/https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-${ingress-nginx_version}/deploy/static/provider/cloud/deploy.yaml

 

2. 安装方式(两种方案)

2.1. 方案一,修改calico.yaml与ingress-nginx镜像源为国内镜像源的方式安装

# 替换镜像前缀为DaoCloud源
sed -i 's|docker.io/calico|m.daocloud.io/docker.io/calico|g' calico-v3.32.1.yaml
sed -i 's|quay.io/calico|m.daocloud.io/quay.io/calico|g' calico-v3.32.1.yaml

# 替换ingress-nginx原镜像为daocloud镜像
sed -i 's|registry.k8s.io/ingress-nginx|m.daocloud.io/registry.k8s.io/ingress-nginx|g' ingress-nginx-v1.15.1.yaml
# 删除 sha256 digest
sed -i 's/@sha256:[0-9a-f]*//g' ingress-nginx-v1.15.1.yaml

 

2.2 方案二,预先下载镜像,然后导入境像到其它节点的方式安装

查看 calico.yaml与ingress-nginx.yaml有哪些镜像

# 一条命令从yaml里提取镜像并去重
grep -hoP 'image:\s*\K[^@]+' calico-v3.32.1.yaml ingress-nginx-v1.15.1.yaml | sort -u

输出:

quay.io/calico/cni:v3.32.1
quay.io/calico/kube-controllers:v3.32.1
quay.io/calico/node:v3.32.1
registry.k8s.io/ingress-nginx/controller:v1.15.1
registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.9

从国内代理(daocloud)拉取镜像

k8_version="v1.34.11"
work_dir="/data/k8s/k8s-${k8_version}"
img_name="calico-ingress-images"
img_tar="${work_dir}/${img_name}-${k8_version}.tar"

mkdir -p "${work_dir}"

images=(
  "quay.io/calico/cni:v3.32.1"
  "quay.io/calico/kube-controllers:v3.32.1"
  "quay.io/calico/node:v3.32.1"
  "registry.k8s.io/ingress-nginx/controller:v1.15.1"
  "registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.9"
)

for img in "${images[@]}"; do
  proxy_img="m.daocloud.io/${img}"
  ctr -n k8s.io images pull --platform linux/amd64 "${proxy_img}"
  ctr -n k8s.io images tag "${proxy_img}" "${img}"
  ctr -n k8s.io images rm "${proxy_img}"
done

# 输出裸tar,不gzip
ctr -n k8s.io images export "${img_tar}" "${images[@]}"
ls -lh "${img_tar}"

 

2.3 上传镜像到其它四个节点并导入镜像

#!/bin/bash
set -euo pipefail

k8s_version="v1.34.11"
work_dir="/data/k8s/k8s-${k8s_version}"
img_name="calico-ingress-images"
# 本地源文件、远端完整路径统一变量管理
local_img_tar="${work_dir}/${img_name}-${k8s_version}.tar"
remote_img_tar="${work_dir}/${img_name}-${k8s_version}.tar"

mkdir -p "${work_dir}"

node_list=(
  172.21.64.37
  172.21.64.38
  172.21.64.39
  172.21.64.40
)

for node in "${node_list[@]}"; do
  echo -e "\n===== 分发处理节点 ${node} ====="
  ssh "root@${node}" "mkdir -p ${work_dir} && rm -f ${remote_img_tar}"
  scp "${local_img_tar}" "root@${node}:${remote_img_tar}"
  ssh "root@${node}" "ctr -n k8s.io images import ${remote_img_tar}"
done

echo -e "\n===== 验证各节点导入结果 ====="
for node in "${node_list[@]}"; do
  echo "=== ${node} ==="
  ssh "root@${node}" "ctr -n k8s.io images ls -q | grep -E 'calico|ingress-nginx'"
done

 

五,初始化集群

注意,如果使用 NLB / CLB 做控制面板端点,需要关闭NLB / CLB 的客户端地址保持,不然其它master节点未join进来,或故障,会导致kubectl命令卡住。

1.初始化master节点

kubeadm init \
  --kubernetes-version v1.34.11 \
  --control-plane-endpoint "nlb-8uzzik99a4ylb0f1fq.cn-shanghai.nlb.aliyuncsslb.com:6443" \
  --apiserver-advertise-address=172.21.64.36 \
  --pod-network-cidr=192.168.0.0/16 \
  --service-cidr=10.96.0.0/12 \
  --upload-certs

# 拷贝kubeconfig
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 查看节点状态
kubectl get nodes

 

输出: 

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes running the following command on each as root:

  kubeadm join nlb-8uzzik99a4ylb0f1fq.cn-shanghai.nlb.aliyuncsslb.com:6443 --token n6k5gy.m3182dic1snyr2jh \
        --discovery-token-ca-cert-hash sha256:a438a568a2ab0251ae01c19734f0620f297d8b225cc09b052f2971d4b0b73182 \
        --control-plane --certificate-key 0bc74678770f9abdb248dac7a89239a83632589ea9afee043a10b38d5016008c

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join nlb-8uzzik99a4ylb0f1fq.cn-shanghai.nlb.aliyuncsslb.com:6443 --token n6k5gy.m3182dic1snyr2jh \
        --discovery-token-ca-cert-hash sha256:a438a568a2ab0251ae01c19734f0620f297d8b225cc09b052f2971d4b0b73182

 

3. 安装calico(必须)

cd /data/k8s/k8s-v1.34.11
kubectl apply -f calico-v3.32.1.yaml

 

3. 加入其它工作节点

kubeadm join nlb-8uzzik99a4ylb0f1fq.cn-shanghai.nlb.aliyuncsslb.com:6443 --token n6k5gy.m3182dic1snyr2jh \
        --discovery-token-ca-cert-hash sha256:a438a568a2ab0251ae01c19734f0620f297d8b225cc09b052f2971d4b0b73182 \
        --control-plane --certificate-key 0bc74678770f9abdb248dac7a89239a83632589ea9afee043a10b38d5016008c

 拷贝kube.config

mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

 

如果没有记录join命令,重新生成加入master节点的命令:

out=$(kubeadm init phase upload-certs --upload-certs 2>/dev/null)
cert_key=$(echo "$out" | sed -n '/Using certificate key:/{n;p;}')
echo "【Master控制平面节点加入命令】"
kubeadm token create --print-join-command --ttl 0 --certificate-key "${cert_key}"

 

4.加入工作节点

kubeadm join nlb-8uzzik99a4ylb0f1fq.cn-shanghai.nlb.aliyuncsslb.com:6443 --token n6k5gy.m3182dic1snyr2jh \
        --discovery-token-ca-cert-hash sha256:a438a568a2ab0251ae01c19734f0620f297d8b225cc09b052f2971d4b0b73182

如果没有记录join命令,重新生成加入工作节点的命令:

kubeadm token create --print-join-command --ttl 0

 

5. 查看集群状态

kubectl get nodes
kubectl get pod -A

输出以下信息表示k8s集群安装成功:

root@k8s-master-01:/data/k8s/k8s-v1.34.11# kubectl get nodes
NAME            STATUS   ROLES           AGE   VERSION
k8s-master-01   Ready    control-plane   51m   v1.34.11
k8s-master-02   Ready    control-plane   24m   v1.34.11
k8s-master-03   Ready    control-plane   21m   v1.34.11
k8s-worker-01   Ready    <none>          20m   v1.34.11
k8s-worker-02   Ready    <none>          19m   v1.34.11
root@k8s-master-01:/data/k8s/k8s-v1.34.11# kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-688bf7649b-2zmq9   1/1     Running   0          5m40s
kube-system   calico-node-56dsn                          1/1     Running   0          5m9s
kube-system   calico-node-b9mff                          1/1     Running   0          4m34s
kube-system   calico-node-f4qr8                          1/1     Running   0          4m52s
kube-system   calico-node-rfbl8                          1/1     Running   0          5m40s
kube-system   calico-node-sz689                          1/1     Running   0          4m17s
kube-system   coredns-66bc5c9577-gpwbj                   1/1     Running   0          51m
kube-system   coredns-66bc5c9577-xchlg                   1/1     Running   0          51m
kube-system   etcd-k8s-master-01                         1/1     Running   1          51m
kube-system   etcd-k8s-master-02                         1/1     Running   0          24m
kube-system   etcd-k8s-master-03                         1/1     Running   0          21m
kube-system   kube-apiserver-k8s-master-01               1/1     Running   1          51m
kube-system   kube-apiserver-k8s-master-02               1/1     Running   0          24m
kube-system   kube-apiserver-k8s-master-03               1/1     Running   0          21m
kube-system   kube-controller-manager-k8s-master-01      1/1     Running   1          51m
kube-system   kube-controller-manager-k8s-master-02      1/1     Running   0          24m
kube-system   kube-controller-manager-k8s-master-03      1/1     Running   0          21m
kube-system   kube-proxy-2fssw                           1/1     Running   0          21m
kube-system   kube-proxy-5dt8j                           1/1     Running   0          20m
kube-system   kube-proxy-696f2                           1/1     Running   0          51m
kube-system   kube-proxy-d6kd7                           1/1     Running   0          24m
kube-system   kube-proxy-d6sg8                           1/1     Running   0          20m
kube-system   kube-scheduler-k8s-master-01               1/1     Running   1          51m
kube-system   kube-scheduler-k8s-master-02               1/1     Running   0          24m
kube-system   kube-scheduler-k8s-master-03               1/1     Running   0          21m
root@k8s-master-01:/data/k8s/k8s-v1.34.11#

 

posted @ 2026-08-22 11:52  民工黑猫  阅读(9)  评论(0)    收藏  举报