文章目录
Kubernetes 安装
生产环境说明
安装方式
| 安装方式 | 核心特点 | 难度 | 适用场景 | 优点 | 缺点 | 推荐指数 |
|---|---|---|---|---|---|---|
| kubeadm | 官方标准、无魔改 | 中等 | 生产自建、CKA/CKAD考试、标准集群 | 兼容性强、易升级、生态完善、文档全 | 步骤较多,需手动配置运行时/网络 | ⭐⭐⭐⭐⭐ |
| 二进制手工部署 | 全手动、底层可控 | 极高 | 原理研究、深度定制、教学演示 | 掌控所有组件、无任何封装 | 极易出错、升级繁琐、维护成本高 | ⭐⭐ |
| Sealos / KubeKey | 一键部署、高可用 | 低 | 快速搭建生产/测试环境 | 命令简单、自动装依赖、自带插件 | 轻度封装,不如 kubeadm 透明 | ⭐⭐⭐⭐ |
| k3s / k0s | 轻量、单二进制 | 低 | 边缘节点、低配机器、开发测试 | 占用小、启动快、自带 containerd/ingress | 裁剪版,部分高级特性有差异 | ⭐⭐⭐⭐ |
| minikube / kind / k3d | 单机实验环境 | 极低 | 本地开发、快速验证、学习调试 | 一键启动、环境干净 | 不能模拟真实多节点生产集群 | ⭐⭐⭐ |
| 云厂商托管(ACK/EKS 等) | Master 托管、免运维 | 低 | 云上生产业务 | 高可用、自动升级、无需维护控制面 | 成本高、受厂商限制 | ⭐⭐⭐⭐ |
| RKE / OpenShift | 企业发行版 | 中高 | 大型企业、有商业化支持需求 | 生态成熟、技术支持完善 | 重、学习成本高、商用成本高 | ⭐⭐⭐ |
选择建议:
- 学习 + 未来上生产:优先 kubeadm
- 快速搭建、不想折腾:Sealos
- 本地测试/开发:k3s 或 minikube
- 边缘/低配机器:k3s
环境说明
软件清单
- vmware workstation 17
- ubuntu-24.04-live-server-amd64
- kubeadm 1.30.2
- kubernetes 1.30.2
- containerd.io=1.7.20-1
- nerdctl-1.7.7-linux-amd64
- cni-plugins-linux-amd64-v1.6.0
虚拟机硬件配置
- 2 cpu
- 4G memory
- 1个NAT 网卡
- 1个200G 硬盘
节点规划
| 节点 | IP | 角色 |
|---|---|---|
| master30.laoma.cloud | 10.1.8.30 | master |
| worker31.laoma.cloud | 10.1.8.31 | work |
| worker32.laoma.cloud | 10.1.8.32 | work |
准备模板
系统准备
安装系统
Ubuntu 2404 系统最小化安装,不需要swap分区,按以下要求分区。
- /boot 2G
- / 90G
配置仓库源
操作系统仓库换成华为云的仓库,速度更快。
bash
#配置 apt 源文件,写入华为云 ubuntu 仓库;<<'EOF' 为 HereDoc,内容到 EOF 结束
root@ubuntu2404:~# cat > /etc/apt/sources.list.d/ubuntu.sources <<'EOF'
Types: deb
URIs: http://mirrors.huaweicloud.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
containerd 仓库
bash
# 导入 containerd 仓库 key
#下载 docker-ce GPG 公钥并通过 gpg 转换为 dearmour 格式存到 trusted.gpg.d;curl -f 失败报错、-s 静默、-S 显示错误、-L 跟随重定向
root@ubuntu2404:~# curl -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg
# 添加 containerd 仓库
#将 docker-ce 的 apt 源写入 docker-ce.list;cat << 'EOF' 从标准输入读取,> 重定向到文件
root@ubuntu2404:~# cat << 'EOF' > /etc/apt/sources.list.d/docker-ce.list
deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu noble stable
EOF
Kubernetes 官方变更了仓库的存储路径以及使用方式,使用 1.28 及以上版本,需按照新版配置方法进行配置。
该文档示例为配置 1.30 版本,如需其他版本请在对应位置字符串替换即可。比如需要安装 1.29 版本,则需要将如下配置中的 v1.30 替换成 v1.29。
目前该源支持 v1.24 - v1.35 版本,后续版本会持续更新。
bash
# 添加 kubernetes 仓库 key
#下载阿里云 K8s 1.30 版本 GPG 公钥并转换为 dearmor 格式存到 keyrings
root@ubuntu2404:~# curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 添加 kubernetes 仓库
#将阿里云 K8s 1.30 版本 apt 源写入 kubernetes.list;signed-by 指定校验公钥
root@ubuntu2404:~# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" > /etc/apt/sources.list.d/kubernetes.list
安装基础软件包
bash
#刷新 apt 索引并安装基础工具;-y 安装时自动确认
root@ubuntu2404:~# apt update && apt install -y vim lrzsz bash-completion open-vm-tools apt-transport-https sshpass
# vim:强大的终端文本编辑器,用于编辑配置文件、代码等。
# lrzsz:便于xshell快速上传和下载文件
# bash-completion:命令行自动补全工具,按 Tab 可补全命令、参数、文件名。
# open-vm-tools:VMware 虚拟机工具,实现时间同步、文件拖拽、分辨率适配等。
# apt-transport-https:让 apt 支持通过 HTTPS 下载软件包,用于访问安全源。
# sshpass:非交互式 SSH 登录工具,可在命令行直接带密码登录,多用于脚本自动化。
设置 IP
bash
#创建 netplan 原始配置备份目录
root@ubuntu2404:~# mkdir /etc/netplan/origin
#把原有的 yaml 配置移动到备份目录
root@ubuntu2404:~# mv /etc/netplan/*yaml /etc/netplan/origin
#写入静态 IP 配置,模板机 IP 为 10.1.8.30/24
root@ubuntu2404:~# cat > /etc/netplan/00-static.yaml <<EOF
network:
ethernets:
ens33:
dhcp4: no
addresses:
- 10.1.8.30/24
routes:
- to: default
via: 10.1.8.2
nameservers:
addresses:
- 10.1.8.2
- 223.5.5.5
version: 2
EOF
#设置配置文件权限为 600(仅属主可读写)
root@ubuntu2404:~# chmod 600 /etc/netplan/00-static.yaml
#应用 netplan 网络配置
root@ubuntu2404:~# netplan apply
设置 /etc/hosts
bash
#在 /etc/hosts 末尾追加集群各节点域名解析
root@ubuntu2404:~# cat << 'EOF' >> /etc/hosts
###### kubernetes #####
10.1.8.30 master30.laoma.cloud master30
10.1.8.31 worker31.laoma.cloud worker31
10.1.8.32 worker32.laoma.cloud worker32
10.1.8.21 hub.laoma.cloud
EOF
关闭 swap
如果有 swap 分区,需要关闭。kubernetes不需要swap分区。
bash
#关闭所有 swap;并删除 fstab 中含 swap 的行;-a 全部、-i 直接修改
root@ubuntu2404:~# swapoff -a && sed -i '/^.*swap/d' /etc/fstab
#删除可能残留的 swap.img 文件
root@ubuntu2404:~# rm -f /swap.img
配置对时
bash
#安装 chrony 时间同步服务
root@ubuntu2404:~# apt install -y chrony
# 以下步骤可以省略
#启用并立即启动 chrony
root@ubuntu2404:~# systemctl enable chrony --now
设置 ssh
bash
# 避免ssh服务器对客户端IP进行反向解析为域名,客户端可以快速与服务器建立连接
#在 sshd_config 末尾追加 UseDNS no
root@ubuntu2404:~# echo 'UseDNS no' >> /etc/ssh/sshd_config
# 避免ssh客户端校验服务器公钥,否则首次连接需要交互输入yes
#在 ssh_config 末尾追加 StrictHostKeyChecking no
root@ubuntu2404:~# echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
# 生成秘钥
#生成 RSA 密钥对;-N '' 空密码、-f 指定密钥路径、-t rsa 指定类型
root@ubuntu2404:~# ssh-keygen -N '' -f ~/.ssh/id_rsa -t rsa
# 配置免密登录自己:替换password为实际密码
#将公钥拷贝到本机;sshpass -p huawei 提供密码,ssh-copy-id 分发公钥
root@ubuntu2404:~# sshpass -p huawei ssh-copy-id root@localhost
配置 IPVS
bash
# 1. 安装 ipvs 依赖包
#安装 iptables、ipvsadm、ipset、conntrack
root@ubuntu2404:~# apt install -y iptables ipvsadm ipset conntrack
# 2-1. 加载基础网络模块:临时加载(立即生效)
#加载 overlay 存储驱动模块
root@ubuntu2404:~# modprobe overlay
#加载网桥 netfilter 模块
root@ubuntu2404:~# modprobe br_netfilter
# 模块功能说明:
# br_netfilter:允许桥接设备(Linux 网桥)通过 iptables 过滤,是 Kubernetes 网络通信必需。
# overlay:Overlay 文件系统模块,容器运行时(containerd/docker)分层镜像必备。
# 2-2. 加载 ipvs 内核模块:临时加载(立即生效)
#加载 IPVS 核心模块
root@ubuntu2404:~# modprobe ip_vs
#加载 IPVS 轮询调度模块
root@ubuntu2404:~# modprobe ip_vs_rr
#加载加权轮询模块
root@ubuntu2404:~# modprobe ip_vs_wrr
#加载最少连接模块
root@ubuntu2404:~# modprobe ip_vs_lc
#加载源地址哈希模块
root@ubuntu2404:~# modprobe ip_vs_sh
#加载连接跟踪模块
root@ubuntu2404:~# modprobe nf_conntrack
# 模块功能说明:
# ip_vs:IPVS 核心模块,实现四层负载均衡,是 kube-proxy ipvs 模式的基础。
# ip_vs_rr:IPVS 轮询调度算法,按顺序依次分发请求。
# ip_vs_wrr:加权轮询,按后端节点权重分配流量。
# ip_vs_lc:最少连接调度,优先发给连接数最少的节点。
# ip_vs_sh:源地址哈希,保证同一客户端 IP 始终访问同一后端。
# nf_conntrack:连接跟踪,记录网络连接状态,保证数据包正确转发。
# 3 永久加载模块(重启生效)
# systemd-modules-load.service 会自动加载改配置文件
#将需要永久加载的模块写入 k8s-net.conf
root@ubuntu2404:~# cat > /etc/modules-load.d/k8s-net.conf << EOF
# K8s 基础网络
br_netfilter
overlay
# IPVS 必需
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_lc
ip_vs_sh
nf_conntrack
EOF
配置其他内核参数
bash
# 配置内核参数,将桥接的IPv4流量传递到iptables的链
#写入 K8s 所需的内核转发参数
root@ubuntu2404:~# cat > /etc/sysctl.d/k8s.conf << 'EOF'
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF
# 内核参数说明:
# net.bridge.bridge-nf-call-iptables=1,启用iptables网络包过滤功能
# net.bridge.bridge-nf-call-ip6tables=1,启用ip6tables的网络包过滤功能
# net.ipv4.ip_forward=1,开启路由转发,转发IPv4的数据包
# vm.swappiness=0,禁止使用交换分区
# 内核参数立刻生效
#加载指定文件中的内核参数;-p 从文件读取
root@ubuntu2404:~# sysctl -p /etc/sysctl.d/k8s.conf
k8s 准备
配置 containerd
bash
#安装指定版本 containerd 和 cri-tools;= 指定版本
root@ubuntu2404:~# apt install -y containerd.io=1.7.20-1 cri-tools
# 设置crictl的runtime-endpoint
#配置 crictl 运行时接口为 containerd 的 sock
root@ubuntu2204:~# crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
#生成 containerd 默认配置文件
root@ubuntu2404:~# containerd config default > /etc/containerd/config.toml
# 修改 SystemdCgroup 和 sandbox_image
#将 SystemdCgroup 从 false 改为 true,使用 systemd cgroup 驱动
root@ubuntu2404:~# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
#将 sandbox_image 替换为指定的 pause 镜像
root@ubuntu2404:~# sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.9"|' /etc/containerd/config.toml
# 配置镜像仓库加速
#编辑 config.toml 添加镜像加速
root@ubuntu2404:~# vim /etc/containerd/config.toml
# 查找 configs 行
[plugins."io.containerd.grpc.v1.cri".registry.configs] #166行
# 添加如下两行记录,注意缩进
[plugins."io.containerd.grpc.v1.cri".registry.configs."hub.laoma.cloud".tls]
insecure_skip_verify = true
......
# 查找 mirrors行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
# 添加如下六行记录,注意缩进
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io","https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://k8s.m.daocloud.io","https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."hub.laoma.cloud"]
endpoint = ["http://hub.laoma.cloud"]
# 重启服务
#重启 containerd 使配置生效
root@ubuntu2404:~# systemctl restart containerd.service
# containerd 服务,默认已经设置开机启动,并启动
crictl 走的是 containerd CRI 接口,会读取 /etc/containerd/config.toml 里的 registry.mirrors 配置。
导入harbor虚拟机
k8s harbor虚拟机.zip 右击解压到当前文件夹
双击进入目录

