Linux 系统安装部署 Kubernetes 教程
本教程基于 Ubuntu / Debian / CentOS 等常见 Linux 发行版,介绍如何使用 kubeadm 快速部署一个 Kubernetes 集群。默认以 Ubuntu 22.04 / 24.04 为例,CentOS 也可参考相同流程。
一、环境准备
1. 节点规划
建议至少准备 3 台服务器:
- 1 台 Master 节点:k8s-master
- 2 台 Worker 节点:k8s-worker-1、k8s-worker-2
示例 IP:
- 192.168.1.10 k8s-master
- 192.168.1.11 k8s-worker-1
- 192.168.1.12 k8s-worker-2
2. 硬件要求
- CPU:2 核以上
- 内存:4 GB 以上
- 磁盘:20 GB 以上
- 网络:节点之间可以互相访问
3. 主机名与 hosts 配置
在所有节点执行:
hostnamectl set-hostname k8s-master
worker 节点分别设置为:
hostnamectl set-hostname k8s-worker-1
hostnamectl set-hostname k8s-worker-2
编辑 hosts:
vim /etc/hosts
添加:
192.168.1.10 k8s-master
192.168.1.11 k8s-worker-1
192.168.1.12 k8s-worker-2
二、所有节点执行基础配置
以下操作需要在每台服务器上执行,包括 Master 和 Worker。
1. 更新系统
Ubuntu:
apt update
apt upgrade -y
CentOS:
yum update -y
2. 关闭 swap
临时关闭:
swapoff -a
永久关闭:
sed -i '/ swap / s/^\(.*\)$/\#\1/g' /etc/fstab
检查:
free -h
如果 Swap 显示 0,说明关闭成功。
3. 关闭防火墙
生产环境建议精细放行端口,测试环境可直接关闭。
Ubuntu:
systemctl disable --now ufw
CentOS:
systemctl stop firewalld
systemctl disable firewalld
4. 时间同步
安装 chrony:
apt install -y chrony
启动:
systemctl enable --now chrony
检查时间同步:
chronyc sources
三、配置内核模块
Kubernetes 需要加载 overlay 和 br_netfilter 模块。
创建配置文件:
vim /etc/modules-load.d/k8s.conf
内容:
overlay
br_netfilter
加载模块:
modprobe overlay
modprobe br_netfilter
检查模块:
lsmod | grep overlay
lsmod | grep br_netfilter
四、配置 sysctl 网络参数
创建配置文件:
vim /etc/sysctl.d/k8s.conf
内容:
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
生效配置:
sysctl --system
检查:
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.ipv4.ip_forward
五、安装 containerd
Kubernetes 推荐使用 containerd 作为容器运行时。
1. 安装依赖
Ubuntu:
apt update
apt install -y ca-certificates curl gnupg
2. 添加 Docker 仓库
因为 containerd 通常可以通过 Docker 仓库安装。
创建 keyring 目录:
install -m 0755 -d /etc/apt/keyrings
导入 GPG Key:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
设置权限:
chmod a+r /etc/apt/keyrings/docker.gpg
添加仓库:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
3. 安装 containerd
更新仓库:
apt update
安装:
apt install -y containerd.io
4. 配置 containerd
生成默认配置:
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
修改 SystemdCgroup:
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
检查:
grep SystemdCgroup /etc/containerd/config.toml
输出应类似:
SystemdCgroup = true
5. 启动 containerd
systemctl enable --now containerd
检查状态:
systemctl status containerd
六、安装 crictl
crictl 是 Kubernetes CRI 接口调试工具。
下载:
VERSION="v1.28.0"
curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz -o crictl.tar.gz
解压:
tar zxvf crictl.tar.gz -C /usr/local/bin
配置 crictl:
vim /etc/crictl.yaml
内容:
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 2
七、安装 kubeadm、kubelet、kubectl
1. 添加 Kubernetes 仓库
Ubuntu 可执行:
apt-get update
apt-get install -y apt-transport-https ca-certificates curl gpg
下载 Kubernetes GPG Key:
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
添加 apt 源:
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /" > /etc/apt/sources.list.d/kubernetes.list
2. 安装组件
更新:
apt-get update
安装:
apt-get install -y kubelet kubeadm kubectl
3. 锁定版本
防止 Kubernetes 组件被意外升级:
apt-mark hold kubelet kubeadm kubectl
4. 启动 kubelet
systemctl enable --now kubelet
八、初始化 Master 节点
以下操作只在 Master 节点执行。
1. 查看镜像仓库
如果需要指定镜像源,可以查看默认镜像:
kubeadm config images list
如果国内网络访问 Kubernetes 镜像较慢,可考虑使用国内镜像仓库,或者提前使用 docker 或 containerd 拉取并重打标签。
2. 初始化集群
执行:
kubeadm init --pod-network-cidr=10.244.0.0/16
如果希望指定 CNI 为 Calico,常见 CIDR 可写:
kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.1.10
这里 192.168.1.10 为 Master 节点 IP。
3. 配置 kubectl
初始化成功后,按提示执行:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
验证:
kubectl get nodes
4. 保存 join 命令
初始化完成后,终端会输出类似命令:
kubeadm join 192.168.1.10:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
请妥善保存,后续 Worker 节点加入需要用到。
如果忘记,可重新生成:
kubeadm token create --print-join-command
九、安装网络插件 Calico
Kubernetes 必须安装 CNI 网络插件,否则节点状态会显示 NotReady。
1. 下载 Calico Manifest
curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml -o calico.yaml
如果你初始化时使用了:
kubeadm init --pod-network-cidr=192.168.0.0/16
则 Calico 默认 IP Pool 可能可用。如果初始化使用的是 10.244.0.0/16,可以修改 calico.yaml 中的 CALICO_IPV4POOL_CIDR。
搜索:
vim calico.yaml
找到类似:
- name: CALICO_IPV4POOL_CIDR
value: 192.168.0.0/16
改为:
- name: CALICO_IPV4POOL_CIDR
value: 10.244.0.0/16
2. 安装 Calico
kubectl apply -f calico.yaml
3. 查看网络插件 Pod
kubectl get pods -n kube-system
等待 Calico Pod 状态变为 Running。
4. 查看节点状态
kubectl get nodes
正常应显示:
STATUS Ready
十、Worker 节点加入集群
在每台 Worker 节点上执行 Master 初始化时输出的 join 命令。
示例:
kubeadm join 192.168.1.10:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
加入成功后,在 Master 查看:
kubectl get nodes
应能看到所有节点。
十一、部署 Nginx 测试应用
创建一个 Deployment:
kubectl create deployment nginx --image=nginx:alpine --replicas=2
暴露端口:
kubectl expose deployment nginx --port=80 --type=NodePort
查看服务:
kubectl get svc
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.96.0.123 <none> 80:31234/TCP 10s
浏览器访问:
http://192.168.1.11:31234
或任意节点 IP + NodePort。
十二、常用 kubectl 命令
1. 查看节点
kubectl get nodes -o wide
2. 查看所有 Pod
kubectl get pods -A
3. 查看命名空间
kubectl get namespaces
4. 查看 Deployment
kubectl get deploy -n default
5. 查看服务
kubectl get svc -n default
6. 进入 Pod
kubectl exec -it nginx-pod-name -- sh
7. 查看 Pod 日志
kubectl logs nginx-pod-name
十三、集群常见问题
1. 节点长期 NotReady
常见原因是未安装 CNI 网络插件,或 CNI 的 Pod CIDR 与 kubeadm init 时配置不一致。
检查:
kubectl get nodes
查看 kube-system Pod:
kubectl get pods -n kube-system
如果 Calico Pod 不 Running,查看日志:
kubectl logs -n kube-system calico-node-xxxxx
2. kubeadm init 失败
可重置:
kubeadm reset -f
清理网络:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
rm -rf /etc/cni/net.d
重新初始化:
kubeadm init --pod-network-cidr=192.168.0.0/16
3. containerd 拉取镜像失败
如果需要使用镜像加速器,可修改 containerd 配置。
vim /etc/containerd/config.toml
确认:
SystemdCgroup = true
重启 containerd:
systemctl restart containerd
查看 runtime:
crictl info
十四、总结
部署 Kubernetes 的核心步骤可以归纳为:
- 所有节点配置主机名、hosts、时间同步、关闭 swap。
- 配置内核模块和 sysctl 网络参数。
- 安装并配置 containerd 和 crictl。
- 安装 kubeadm、kubelet、kubectl。
- 使用 kubeadm init 初始化 Master。
- 配置 kubectl。
- 安装 Calico 或其他 CNI 网络插件。
- Worker 节点通过 kubeadm join 加入集群。
- 使用 Deployment 和 Service 验证集群可用性。
至此,一个基础的 Linux Kubernetes 集群就部署完成了。生产环境中还需要根据实际需求考虑高可用控制平面、证书备份、日志监控、存储方案、RBAC 权限、网络策略以及私有镜像仓库等配置。