现在运维都说——要上 Kubernetes,才能跟上时代脚步。”听上去很厉害,可真要动手时却傻眼了:网上各种教程,看不懂到底安装哪些组件?一头雾水:“Docker 都还没学精,哪里还会 Kubernetes 的那些kube-apiserver、kube-scheduler、kube-controller-manager……还听说新版不推荐 Docker,还要装 Containerd。我怕半路命令报错,又怕只学一堆概念不会用,还容易搭坏集群。
如果你跟我一样,从 Docker 切换到 Kubernetes,总觉得组件太多、名词太乱,连“在哪里执行命令”“哪个组件干什么”都搞不清楚,那本文正适合你:我们从“最基础的环境准备”开始,一步一步讲清楚每个组件的作用、相互关系,以及如何在 AlmaLinux 三台服务器(master、node1、node2)上用 Containerd 拉镜像、安装 kubeadm/kubelet/kubectl,验证命令是否可用,如果报错“未找到命令”怎么办,都用最白话的例子来说明。拿起手机,慢慢跟着做,保证你能在国内互联网环境下,一点点把 Kubernetes 的基础打牢,然后再慢慢学习下一章单独拆解每个组件,逐一贯通。
先用大白话让你对 Kubernetes 的主要组件有个整体印象,不用背一堆名词,先理解“它们之间为什么要存在”以及“彼此之间如何沟通”。
从 Docker 容器运维的角度来说,当你只有几个容器时,直接在宿主机(或几台机器)docker run
就 OK。但真到了生产环境,你往往会有几十、上百个服务容器要管理,还要保证容器能自动重启、自动调度、跨机负载均衡、安全隔离、健康检查、自动扩容缩容(Scale Up/Down)、升级回滚……光是 docker run --restart=always
远远不够,还要自己写一堆bash
脚本或者用第三方工具。
Kubernetes 出现后,它把容器编排(Container Orchestration)的思路“固定住”了:
Kubernetes 有很多组件,我们先列出最核心的几类,并用简单比喻把它们串联起来。假设你开了家 “容器托管厂”,每一台服务器就是一个 “机房”,里面可以放很多 “机架”(Node)。你要把“容器”放到这些机架里才可以运行。
kubectl create deployment nginx
时,最终会向 kube-apiserver 发起一个 HTTP 请求,告诉它“我要部署 nginx 这个容器”。kubectl get nodes
、kubectl apply -f nginx-deployment.yaml
,它就会向 kube-apiserver 发送请求,获取集群状态或提交新配置。在真正踏上 Kubernetes 路之前,先把你的三台 AlmaLinux(master、node1、node2)服务器准备好。我们将按如下步骤操作:
下面我们来逐条走完,确保你能在国内网络环境下顺利拉取镜像、安装各组件,并在遇到“命令不存在”时知道如何解决。
执行场景:在三台服务器(master/node1/node2)Shell 终端
# 登录到 master
ssh root@master.example.com
# 登录成功后,查看系统信息
cat /etc/almalinux-release
# 期望输出:AlmaLinux release 8.x (可能是 8.5、8.7 等)
Kubernetes 各组件之间会频繁通信,如果防火墙或 SELinux 策略过于严格,会导致各组件无法互相访问。为了演示的简便,这里我们先关闭防火墙和 SELinux,做好环境准备。生产环境可参考官方文档做更细粒度的放行策略。
执行场景:在各服务器 Shell 终端
# 停止 firewalld 服务
sudo systemctl stop firewalld
# 禁用开机启动
sudo systemctl disable firewalld
# 确认状态
sudo systemctl status firewalld
# 看到 Active: inactive (dead),说明已关闭
执行场景:在各服务器 Shell 终端
# 临时关闭
sudo setenforce
# 永久关闭,编辑 /etc/selinux/config
sudovim /etc/selinux/config
# 将 SELINUX=enforcing 改为 SELINUX=disabled
# 保存并退出
# 重启服务器后生效
sudoreboot
重启后,再次运行 getenforce
,应输出 Disabled
。
命令不存在排查:
systemctl stop firewalld
时提示 bash: systemctl: 未找到命令
,可能是当前用户无 sudo 权限,或者操作系统没有安装 systemd。一般 AlmaLinux 系统默认都有 systemd。setenforce
未找到,说明 SELinux 工具未安装或系统环境异常。可以先安装:
sudo yum install-y policycoreutils
然后再执行 setenforce 0
。在 Kubernetes 1.20 之后,官方不再把 Docker Engine 作为首选运行时,推荐使用 Containerd 或 CRI-O。Containerd 集成在 Docker 里,但我们直接安装 Containerd 来作为 CRI(Container Runtime Interface)。下面步骤会详细演示如何在 AlmaLinux 8 上安装和配置 Containerd。
执行场景:在各节点(master/node1/node2)Shell 终端
安装依赖
sudo yum install-y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install-y containerd.io
containerd.io
包含了 containerd 及其 CLI。N/S
(no package available),先运行 sudo yum makecache
更新本地缓存,或手动从 GitHub Release 下载 RPM。sudo systemctl start containerd
sudo systemctl enable containerd
sudo systemctl status containerd
# 期望看到
# Active: active (running)
命令不存在排查:
yum-config-manager
未找到,可先安装 yum-utils
(已在上面第1步示例中体现)。containerd.io
包未找到,确认你添加了 Docker CE 官方仓库,或在国内环境下,可以通过阿里云或中科大镜像站点加速:
# 编辑 /etc/yum.repos.d/docker-ce.repo,把所有 mirrorlist 或 baseurl 替换为阿里云镜像对应的 URL
systemctl start containerd
报错,可以查看日志:
journalctl -u containerd -n --no-pager
根据提示解决,比如缺少依赖、权限问题、SELinux 未关闭等。默认安装后,containerd 在 /etc/containerd/config.toml
没有生成,需要手动containerd config default > /etc/containerd/config.toml
并调整以下几点:
/etc/containerd/config.toml
,在 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
段下添加加速地址:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint=["https://registry.docker-cn.com","https://mirror.ccs.tencentyun.com"]
sudo systemctl restart containerd
containerd --version
crictl info
然后再 crictl info
,如果能看到 containerd 的配置信息,说明 CRI 配置正常。
crictl
是一个命令行工具,用来验证 CRI 兼容性。若报错没有安装 crictl
,可以执行:
VERSION="1.25.0"
sudocurl-L-o /usr/local/bin/crictl "https://github.com/kubernetes-sigs/cri-tools/releases/download/v${VERSION}/crictl-v${VERSION}-linux-amd64.tar.gz"
sudotar zxvf /usr/local/bin/crictl -C /usr/local/bin
sudochmod +x /usr/local/bin/crictl
containerd containerd.io 1.5.x
Kubernetes 官方推荐使用 kubeadm
来快速搭建集群,kubelet
是运行在每个 Node 上的守护进程,负责接收控制平面分配的 Pod 任务;kubectl
是客户端工具,用来和 kube-apiserver 对话。下面来安装这些工具。
执行场景:在三台服务器(master/node1/node2) Shell 终端
cat<<EOF|sudotee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
# 阿里云镜像 GPG 公钥
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
kubeadm
安装时因为网络原因拉不到包。命令不存在排查:
tee
未找到,执行 sudo yum install -y coreutils
;yum
、curl
、tee
都异常,说明系统基础环境严重缺失,需要先恢复或重装 AlmaLinux。执行场景:在三台节点(master/node1/node2)Shell 终端
sudo yum install-y kubelet kubeadm kubectl --disableexcludes=kubernetes
--disableexcludes=kubernetes
:确保安装时优先使用我们配置的 Kubernetes 仓库,而不是其他默认仓库。sudo yum clean all && sudo yum makecache
更新缓存;安装完成后,需要启动并设置 kubelet 在开机时自启(后续只有 kubelet 在运行,才能把 Node 注册到 kube-apiserver):
sudo systemctl enable--now kubelet
运行后 systemctl status kubelet
,如果状态是 active (running)
,说明安装成功。若有报错,可查看 journalctl -u kubelet -n 50 --no-pager
获取详细日志,再手动排查。
常见报错及排查:
yum list kubelet --showduplicates
看可用版本,然后 yum install -y kubelet-<version>
;sudo yum install -y epel-release
,再 yum install -y kubelet
;到此为止,你应该在三台服务器上都成功安装好了 containerd、kubeadm、kubelet、kubectl。下面要一步步验证它们是否可用,以及它们之间的基础网络是否打通。
执行场景:在三台节点 Shell 终端
# 检查 containerd 服务
sudo systemctl status containerd
# 版本信息
containerd --version
# 查看网络配置是否正确
crictl info
systemctl status containerd
要显示 active (running)
;containerd --version
应该能输出版本号,如 containerd containerd.io 1.5.x
;crictl info
会输出类似 “Status: RuntimeReady” 等信息,若看到 RuntimeName: containerd
,说明 CRI 接口正常。如果 crictl
未安装,把 crictl
二进制下载到 /usr/local/bin/
并赋可执行权限。
在 master 节点执行以下命令,验证 kubelet 是否正常运行,以及 Kubernetes 版本和模块是否可用:
# kubelet 状态
sudo systemctl status kubelet
# 查看 kubeadm 版本
kubeadm version
# 查看 kubectl 版本
kubectl version --client
# 查看 kubelet 版本
kubelet --version
kubeadm version
报 command not found
,请先确认 /usr/bin/kubeadm
是否存在;kubelet --version
报错 “permission denied”,可尝试 sudo kubelet --version
;但通常版本信息不需要 root 也能查看。确保三台机器之间端口可以互通,尤其是 Kubernetes 默认使用一些特定端口。以下示例在 master 节点检查到 node1、node2 的连通性,同理在 node1、node2 检查到 master。
执行场景:在 master Shell 终端
# 检查与 node1 的连通性
ping-c node1
ping-c192.168.1.11
# 检查目标端口(例如 6443,默认 kube-apiserver 端口)
# 如果此时还没启动 kube-apiserver,这个端口不通也是正常的,重点是 NetworkReachable
telnet node1 # 部分系统可能没有 telnet,可安装 by: sudo yum install -y telnet
# 或者使用 ss/netstat 查看 22 端口是否监听
ss -tunlp|grep":22"
Destination Host Unreachable
,说明网络不通,需要检查防火墙、网卡配置、VLAN 等;命令不存在排查:
ping
未找到,可先安装 iputils
:
sudo yum install-y iputils
ss
报错未找到,可 sudo yum install -y iproute
;telnet
,也可用 nc -zv node1 22
检查端口连通。若没有 nc
,可以:
sudo yum install-y nmap-ncat
到目前为止,你已经在三台 AlmaLinux 服务器(master、node1、node2)上完成了以下准备工作:
master
、node1
、node2
,并通过 /etc/hosts
让三台服务器能用主机名互相 Ping 通。kubeadm
、kubelet
、kubectl
,并启动 kubelet
服务,验证它们的版本和状态。这相当于给 Kubernetes 架构搭好了 “地基”:Containerd 是容器执行的“引擎”,kubelet 是节点级别的“司机”,kubeadm 是集群初始化的“施工队”,kubectl 是操作的“对讲机”。明天,我们就可以动手使用 kubeadm init
在 master 上真正启动 Kubernetes 控制平面,Node 加入集群,体验“集群就绪→部署应用” 的全流程。
下一篇我们将从 控制平面开始,拆解并实战验证以下核心组件: