系统 2026-06-11

Kubernetes平台搭建

阅读次数 19 评论数 0

准备工作

在开始前,请确保你的环境满足以下基本条件:

项目

要求与说明

操作系统

Debian 12 (Bookworm)/Ubuntu/Centos

硬件配置

每台机器至少 2核CPU2GB内存20GB磁盘空间

节点规划

至少准备2台机器(或虚拟机)。一台作为控制平面(master),一台或多台作为工作节点(worker)。

网络

所有节点之间网络互通,且能够访问外以下载镜像。

权限

拥有 sudo 权限。

第一步:所有节点的通用配置

*这部分操作需要在每一台机器(包括 master 和所有 worker)上执行

1.设置主机名并更新hosts文件

# 设置主机名(分别在对应节点上执行)

sudo hostnamectl set-hostname <your-hostname> # 例如:k8s-master, k8s-node1

# 编辑 /etc/hosts 文件,将所有节点的IP和主机名添加进去

sudo tee -a /etc/hosts <<EOF

<master-ip> k8s-master

<node1-ip> k8s-node1

EOF

2.禁用Swap分区

*Kubernetes要求禁用Swap以保证调度和资源管理的稳定性

#临时禁用

sudo swapoff -a

# 永久禁用:注释掉 /etc/fstab 中包含 'swap' 的行

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

3.加载内核模块并配置网络参数

*加载 overlaybr_netfilter 模块,并配置内核参数以允许iptables桥接IPv4/6流量

# 加载必要内核模块

sudo tee /etc/modules-load.d/k8s.conf <<EOF

overlay

br_netfilter

EOF

sudo modprobe overlay

sudo modprobe br_netfilter

# 配置系统参数

sudo tee /etc/sysctl.d/99-kubernetes.conf <<EOF

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

net.bridge.bridge-nf-call-ip6tables = 1

EOF

sudo sysctl --system

4.安装容器运行时(推荐 containerd)

*Kubernetes需要容器运行时来运行Pod。containerd 是当前最主流、性能最好的选择

# 安装 containerd

sudo apt update

sudo apt install -y containerd

# 生成默认配置文件

sudo mkdir -p /etc/containerd

containerd config default | sudo tee /etc/containerd/config.toml

# 关键一步:修改配置,使用 systemd 作为 cgroup 驱动,这是 Debian 等系统的标准

sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# 重启 containerd 服务

sudo systemctl restart containerd

sudo systemctl enable containerd

5.安装 kubeadm, kubelet, kubectl

*使用官方APT仓库安装这三个核心组件

sudo apt update

sudo apt install -y apt-transport-https ca-certificates curl gnupg

下载 Google Cloud 的公开签名密钥

# 如果有,删除可能配置错误的旧源列表文件

#rm -f /etc/apt/sources.list.d/kubernetes.list

# 如果存在旧版 apt-key 添加的密钥,删除它(可选)

#apt-key list | grep -i kubernetes && apt-key del <旧密钥ID>

创建必要的目录并添加正确的源和密钥

# 1. 创建 keyrings 目录(这步很重要,很多报错都源于此)

mkdir -p -m 755 /etc/apt/keyrings

# 2. 下载并添加官方 GPG 密钥(以 v1.28 版本为例)

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 3. 添加 Kubernetes 软件源

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list

更新并安装

sudo apt update

sudo apt install -y kubelet kubeadm kubectl

# 锁定版本,防止意外更新

sudo apt-mark hold kubelet kubeadm kubectl

第二步:初始化集群 (仅在控制平面节点执行)

1.初始化控制平面

*初始化,但为了加速,可以使用国内镜像仓库

kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

初始化成功后,你会在终端末尾看到类似这样的输出,请务必完整保存,这是让工作节点加入集群的命令。

##kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>##

你应该会看到类似这样的输出:
Your Kubernetes control-plane has been 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

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

kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

2.配置kubectl

*为了让普通用户可以管理集群,执行以下命令

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.安装Pod网络插件

*网络插件是必须的,它负责Pod之间的网络通信。这里以 Flannel 为例,它简单易用

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