双击hub.laoma.cloud.vmx











关机,拍快照
下次用直接开机就可以了,还原快照就到这次快照
下载测试:
bash
#通过 crictl 拉取 busybox 测试镜像
root@ubuntu2404:~# crictl pull busybox
#拉取 pause 镜像
root@ubuntu2404:~# crictl pull registry.k8s.io/pause:3.9
#拉取 harbor 私服中的 busybox
root@ubuntu2404:~# crictl pull hub.laoma.cloud/library/busybox
安装 nerdctl 和 cni plugin
nerdctl 项目地址:https://github.com/containerd/nerdctl/releases
cni 插件项目地址:https://github.com/containernetworking/plugins/releases
bash
# 下载并安装
#解压 nerdctl 到 /usr/bin;-x 解压、-f 文件、-C 指定目录
root@ubuntu2404:~# tar -xf nerdctl-1.7.7-linux-amd64.tar.gz -C /usr/bin/
# 下载 nerdctl 所需要的 cni 插件
#创建 cni 插件目录
root@ubuntu2404:~# mkdir -p /opt/cni/bin
#解压 cni 插件到 /opt/cni/bin
root@ubuntu2404:~# tar -xf cni-plugins-linux-amd64-v1.6.0.tgz -C /opt/cni/bin
nerdctl 走的是 containerd 原生 API ,不会读取 CRI 专属的 registry 配置,而是用自己独立的镜像源配置。
nerdctl 有自己的配置文件,需要单独配置 Docker Hub 加速。
bash
# 配置 docker.io 镜像加速
#创建 docker.io 的 hosts 配置目录
root@ubuntu2404:~# mkdir -p /etc/containerd/certs.d/docker.io
#写入 docker.io 加速地址配置
root@ubuntu2404:~# cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://registry-1.docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
[host."https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"]
capabilities = ["pull", "resolve"]
EOF
# 配置 registry.k8s.io 镜像加速
#创建 registry.k8s.io 的 hosts 配置目录
root@ubuntu2404:~# mkdir -p /etc/containerd/certs.d/registry.k8s.io
#写入 registry.k8s.io 加速地址
root@ubuntu2404:~# cat > /etc/containerd/certs.d/registry.k8s.io/hosts.toml << EOF
server = "https://registry.k8s.io"
[host."https://k8s.m.daocloud.io"]
capabilities = ["pull", "resolve"]
[host."https://registry.cn-hangzhou.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
# 配置 hub.laoma.cloud 镜像加速
#创建 harbor 的 hosts 配置目录
root@ubuntu2404:~# mkdir -p /etc/containerd/certs.d/hub.laoma.cloud
#写入 harbor 地址
root@ubuntu2404:~# cat > /etc/containerd/certs.d/hub.laoma.cloud/hosts.toml << EOF
server = "http://hub.laoma.cloud"
[host."http://hub.laoma.cloud"]
capabilities = ["pull", "resolve"]
EOF
下载测试:
bash
#用 nerdctl 拉取 busybox
root@ubuntu2404:~# nerdctl pull busybox
#拉取 pause 镜像
root@ubuntu2404:~# nerdctl pull registry.k8s.io/pause:3.9
#拉取 harbor 私服 busybox
root@ubuntu2404:~# nerdctl pull hub.laoma.cloud/library/busybox
安装 kubernetes 软件包
bash
# 查看版本
#查看仓库中可用的 kubeadm 版本;-a 所有版本、|head 取前几行
root@ubuntu2404:~# apt list kubeadm -a|head
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
Listing...
kubeadm/unknown 1.30.2-1.1 amd64
kubeadm/unknown 1.30.1-1.1 amd64
kubeadm/unknown 1.30.0-1.1 amd64
kubeadm/unknown 1.30.2-1.1 arm64
kubeadm/unknown 1.30.1-1.1 arm64
kubeadm/unknown 1.30.0-1.1 arm64
kubeadm/unknown 1.30.2-1.1 ppc64el
#安装指定版本 kubeadm、kubelet、kubectl
root@ubuntu2404:~# apt install -y kubeadm=1.30.2-1.1 kubelet=1.30.2-1.1 kubectl=1.30.2-1.1
# 设置 kubelet 服务
#启用并立即启动 kubelet
root@ubuntu2404:~# systemctl enable kubelet --now
此时kubelet服务处于activating,等 kubernetes 安装完成后状态变更为active。
配置相关命令补全
bash
# 配置 crictl 命令自动补全
#创建 bash_completion.d 目录
root@ubuntu2404:~# mkdir /etc/bash_completion.d
#生成 crictl 的 bash 补全脚本
root@ubuntu2404:~# crictl completion bash > /etc/bash_completion.d/crictl
#立即加载补全脚本
root@ubuntu2404:~# source /etc/bash_completion.d/crictl
# 配置 nerdctl 命令自动补全
#生成 nerdctl 的 bash 补全脚本
root@ubuntu2404:~# nerdctl completion bash > /etc/bash_completion.d/nerdctl
#设置 nerdctl 默认命名空间为 k8s.io,否则会用 default 导致 k8s 找不到镜像
root@ubuntu2404:~# echo 'export CONTAINERD_NAMESPACE=k8s.io' >> /etc/bash_completion.d/nerdctl
#加载 nerdctl 补全
root@ubuntu2404:~# source /etc/bash_completion.d/nerdctl
# 配置 kubectl 命令补全
#生成 kubectl 的 bash 补全脚本
root@ubuntu2404:~# kubectl completion bash > /etc/bash_completion.d/kubectl
#加载 kubectl 补全
root@ubuntu2404:~# source /etc/bash_completion.d/kubectl
# 配置 kubeadm 命令补全
#生成 kubeadm 的 bash 补全脚本
root@ubuntu2404:~# kubeadm completion bash > /etc/bash_completion.d/kubeadm
#加载 kubeadm 补全
root@ubuntu2404:~# source /etc/bash_completion.d/kubeadm
注意:此处必须设置变量 CONTAINERD_NAMESPACE ,否则 nerdctl 默认将镜像导入到 default 命名空间,导致 k8s 无法使用镜像。k8s 默认使用 k8s.io 命名空间中镜像。
关闭虚拟机
bash
#关机
root@ubuntu2404:~# init 0
准备节点
bash
### 克隆虚拟机
# 采用完全克隆方法克隆出其他3台虚拟机。
# 3台虚拟机重新设置自己的的主机名和网络。
# master30 节点
#设置 master30 主机名
root@master30:~# hostnamectl set-hostname master30.laoma.cloud
#写入 master30 的静态网络配置
root@master30:~# cat > /etc/netplan/00-static.yaml <<EOF
network:
ethernets:
ens32:
dhcp4: no
addresses:
- 10.1.8.30/24
routes:
- to: default
via: 10.1.8.2
nameservers:
addresses:
- 10.1.8.2
- 223.5.5.5
version: 2
EOF
#应用网络配置
root@master30:~# netplan apply
# worker31 节点
#设置 worker31 主机名
root@worker31:~# hostnamectl set-hostname worker31.laoma.cloud
#写入 worker31 静态网络(10.1.8.31)
root@worker31:~# cat > /etc/netplan/00-static.yaml <<EOF
network:
ethernets:
ens32:
dhcp4: no
addresses:
- 10.1.8.31/24
routes:
- to: default
via: 10.1.8.2
nameservers:
addresses:
- 10.1.8.2
- 223.5.5.5
version: 2
EOF
#应用网络配置
root@worker31:~# netplan apply
# worker32 节点
#设置 worker32 主机名
root@worker32:~# hostnamectl set-hostname worker32.laoma.cloud
#写入 worker32 静态网络(10.1.8.32)
root@worker32:~# cat > /etc/netplan/00-static.yaml <<EOF
network:
ethernets:
ens32:
dhcp4: no
addresses:
- 10.1.8.32/24
routes:
- to: default
via: 10.1.8.2
nameservers:
addresses:
- 10.1.8.2
- 223.5.5.5
version: 2
EOF
#应用网络配置
root@worker32:~# netplan apply
创建集群
下载镜像
在master节点初始化集群过程中,需要下载镜像,这里我们提前下载。
bash
#提前拉取 K8s 1.30.2 所需的全部组件镜像
root@master30:~# kubeadm config images pull --kubernetes-version=v1.30.2
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.30.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.30.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.30.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.30.2
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.11.1
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.12-0
备选方案-使用阿里云仓库镜像:
bash
#通过阿里云镜像仓库拉取 K8s 组件镜像;--image-repository 指定镜像仓库
root@master30:~# kubeadm config images pull --kubernetes-version=v1.30.2 --image-repository registry.aliyuncs.com/google_containers
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.30.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.30.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.30.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.30.2
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.11.1
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.12-0
worker 节点需要kube-proxy和pause镜像:
bash
#worker31 拉取 kube-proxy 镜像
root@worker31:~# nerdctl pull registry.k8s.io/kube-proxy:v1.30.2
#worker31 拉取 pause 镜像
root@worker31:~# nerdctl pull registry.k8s.io/pause:3.9
#worker32 拉取 kube-proxy 镜像
root@worker32:~# nerdctl pull registry.k8s.io/kube-proxy:v1.30.2
#worker32 拉取 pause 镜像
root@worker32:~# nerdctl pull registry.k8s.io/pause:3.9
初始化集群
bash
#初始化控制平面;--kubernetes-version 指定版本、--pod-network-cidr 指定 Pod 网段
root@master30:~# kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16
初始化过程如下:
bash
[init] Using Kubernetes version: v1.30.2
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master30.laoma.cloud] and IPs [10.96.0.1 10.1.8.30]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost master30.laoma.cloud] and IPs [10.1.8.30 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost master30.laoma.cloud] and IPs [10.1.8.30 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "super-admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests"
[kubelet-check] Waiting for a healthy kubelet. This can take up to 4m0s
[kubelet-check] The kubelet is healthy after 502.398615ms
[api-check] Waiting for a healthy API server. This can take up to 4m0s
[api-check] The API server is healthy after 7.50265248s
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node master30.laoma.cloud as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node master30.laoma.cloud as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: ybenal.6mszwb1nf8nck72g
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.1.8.30:6443 --token mi0yt8.1tzza4q64dr8y3pc --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd
选项说明:
- --image-repository registry.aliyuncs.com/google_containers ,指定镜像下载位置
- --kubernetes-version=v1.30.2 ,指定版本
- --pod-network-cidr=10.224.0.0/16 ,指定Pod网络的范围。 Kubernetes支持多种网络方案, 而且不同网络方案对--pod-network-cidr有自己的要求。
- --apiserver-advertise-address 指明用哪个interface与Cluster的其他节点通信。 如果master有多个interface, 建议明确指定, 如果不指定, kubeadm会自动选择有默认网关的interface。
初始化过程说明:
- kubeadm执行初始化前的检查。
- 下载组件的Docker镜像。 这一步可能会花一些时间, 主要取决于网络质量。
- 生成token和证书。
- 生成KubeConfig文件, kubelet需要用这个文件与master通信。
- 安装master组件。
- 安装附加组件kube-proxy和CoreDNS。
- Kubernetes master初始化成功。
- 提示如何配置kubectl。
- 提示如何安装Pod网络。
- 提示如何注册其他节点到Cluster。
备选方案-使用阿里云仓库镜像初始化集群:
bash
#使用阿里云镜像仓库初始化集群,避免拉取镜像失败
root@master30:~# kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16 --image-repository registry.aliyuncs.com/google_containers
配置集群
配置凭据
- kubectl默认使用~/.kube/config文件中凭据信息管理kubernetes。
bash
#创建 .kube 目录
root@master30:~# mkdir -p $HOME/.kube
#把 admin.conf 复制为默认 config
root@master30:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- 如果环境变量KUBECONFIG存在,则优先使用境变量KUBECONFIG设置的值。
bash
#把 config 移到当前目录用于演示
root@master30:~# mv .kube/config .
#设置 KUBECONFIG 环境变量指向凭据文件
root@master30:~# export KUBECONFIG=/root/config
#查看节点(此时网络未就绪显示 NotReady)
root@master30:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master30.laoma.cloud NotReady control-plane,master 5m2s v1.28.2
# 等网络配置完成后,STATUS状态由NotReady变更为Ready
- 还可以通过选项--kubeconfig='' 明确指定凭据文件位置。
bash
#通过 --kubeconfig 明确指定凭据文件
root@master30:~# kubectl get nodes --kubeconfig /root/config
kubernetes对凭据文件名没有要求。
bash
#把 config 改名为 kube.conf
root@master30:~# mv config kube.conf
#用改名后的 kube.conf 作为凭据
root@master30:~# kubectl get nodes --kubeconfig kube.conf
- 恢复使用默认位置~/.kube/config
bash
#取消 KUBECONFIG 环境变量
root@master30:~# unset KUBECONFIG
#把 kube.conf 移回 .kube/config
root@master30:~# mv kube.conf .kube/config
部署网络
这里采用 calico 网络。
官方地址:http://projectcalico.org 或者 https://www.tigera.io/project-calico/
产品文档:https://projectcalico.docs.tigera.io/about/about-calico
项目地址:https://github.com/projectcalico/calico(提供镜像)
下载 calico 配置
bash
#从 GitHub 下载 calico 部署清单;--no-check-certificate 跳过证书校验
root@master30:~# wget --no-check-certificate https://raw.githubusercontent.com/projectcalico/calico/v3.30.7/manifests/calico.yaml
# 从内网下载
#从内网地址下载 calico 配置并命名为 calico.yaml;-O 指定保存文件名
root@master30:~# wget http://192.168.46.200/class/course-materials/softwares/stage03/calico-3.30.7.yaml -O calico.yaml
修改 pod 网络
bash
# 查看集群 pod 网络范围
#查看 kubeadm-config 中的 podSubnet;-o yaml 输出 yaml、grep 过滤
root@master30:~# kubectl get cm -n kube-system kubeadm-config -o yaml|grep podSubnet
podSubnet: 10.224.0.0/16
# 更改 calico.yml,确保 CALICO_IPV4POOL_CIDR 与集群初始化的pod网络一致。
#取消 CALICO_IPV4POOL_CIDR 环境变量的注释
root@master30:~# sed -i "s|# - name: CALICO_IPV4POOL_CIDR|- name: CALICO_IPV4POOL_CIDR|g" calico.yaml
#把 CIDR 值改为 10.224.0.0/16
root@master30:~# sed -i "s|# value: \"192.*| value: \"10.224.0.0/16\"|g" calico.yaml
下载镜像
bash
#查看 calico.yaml 中用到的镜像并去重
root@master30:~# grep image: calico.yaml | uniq
image: docker.io/calico/cni:v3.30.7
image: docker.io/calico/node:v3.30.7
image: docker.io/calico/kube-controllers:v3.30.7
# 所有节点下载以上镜像
#拉取 calico cni 镜像
root@all-node:~# nerdctl pull docker.io/calico/cni:v3.30.7
#拉取 calico node 镜像
root@all-node:~# nerdctl pull docker.io/calico/node:v3.30.7
#拉取 calico kube-controllers 镜像
root@all-node:~# nerdctl pull docker.io/calico/kube-controllers:v3.30.7
#也可从本地下载
root@all-node:~# nerdctl pull hub.laoma.cloud/calico/cni:v3.30.7
root@all-node:~# nerdctl pull hub.laoma.cloud/calico/node:v3.30.7
root@all-node:~# nerdctl pull hub.laoma.cloud/calico/kube-controllers:v3.30.7
root@all-node:~# nerdctl pull docker.io/calico/cni:v3.30.7
root@all-node:~# nerdctl pull docker.io/calico/node:v3.30.7
root@all-node:~# nerdctl pull docker.io/calico/kube-controllers:v3.30.7
部署 calico 网络
bash
#应用 calico 清单部署网络
root@master30:~# kubectl apply -f calico.yaml
验证部署
bash
#查看所有命名空间的 Pod 状态;--all-namespaces 查看所有 ns
root@master30:~# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-56fcbf9d6b-v6qsn 1/1 Running 0 28m
kube-system calico-node-vc9v6 1/1 Running 0 28m
kube-system coredns-6d8c4cb4d-9qdxg 1/1 Running 0 43m
kube-system coredns-6d8c4cb4d-wwfmx 1/1 Running 0 43m
kube-system etcd-master30.laoma.cloud 1/1 Running 0 43m
kube-system kube-apiserver-master30.laoma.cloud 1/1 Running 0 43m
kube-system kube-controller-manager-master30.laoma.cloud 1/1 Running 0 43m
kube-system kube-proxy-8b7tn 1/1 Running 0 43m
kube-system kube-scheduler-master30.laoma.cloud 1/1 Running 0 43m
节点加入集群
bash
# 节点 worker31 加入集群
#worker31 执行 join,通过 token 和 CA 证书哈希加入
root@worker31:~# kubeadm join 10.1.8.30:6443 --token mi0yt8.1tzza4q64dr8y3pc --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd
[preflight] Running pre-flight checks
[WARNING SystemVerification]: missing optional cgroups: blkio
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
# 节点 worker32 加入集群
#worker32 执行 join
root@worker32:~# kubeadm join 10.1.8.30:6443 --token mi0yt8.1tzza4q64dr8y3pc --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd
如果没有保存初始化界面中加入集群命令,可以通过以下命令获取加入集群命令:
bash
#重新生成并打印 join 命令;--print-join-command 输出完整加入命令
root@master30:~# kubeadm token create --print-join-command
kubeadm join 10.1.8.30:6443 --token dzpuca.8lqxqqydwskroabx --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd
验证部署
bash
# 查看集群信息
#查看集群控制平面和 CoreDNS 访问地址
root@master30:~# kubectl cluster-info
Kubernetes control plane is running at https://10.1.8.30:6443
CoreDNS is running at https://10.1.8.30:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
# 查看版本
#查看客户端和服务端版本
root@master30:~# kubectl version
Client Version: v1.30.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.2
# 查看节点状态
#查看所有节点是否 Ready
root@master30:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master30.laoma.cloud Ready control-plane 9h v1.30.2
worker31.laoma.cloud Ready <none> 8h v1.30.2
worker32.laoma.cloud Ready <none> 8h v1.30.2
节点的状态为 Ready,必须满足以下条件:
- 网络配置完成
- 节点启动 kubelet 服务
- swap 关闭
- SELinux 关闭
bash
# 查看 pod 状态
#查看所有命名空间的 Pod 运行情况;-A 等同于 --all-namespaces
root@master30:~# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-7cb4fd5784-jx2xl 1/1 Running 0 11m
kube-system calico-node-4b6s8 1/1 Running 0 11m
kube-system calico-node-bsr7v 1/1 Running 0 11m
kube-system calico-node-v8jdn 1/1 Running 0 11m
kube-system coredns-66f779496c-4j88h 1/1 Running 0 13m
kube-system coredns-66f779496c-fnb8m 1/1 Running 0 13m
kube-system etcd-master30.laoma.cloud 1/1 Running 0 13m
kube-system kube-apiserver-master30.laoma.cloud 1/1 Running 0 13m
kube-system kube-controller-manager-master30.laoma.cloud 1/1 Running 0 13m
kube-system kube-proxy-27vl2 1/1 Running 0 11m
kube-system kube-proxy-npv9h 1/1 Running 0 11m
kube-system kube-proxy-q2qrs 1/1 Running 0 11m
kube-system kube-scheduler-master30.laoma.cloud 1/1 Running 0 13m