Kubernetes 安装保姆级:关 swap、装 containerd、init 集群、calico 一篇通

文章目录

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。

初始化过程说明:

  1. kubeadm执行初始化前的检查。
  2. 下载组件的Docker镜像。 这一步可能会花一些时间, 主要取决于网络质量。
  3. 生成token和证书。
  4. 生成KubeConfig文件, kubelet需要用这个文件与master通信。
  5. 安装master组件。
  6. 安装附加组件kube-proxy和CoreDNS。
  7. Kubernetes master初始化成功。
  8. 提示如何配置kubectl。
  9. 提示如何安装Pod网络。
  10. 提示如何注册其他节点到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

配置集群

配置凭据

  1. 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
  1. 如果环境变量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
  1. 还可以通过选项--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
  1. 恢复使用默认位置~/.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
相关推荐
木雷坞1 小时前
Docker Compose部署Metabase:应用库隔离与日期筛选看板
运维·docker·容器
怒放的生命19911 小时前
前端项目 Docker 打包实操指南
前端·docker·容器
tedcloud1231 小时前
Docker Compose 部署 Immich:手机照片自动备份与常见故障排查
运维·前端·docker·容器·智能手机·开源·流程图
古城小栈1 小时前
Docker Compose 云原生的底座
docker·云原生·容器
卜锦元2 小时前
Docker Compose 部署 Nginx 1.30.6 完整指南
nginx·docker·容器
easy_coder3 小时前
Kubernetes 三大探针:Startup、Liveness 与 Readiness
云原生·容器·kubernetes
刘胡子大叔3 小时前
Docker 容器名 ping 不通
运维·docker·容器
a5986524 小时前
Docker多开云手机,六边云独立端口隔离访问实战
android·运维·docker·容器·智能手机·云手机
暖核5 小时前
kubeadm 搭建 K8s v1.30 集群:从系统模板到 Calico 网络全流程
网络·容器·kubernetes