第三步:加入工作节点 (在每个工作节点执行)

  1. 登录到每一台工作节点。

  2. 运行你在 Master 节点初始化完成后保存的那条 kubeadm join 命令

sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

使用命令:kubectl get nodes查看节点状态

第四步:Kubernetes 组件开机自启配置

核心组件自启状态

安装后默认已启用自启的服务:

# 检查服务状态

systemctl is-enabled containerd # 应该显示 enabled

systemctl is-enabled kubelet # 应该显示 enabled

systemctl is-enabled docker # 如果安装了 docker

验证自启配置

# 查看所有 K8s 相关服务的自启状态

systemctl list-unit-files | grep -E "containerd|kubelet|docker" | grep enabled

如果某个服务未启用自启

# 启用 containerd 开机自启

systemctl enable containerd

# 启用 kubelet 开机自启

systemctl enable kubelet

# 启用 docker(如果使用)

systemctl enable docker

创建自定义自启脚本(可选)

# 创建自启脚本

cat > /etc/systemd/system/k8s-startup.service << 'EOF'

[Unit]

Description=Kubernetes Startup Tasks

After=network.target containerd.service kubelet.service

Wants=containerd.service kubelet.service

[Service]

Type=oneshot

ExecStart=/usr/local/bin/k8s-startup.sh

RemainAfterExit=yes

[Install]

WantedBy=multi-user.target

EOF

# 创建启动脚本

cat > /usr/local/bin/k8s-startup.sh << 'EOF'

#!/bin/bash

# 等待 containerd 就绪

sleep 10

# 重启 kubelet 确保连接

systemctl restart kubelet

# 等待网络插件就绪

sleep 30

EOF

chmod +x /usr/local/bin/k8s-startup.sh

# 启用服务

systemctl daemon-reload

systemctl enable k8s-startup.service

验证自启配置

# 重启测试

reboot

# 重启后检查

systemctl status containerd kubelet

kubectl get nodes

第五步:一键检查脚本

#!/bin/bash

# k8s-health-check.sh - K8s 集群健康检查

echo "========================================="

echo "Kubernetes 集群健康检查"

echo "========================================="

echo -e "\n1. 服务自启状态:"

systemctl is-enabled containerd && echo "✓ containerd: enabled" || echo "✗ containerd: disabled"

systemctl is-enabled kubelet && echo "✓ kubelet: enabled" || echo "✗ kubelet: disabled"

echo -e "\n2. 服务运行状态:"

systemctl is-active containerd && echo "✓ containerd: running" || echo "✗ containerd: not running"

systemctl is-active kubelet && echo "✓ kubelet: running" || echo "✗ kubelet: not running"

echo -e "\n3. 集群节点状态:"

kubectl get nodes 2>/dev/null || echo "无法获取节点状态"

echo -e "\n4. Dashboard 状态:"

kubectl get pods -n kubernetes-dashboard 2>/dev/null | grep -v NAME | head -3

echo -e "\n5. Dashboard 访问信息:"

IP=$(hostname -I | awk '{print $1}')

PORT=$(kubectl get svc -n kubernetes-dashboard kubernetes-dashboard-kong-proxy -o jsonpath='{.spec.ports[0].nodePort}' 2>/dev/null)

if [ -n "$PORT" ]; then

echo "访问地址: https://${IP}:${PORT}"

else

echo "Dashboard 未配置 NodePort"

fi

echo -e "\n========================================="

echo "检查完成!"

echo "========================================="

第六步:日常维护命令速查

操作

命令

检查集群状态

kubectl get nodes

查看所有 Pod

kubectl get pods --all-namespaces

重启 kubelet

systemctl restart kubelet

重启 containerd

systemctl restart containerd

获取 Dashboard Token

kubectl -n kubernetes-dashboard create token admin-user

查看 Dashboard 端口

kubectl get svc -n kubernetes-dashboard

查看系统日志

journalctl -u kubelet -n 50

第七步:故障排查

K8s集群故障排查详细过程请点击下方跳转>>>> K8s集群故障排查

K8s拉取镜像故障排查详细过程请点击下方跳转>>>> K8s拉取镜像故障排查

K8sweb页面访问故障排查详细过程请点击下方跳转>>>> K8s页面访问故障排查

0%