K8S(二)—— K8S 1.28 集群部署指南(kubeadm 方式)

文章目录

  • 前言
  • [一、K8s 集群部署环境准备(所有节点)](#一、K8s 集群部署环境准备(所有节点))
    • [1.1 环境架构](#1.1 环境架构)
    • [1.2 配置主机名与主机映射](#1.2 配置主机名与主机映射)
      • [1.2.1 设置主机名](#1.2.1 设置主机名)
      • [1.2.2 配置主机映射](#1.2.2 配置主机映射)
    • [1.3 关闭防火墙与 SELinux](#1.3 关闭防火墙与 SELinux)
      • [1.3.1 关闭防火墙](#1.3.1 关闭防火墙)
      • [1.3.2 关闭 SELinux](#1.3.2 关闭 SELinux)
    • [1.4 关闭 Swap 分区](#1.4 关闭 Swap 分区)
    • [1.5 配置内核参数(网络优化)](#1.5 配置内核参数(网络优化))
    • [1.6 安装 IPVS 相关工具](#1.6 安装 IPVS 相关工具)
    • [1.7 安装 Containerd(容器运行时)](#1.7 安装 Containerd(容器运行时))
      • [1.7.1 安装 Containerd 依赖](#1.7.1 安装 Containerd 依赖)
      • [1.7.2 添加阿里 Docker 源(加速 Containerd 下载)](#1.7.2 添加阿里 Docker 源(加速 Containerd 下载))
      • [1.7.3 加载 Containerd 所需内核模块](#1.7.3 加载 Containerd 所需内核模块)
      • [1.7.4 安装 Containerd](#1.7.4 安装 Containerd)
      • [1.7.5 配置 Containerd(适配 K8s)](#1.7.5 配置 Containerd(适配 K8s))
      • [1.7.6 启动 Containerd 并设置开机启动](#1.7.6 启动 Containerd 并设置开机启动)
  • [二、安装 kubectl、kubelet、kubeadm(三个节点)](#二、安装 kubectl、kubelet、kubeadm(三个节点))
    • [2.1 添加阿里 Kubernetes 源(加速组件下载)](#2.1 添加阿里 Kubernetes 源(加速组件下载))
    • [2.2 安装指定版本的组件(1.28.2)](#2.2 安装指定版本的组件(1.28.2))
      • [2.2.1 查看 1.28 系列可用版本](#2.2.1 查看 1.28 系列可用版本)
      • [2.2.2 安装 1.28.2 版本](#2.2.2 安装 1.28.2 版本)
      • [2.2.3 启动 kubelet 并设置开机启动](#2.2.3 启动 kubelet 并设置开机启动)
  • [三、部署 Kubernetes 集群](#三、部署 Kubernetes 集群)
    • [3.1 初始化 K8s 集群(master01 节点)](#3.1 初始化 K8s 集群(master01 节点))
      • [3.1.1 查看初始化所需镜像](#3.1.1 查看初始化所需镜像)
      • [3.1.2 编写初始化配置文件](#3.1.2 编写初始化配置文件)
      • [3.1.3 执行集群初始化](#3.1.3 执行集群初始化)
    • [3.2 配置 kubectl 客户端(master01 节点)](#3.2 配置 kubectl 客户端(master01 节点))
    • [3.3 查看集群初始状态(master01 节点)](#3.3 查看集群初始状态(master01 节点))
      • [3.3.1 查看节点状态](#3.3.1 查看节点状态)
      • [3.3.2 查看 Pod 状态](#3.3.2 查看 Pod 状态)
    • [3.4 安装 Calico 网络插件(CNI)(master01 节点)](#3.4 安装 Calico 网络插件(CNI)(master01 节点))
      • [3.4.1 Flannel 与 Calico 对比](#3.4.1 Flannel 与 Calico 对比)
      • [3.4.2 安装 Calico](#3.4.2 安装 Calico)
    • [3.5 验证集群状态(master01 节点)](#3.5 验证集群状态(master01 节点))
      • [3.5.1 查看 Pod 状态(等待 1-2 分钟,Calico 组件启动)](#3.5.1 查看 Pod 状态(等待 1-2 分钟,Calico 组件启动))
      • [3.5.2 查看节点状态(master01 变为 `Ready`)](#3.5.2 查看节点状态(master01 变为 Ready))
    • [3.6 工作节点加入集群(node01、node02 节点)](#3.6 工作节点加入集群(node01、node02 节点))
    • [3.7 验证所有节点状态(master01 节点)](#3.7 验证所有节点状态(master01 节点))
    • [3.8 配置 kubectl 命令补全(所有节点可选)](#3.8 配置 kubectl 命令补全(所有节点可选))
    • [3.9 安装 Nerdctl(Containerd 客户端,所有节点可选)](#3.9 安装 Nerdctl(Containerd 客户端,所有节点可选))
  • [四、安装 Kubernetes Dashboard(可视化管理工具)(master01 节点)](#四、安装 Kubernetes Dashboard(可视化管理工具)(master01 节点))
    • [4.1 下载 Dashboard 配置文件](#4.1 下载 Dashboard 配置文件)
    • [4.2 修改配置文件(开启 NodePort 访问)](#4.2 修改配置文件(开启 NodePort 访问))
    • [4.3 部署 Dashboard 并验证](#4.3 部署 Dashboard 并验证)
      • [4.3.1 应用配置文件](#4.3.1 应用配置文件)
      • [4.3.2 查看 Dashboard 状态](#4.3.2 查看 Dashboard 状态)
    • [4.4 访问 Dashboard 页面](#4.4 访问 Dashboard 页面)
    • [4.5 创建 Dashboard 管理员用户(master01 节点)](#4.5 创建 Dashboard 管理员用户(master01 节点))
    • [4.6 获取登录 Token(master01 节点)](#4.6 获取登录 Token(master01 节点))
      • [方法 1:直接创建 Token](#方法 1:直接创建 Token)
      • [方法 2:从 Secret 中获取 Token(永久有效)](#方法 2:从 Secret 中获取 Token(永久有效))
    • [4.7 登录 Dashboard](#4.7 登录 Dashboard)
  • 总结

前言

Kubernetes(简称 K8s)作为容器编排领域的事实标准,已成为企业级微服务部署、运维和扩展的核心工具。本文基于 kubeadm 工具,详细讲解 Kubernetes 1.28.2 版本集群的部署过程,适配自定义环境(master01:192.168.10.14,node01:192.168.10.15,node02:192.168.10.16),涵盖环境准备、组件安装、集群初始化、网络插件配置及可视化 Dashboard 部署,适合有 Linux 基础的运维或开发人员参考。

本文所有操作均基于 CentOS 7.9.2009 系统,需确保所有节点网络互通、权限为 root,且已配置好国内 yum 源(如阿里源)以加速依赖下载。


一、K8s 集群部署环境准备(所有节点)

环境准备是 K8s 集群稳定运行的基础,需在 所有节点(master01、node01、node02) 执行以下操作(特殊说明除外)。

1.1 环境架构

本次部署采用「1 主 2 从」架构,节点角色、IP、系统版本等信息如下表所示:

IP 地址 主机名 操作系统 Kubelet 版本 节点角色 核心作用
192.168.10.14 master01 CentOS 7.9.2009 v1.28.2 管理节点 集群控制平面(APIServer、etcd 等)
192.168.10.15 node01 CentOS 7.9.2009 v1.28.2 工作节点 运行容器化应用(Pod)
192.168.10.16 node02 CentOS 7.9.2009 v1.28.2 工作节点 运行容器化应用(Pod)

1.2 配置主机名与主机映射

1.2.1 设置主机名

主机名用于节点标识,需确保每个节点主机名唯一,执行以下命令(分别在对应节点执行):

  • master01 节点:

    bash 复制代码
    hostnamectl set-hostname master01
  • node01 节点:

    bash 复制代码
    hostnamectl set-hostname node01
  • node02 节点:

    bash 复制代码
    hostnamectl set-hostname node02

1.2.2 配置主机映射

通过 /etc/hosts 文件实现节点间通过主机名访问,避免依赖 DNS,所有节点执行:

bash 复制代码
cat >> /etc/hosts << EOF
192.168.10.14 master01
192.168.10.15 node01
192.168.10.16 node02
EOF

1.3 关闭防火墙与 SELinux

K8s 集群内部需要频繁的网络通信(如 Pod 间通信、节点间同步),防火墙和 SELinux 可能会拦截相关流量,因此需关闭:

1.3.1 关闭防火墙

bash 复制代码
# 停止防火墙服务
systemctl stop firewalld.service
# 禁止防火墙开机启动
systemctl disable firewalld.service

1.3.2 关闭 SELinux

SELinux 是 Linux 安全增强机制,可能会限制容器对宿主机资源的访问,需永久禁用:

bash 复制代码
# 临时关闭 SELinux(当前会话生效)
setenforce 0
# 永久关闭 SELinux(重启后生效)
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

1.4 关闭 Swap 分区

K8s 要求关闭 Swap 分区,以确保节点内存资源能被准确调度(避免容器使用 Swap 导致性能下降):

bash 复制代码
# 临时关闭 Swap(当前会话生效)
swapoff -a
# 永久关闭 Swap(注释 Swap 挂载项,重启后生效)
sed -i '/swap/s/^/#/g' /etc/fstab

1.5 配置内核参数(网络优化)

K8s 依赖特定内核参数实现网络转发、网桥过滤等功能,需手动配置并加载:

bash 复制代码
# 创建内核参数配置文件
cat > /etc/sysctl.d/k8s.conf << EOF
# 开启网桥的 IPv6 流量转发
net.bridge.bridge-nf-call-ip6tables = 1
# 开启网桥的 IPv4 流量转发
net.bridge.bridge-nf-call-iptables = 1
# 开启 IPv4 流量转发(支持 Pod 跨节点通信)
net.ipv4.ip_forward = 1
EOF

=================================================================
cat >/etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 加载配置(立即生效)
sysctl --system

1.6 安装 IPVS 相关工具

K8s 支持 iptablesipvs 两种服务发现模式,ipvs 性能更优(支持更多负载均衡算法、更低延迟),需安装相关工具并加载内核模块:

bash 复制代码
# 安装依赖工具
yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

# 配置 IPVS 内核模块开机加载
cat > /etc/modules-load.d/ipvs.conf << EOF
# 加载 IPVS 核心模块
ip_vs
# IPVS 轮询调度算法
ip_vs_rr
# IPVS 加权轮询调度算法
ip_vs_wrr
# IPVS 源哈希调度算法
ip_vs_sh
# 连接跟踪模块(支持会话保持)
nf_conntrack
# IPv4 连接跟踪模块
nf_conntrack_ipv4
EOF

================================================================
cat > /etc/modules-load.d/ipvs.conf <<EOF
# Load IPVS at boot
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
nf_conntrack_ipv4
EOF
================================================================

# 立即加载模块并设置开机启动
# 1. 确保服务开机自启
systemctl enable systemd-modules-load.service

# 2. 重启服务使当前配置生效
systemctl restart systemd-modules-load.service

# 验证模块加载成功(出现 ip_vs 和 nf_conntrack_ipv4 相关输出即正常)
lsmod | egrep "ip_vs|nf_conntrack_ipv4"

1.7 安装 Containerd(容器运行时)

K8s 从 1.24 版本开始不再默认支持 Docker 作为容器运行时,推荐使用 Containerd(Docker 的底层容器运行时),以下是安装步骤:

1.7.1 安装 Containerd 依赖

bash 复制代码
yum -y install yum-utils device-mapper-persistent-data lvm2

1.7.2 添加阿里 Docker 源(加速 Containerd 下载)

Containerd 属于 Docker 生态组件,可通过 Docker 源安装:

bash 复制代码
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.7.3 加载 Containerd 所需内核模块

bash 复制代码
# 配置模块加载
cat >> /etc/modules-load.d/containerd.conf << EOF
# overlay 文件系统模块(容器分层存储依赖)
overlay
# 网桥过滤模块(容器网络依赖)
br_netfilter
EOF
=================================================================
cat >> /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# 立即加载模块
modprobe overlay
modprobe br_netfilter

1.7.4 安装 Containerd

bash 复制代码
# 安装最新版本的 Containerd
yum -y install containerd.io

1.7.5 配置 Containerd(适配 K8s)

默认配置需调整以支持 K8s 的 Systemd 控制组和国内镜像源:

bash 复制代码
# 创建 Containerd 配置目录
mkdir -p /etc/containerd

# 生成默认配置文件
containerd config default > /etc/containerd/config.toml

# 1. 开启 Systemd 控制组(K8s 推荐,适配节点的 Systemd 服务管理)
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml

# 2. 替换 Sandbox 镜像为阿里源(避免官方源访问超时)
sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml

1.7.6 启动 Containerd 并设置开机启动

bash 复制代码
systemctl enable containerd
systemctl start containerd

# 验证 Containerd 运行状态(active (running) 即正常)
systemctl status containerd

二、安装 kubectl、kubelet、kubeadm(三个节点)

kubeadm 是 K8s 集群初始化工具,kubelet 是节点上的核心组件(管理 Pod 生命周期),kubectl 是 K8s 命令行客户端,需在所有节点安装。

2.1 添加阿里 Kubernetes 源(加速组件下载)

K8s 官方源在国内访问较慢,使用阿里源替代:

bash 复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2.2 安装指定版本的组件(1.28.2)

需确保 kubectlkubeletkubeadm 版本一致,避免兼容性问题:

2.2.1 查看 1.28 系列可用版本

bash 复制代码
yum --showduplicates list kubelet | grep 1.28

输出示例(确认 1.28.2 存在):

复制代码
kubelet.x86_64  1.28.0-0  kubernetes
kubelet.x86_64  1.28.1-0  kubernetes
kubelet.x86_64  1.28.2-0  kubernetes

2.2.2 安装 1.28.2 版本

bash 复制代码
yum -y install kubectl-1.28.2 kubelet-1.28.2 kubeadm-1.28.2

2.2.3 启动 kubelet 并设置开机启动

bash 复制代码
systemctl enable kubelet
systemctl start kubelet

# 验证 kubelet 状态(此时可能为 activating,初始化集群后会变为 running)
systemctl status kubelet

三、部署 Kubernetes 集群

集群部署核心操作在 master01 节点 执行,工作节点(node01、node02)仅需执行「加入集群」命令。

3.1 初始化 K8s 集群(master01 节点)

3.1.1 查看初始化所需镜像

K8s 初始化需拉取多个核心镜像(如 APIServer、etcd),先确认镜像列表:

bash 复制代码
kubeadm config images list --kubernetes-version=v1.28.2

输出示例(后续会通过阿里源拉取这些镜像):

复制代码
registry.k8s.io/kube-apiserver:v1.28.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1

3.1.2 编写初始化配置文件

创建 kubeadm-init.yaml 配置文件,指定控制平面地址、镜像源、网络网段等:

bash 复制代码
cat > /tmp/kubeadm-init.yaml << EOF
# 集群配置(控制平面)
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
# 控制平面地址(master01 的 IP + K8s API 端口 6443)
controlPlaneEndpoint: 192.168.10.14:6443
# 镜像源(阿里源,加速拉取)
imageRepository: registry.aliyuncs.com/google_containers
# 网络配置
networking:
  podSubnet: 172.16.0.0/16  # Pod 网段(需与后续 Calico 配置一致)
  serviceSubnet: 172.15.0.0/16  # Service 网段(默认即可,避免与宿主机冲突)
---
# kube-proxy 配置(使用 IPVS 模式)
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF

================================================================================
=======
如果想修改网段可以在这边修改,用下面这个

cat > /tmp/kubeadm-init.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
controlPlaneEndpoint: 192.168.10.14:6443
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16 
serviceSubnet: 10.96.0.0/16 
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF

3.1.3 执行集群初始化

bash 复制代码
kubeadm init --config=/tmp/kubeadm-init.yaml --ignore-preflight-errors=all
  • --config:指定上述配置文件;
  • --ignore-preflight-errors=all:忽略部分预检错误(如内核版本 minor 号不匹配、Swap 未完全关闭等非致命问题)。

关键输出保存:初始化成功后,会输出「工作节点加入集群」的命令(含 token 和 hash),需复制保存(后续 node01、node02 需执行),示例:

bash 复制代码
# 控制平面节点加入命令(本文单主架构,暂用不到)
kubeadm join 192.168.10.14:6443 --token bcxn70.0t4p9t6h8d8sb1my \
	--discovery-token-ca-cert-hash sha256:cee1a4b147576d76d4d49857d686886fab06fb24a785f03dc746d4ec91e7bf11 \
	--control-plane

# 工作节点加入命令(重点保存)
kubeadm join 192.168.10.14:6443 --token bcxn70.0t4p9t6h8d8sb1my \
	--discovery-token-ca-cert-hash sha256:cee1a4b147576d76d4d49857d686886fab06fb24a785f03dc746d4ec91e7bf11 

3.2 配置 kubectl 客户端(master01 节点)

初始化后,需配置 kubectl 以连接集群(默认仅 root 用户可操作):

bash 复制代码
# 创建 kubectl 配置目录
mkdir -p $HOME/.kube

# 复制集群配置文件(K8s 认证依赖此文件)
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 设置文件权限(确保当前用户可读写)
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# root 用户可直接设置环境变量(避免每次切换用户重新配置)
export KUBECONFIG=/etc/kubernetes/admin.conf

3.3 查看集群初始状态(master01 节点)

3.3.1 查看节点状态

bash 复制代码
kubectl get node

输出示例(此时 master01 状态为 NotReady,原因是缺少 CNI 网络插件):

复制代码
NAME       STATUS     ROLES           AGE   VERSION
master01   NotReady   control-plane   5m    v1.28.2

3.3.2 查看 Pod 状态

bash 复制代码
kubectl get pod -A

输出示例(coredns 处于 Pending 状态,依赖网络插件启动):

复制代码
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-66f779496c-7crcg           0/1     Pending   0          95s
kube-system   coredns-66f779496c-gjwf9           0/1     Pending   0          95s
kube-system   etcd-master01                      1/1     Running   0          102s
kube-system   kube-apiserver-master01            1/1     Running   0          99s
kube-system   kube-controller-manager-master01   1/1     Running   0          100s
kube-system   kube-proxy-wzl4l                   1/1     Running   0          96s
kube-system   kube-scheduler-master01            1/1     Running   0          99s

3.4 安装 Calico 网络插件(CNI)(master01 节点)

CNI(容器网络接口)是 K8s 实现 Pod 跨节点通信的核心,常用插件有 Flannel 和 Calico。本文选择 Calico(性能更优、支持网络策略)。

3.4.1 Flannel 与 Calico 对比

特性 Flannel Calico
通信方式 Overlay 隧道(VXLAN/UDP) 直接路由(BGP 协议)
性能 中等(隧道封装有损耗) 优秀(无封装,原生路由)
网络策略支持 不支持 支持(细粒度访问控制)
适用场景 小型集群、简单场景 中大型集群、需网络策略场景
配置复杂度 中(需理解 BGP 基础)

3.4.2 安装 Calico

方法一:
  1. 下载 Calico 配置文件(v3.25 版本,适配 K8s 1.28):

    bash 复制代码
    wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
  2. 修改配置文件(确保网段与集群初始化一致):

    bash 复制代码
    vim calico.yaml

    找到 CALICO_IPV4POOL_CIDR 配置项,取消注释并设置为 10.244.0.0/16(与 kubeadm-init.yaml 中的 podSubnet 一致):

    yaml 复制代码
    - name: CALICO_IPV4POOL_CIDR
      value: "10.244.0.0/16"
  3. 应用 Calico 配置:

    bash 复制代码
    kubectl apply -f calico.yaml
方法二:

将calico相关镜像上传至所有节点

bash 复制代码
# 导入镜像
nerdctl -n k8s.io load -i calico-cni-v3.24.5.tar 
nerdctl -n k8s.io load -i calico-node-v3.24.5.tar
nerdctl -n k8s.io load -i coredns-v1.10.1.tar
nerdctl -n k8s.io load -i calico-controllers-v3.24.5.tar

在master01节点应用 Calico 配置:

bash 复制代码
kubectl apply -f calico.yaml

3.5 验证集群状态(master01 节点)

3.5.1 查看 Pod 状态(等待 1-2 分钟,Calico 组件启动)

bash 复制代码
kubectl get pod -A

输出示例(calico-nodecoredns 均为 Running 即正常):

复制代码
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-7d8788dbf-vpdhq   1/1     Running   0          4m50s
kube-system   calico-node-lg8mw                         1/1     Running   0          4m50s
kube-system   coredns-66f779496c-7crcg                  1/1     Running   0          29m
kube-system   coredns-66f779496c-gjwf9                  1/1     Running   0          29m
kube-system   etcd-master01                             1/1     Running   0          29m
kube-system   kube-apiserver-master01                   1/1     Running   0          29m
kube-system   kube-controller-manager-master01          1/1     Running   0          29m
kube-system   kube-proxy-wzl4l                          1/1     Running   0          29m
kube-system   kube-scheduler-master01                   1/1     Running   0          29m

3.5.2 查看节点状态(master01 变为 Ready

bash 复制代码
kubectl get node

输出示例:

复制代码
NAME       STATUS   ROLES           AGE   VERSION
master01   Ready    control-plane   8m    v1.28.2

3.6 工作节点加入集群(node01、node02 节点)

在 node01 和 node02 节点分别执行 3.1.3 中保存的「工作节点加入命令」:

bash 复制代码
kubeadm join 192.168.10.14:6443 --token bcxn70.0t4p9t6h8d8sb1my \
	--discovery-token-ca-cert-hash sha256:cee1a4b147576d76d4d49857d686886fab06fb24a785f03dc746d4ec91e7bf11 

加入成功提示:

复制代码
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.

3.7 验证所有节点状态(master01 节点)

bash 复制代码
kubectl get node

输出示例(node01、node02 均为 Ready,集群部署完成):

复制代码
NAME       STATUS   ROLES           AGE   VERSION
master01   Ready    control-plane   33m   v1.28.2
node01     Ready    <none>          67s   v1.28.2
node02     Ready    <none>          25s   v1.28.2

3.8 配置 kubectl 命令补全(所有节点可选)

为方便操作,配置 kubectl 命令补全(需安装 bash-completion):

bash 复制代码
# 安装 bash-completion
yum -y install bash-completion

# 配置 kubectl 补全(永久生效)
echo "source <(kubectl completion bash)" >> /etc/profile

# 立即生效
source /etc/profile

配置后,输入 kubectl get no 按 Tab 键即可补全为 kubectl get node

3.9 安装 Nerdctl(Containerd 客户端,所有节点可选)

nerdctl 是 Containerd 的命令行客户端,语法与 docker 兼容,适合管理容器:

bash 复制代码
yum -y install wget

# 下载 nerdctl 1.7.0 版本(适配 Containerd 1.6+)
wget -q -c https://github.com/containerd/nerdctl/releases/download/v1.7.0/nerdctl-1.7.0-linux-amd64.tar.gz

# 解压到 /usr/local/bin(全局可执行)
tar xf nerdctl-1.7.0-linux-amd64.tar.gz -C /usr/local/bin

# 配置 nerdctl 命令补全(永久生效)
echo "source <(nerdctl completion bash)" >> ~/.bashrc
source ~/.bashrc

# 验证(查看 K8s 集群内的容器)
nerdctl -n k8s.io ps

#这个可以在任何节点测试下
nerdctl run -d --name nginx -p 8080:80 nginx:alpine

四、安装 Kubernetes Dashboard(可视化管理工具)(master01 节点)

Kubernetes Dashboard 是官方可视化工具,支持查看 Pod 状态、部署应用、查看日志等操作,需在 master01 节点部署。

4.1 下载 Dashboard 配置文件

bash 复制代码
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

4.2 修改配置文件(开启 NodePort 访问)

默认 Dashboard 仅支持集群内部访问(ClusterIP 类型),需修改为 NodePort 类型以支持外部浏览器访问:

bash 复制代码
vim recommended.yaml

找到 Service 配置段(kind: Servicename: kubernetes-dashboard),添加 type: NodePortnodePort: 30000

yaml 复制代码
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort  # 新增:开启 NodePort 访问
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30000  # 新增:外部访问端口(30000-32767 之间)
  selector:
    k8s-app: kubernetes-dashboard

4.3 部署 Dashboard 并验证

4.3.1 应用配置文件

bash 复制代码
kubectl apply -f recommended.yaml

4.3.2 查看 Dashboard 状态

bash 复制代码
# 查看 Pod(kubernetes-dashboard 命名空间)
kubectl get pod -n kubernetes-dashboard

# 查看 Service(确认 NodePort 已生效)
kubectl get svc -n kubernetes-dashboard

输出示例(kubernetes-dashboard Service 类型为 NodePort,端口为 443:30000/TCP):

复制代码
NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.103.113.1   <none>        8000/TCP        109s
kubernetes-dashboard        NodePort    10.97.98.190   <none>        443:30000/TCP   110s

4.4 访问 Dashboard 页面

  1. 打开浏览器,输入地址:https://192.168.10.14:30000(master01 的 IP + 30000 端口);
  2. 浏览器提示「不安全连接」(Dashboard 使用自签证书),点击「高级」→「继续访问」(仅测试环境,生产环境需配置可信证书);
  3. 进入登录页面,支持「Token」和「Kubeconfig」两种登录方式,本文使用「Token」登录。

4.5 创建 Dashboard 管理员用户(master01 节点)

默认 Dashboard 无管理员权限,需创建 ServiceAccount 并绑定 cluster-admin 角色:

bash 复制代码
# 创建管理员配置文件
cat > dashboard-admin.yaml << EOF
# 1. 创建 ServiceAccount(kubernetes-dashboard 命名空间)
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kubernetes-dashboard
---
# 2. 绑定 ClusterRole(cluster-admin 为集群最高权限)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kubernetes-dashboard
---
# 3. 创建 Secret(关联 ServiceAccount,用于生成 Token)
apiVersion: v1
kind: Secret
metadata:
  name: kubernetes-dashboard-admin
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin"
type: kubernetes.io/service-account-token
EOF

# 应用配置
kubectl apply -f dashboard-admin.yaml

4.6 获取登录 Token(master01 节点)

方法 1:直接创建 Token

bash 复制代码
kubectl -n kubernetes-dashboard create token admin

输出示例(复制此 Token,用于登录):

复制代码
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik5EN1V5WWJxamRraGZSb29aeFBnOUpBOGZPaXdwSFk5WGNIQnNuQzRIdlUifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzYwMDE3MzE3LCJpYXQiOjE3NjAwMTM3MTcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5...

方法 2:从 Secret 中获取 Token(永久有效)

bash 复制代码
# 1. 获取 Secret 名称
TokenSecret=$(kubectl -n kubernetes-dashboard get secret | awk '/kubernetes-dashboard-admin/ {print $1}')

# 2. 提取 Token
kubectl describe secrets -n kubernetes-dashboard ${TokenSecret} | grep token | awk 'NR==NF {print $2}'

或者直接执行:
kubectl describe secrets -n kubernetes-dashboard $(kubectl -n kubernetes-dashboard get secret | awk '/kubernetes-dashboard-admin/ {print $1}') | grep '^token:' | awk '{print $2}'

4.7 登录 Dashboard

  1. 在登录页面选择「Token」,粘贴上述获取的 Token,点击「登录」;

  2. 登录成功后,可查看集群节点、Pod、Service 等资源,也可通过「Deployments」页面部署新应用。

  3. 创建一个名为 nginx 的部署,使用 nginx:1.14 镜像并维持 3 个运行的 Pod 副本

bash 复制代码
kubectl create deployment nginx --image=nginx:1.14 --replicas=3

常见问题:登录后无资源权限

若登录后提示「找不到资源」,执行以下命令重新绑定权限:

bash 复制代码
kubectl create clusterrolebinding serviceaccount-cluster-admin \
  --clusterrole=cluster-admin \
  --user=system:serviceaccount:kubernetes-dashboard:admin

总结

本文详细讲解了 Kubernetes 1.28.2 集群的部署流程,核心步骤可总结为:

  1. 环境准备:关闭防火墙/SELinux/Swap、配置内核参数、安装 Containerd,确保节点满足 K8s 运行条件;
  2. 组件安装 :通过阿里源安装 kubeadm/kubelet/kubectl,保证版本一致;
  3. 集群初始化:在 master 节点编写配置文件并执行初始化,保存工作节点加入命令;
  4. 网络插件 :安装 Calico 实现 Pod 跨节点通信,使节点状态变为 Ready
  5. 工作节点加入:在 node 节点执行加入命令,完成集群扩容;
  6. 可视化工具:部署 Dashboard 并配置管理员权限,实现集群可视化管理。

注意事项

  • 所有节点 IP 和主机名需与实际环境匹配(本文适配 192.168.10.14/15/16);
  • 初始化时的 podSubnet 需与 Calico 配置一致,否则网络插件无法正常工作;
  • Token 和 admin.conf 文件需妥善保存,避免泄露导致集群安全风险;
  • 若部署过程中出现节点 NotReady、Pod Pending 等问题,可通过 kubectl describe pod <pod-name> -n <namespace> 查看日志排查原因。

通过本文步骤,可快速搭建一个稳定的 K8s 1.28 集群,为后续部署微服务、持续集成/持续部署(CI/CD)奠定基础。

相关推荐
问道飞鱼4 小时前
【Kubernets进阶】Kubernetes VPA (Vertical Pod Autoscaler) 详解与配置指南
云原生·容器·kubernetes·vpa
Light605 小时前
领码方案|微服务与SOA的世纪对话(7):运营降本增效——智能架构时代的成本与服务管理
微服务·云原生·ai ops·成本边界·slo/sli·容量预测·成本治理
Vio7255 小时前
微服务基础:远程调用的基本使用详解
微服务·云原生·架构
Roam-G6 小时前
在 Mac 上使用 Docker 安装 Milvus 2.6.2
docker·容器·milvus
敲上瘾7 小时前
Docker镜像构建指南:Dockerfile语法与docker build命令全解析
linux·服务器·docker·微服务·容器
YC运维11 小时前
Dockerfile实战案例详解
运维·docker·容器
分布式存储与RustFS12 小时前
告别手动配置:用 Terraform 定义你的 RustFS 存储帝国
云原生·wpf·文件系统·terraform·对象存储·minio·rustfs
悠闲蜗牛�16 小时前
人工智能时代下的全栈开发:整合AI、大数据与云原生的实践策略
大数据·人工智能·云原生
荣光波比21 小时前
K8S(一)—— 云原生与Kubernetes(K8S)从入门到实践:基础概念与操作全解析
云原生·容器·kubernetes