K8S(二)—— K8S 1.28 集群部署指南(kubeadm 方式)
文章目录
- 前言
- 一、K8s 集群部署环境准备(所有节点)
- 1.1 环境架构
- 1.2 配置主机名与主机映射
- 1.2.1 设置主机名
- 1.2.2 配置主机映射
- 1.3 关闭防火墙与 SELinux
- 1.3.1 关闭防火墙
- 1.3.2 关闭 SELinux
- 1.4 关闭 Swap 分区
- 1.5 配置内核参数(网络优化)
- 1.6 安装 IPVS 相关工具
- 1.7 安装 Containerd(容器运行时)
- 1.7.1 安装 Containerd 依赖
- 1.7.2 添加阿里 Docker 源(加速 Containerd 下载)
- 1.7.3 加载 Containerd 所需内核模块
- 1.7.4 安装 Containerd
- 1.7.5 配置 Containerd(适配 K8s)
- 1.7.6 启动 Containerd 并设置开机启动
- 二、安装 kubectl、kubelet、kubeadm(三个节点)
- 2.1 添加阿里 Kubernetes 源(加速组件下载)
- 2.2 安装指定版本的组件(1.28.2)
- 2.2.1 查看 1.28 系列可用版本
- 2.2.2 安装 1.28.2 版本
- 2.2.3 启动 kubelet 并设置开机启动
- 三、部署 Kubernetes 集群
- 3.1 初始化 K8s 集群(master01 节点)
- 3.1.1 查看初始化所需镜像
- 3.1.2 编写初始化配置文件
- 3.1.3 执行集群初始化
- 3.2 配置 kubectl 客户端(master01 节点)
- 3.3 查看集群初始状态(master01 节点)
- 3.3.1 查看节点状态
- 3.3.2 查看 Pod 状态
- 3.4 安装 Calico 网络插件(CNI)(master01 节点)
- 3.4.1 Flannel 与 Calico 对比
- 3.4.2 安装 Calico
- 方法一:
- 方法二:
- 3.5 验证集群状态(master01 节点)
- 3.5.1 查看 Pod 状态(等待 1-2 分钟,Calico 组件启动)
- 3.5.2 查看节点状态(master01 变为 `Ready`)
- 3.6 工作节点加入集群(node01、node02 节点)
- 3.7 验证所有节点状态(master01 节点)
- 3.8 配置 kubectl 命令补全(所有节点可选)
- 3.9 安装 Nerdctl(Containerd 客户端,所有节点可选)
- 四、安装 Kubernetes Dashboard(可视化管理工具)(master01 节点)
- 4.1 下载 Dashboard 配置文件
- 4.2 修改配置文件(开启 NodePort 访问)
- 4.3 部署 Dashboard 并验证
- 4.3.1 应用配置文件
- 4.3.2 查看 Dashboard 状态
- 4.4 访问 Dashboard 页面
- 4.5 创建 Dashboard 管理员用户(master01 节点)
- 4.6 获取登录 Token(master01 节点)
- 方法 1:直接创建 Token
- 方法 2:从 Secret 中获取 Token(永久有效)
- 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 节点:
hostnamectl set-hostname master01
- node01 节点:
hostnamectl set-hostname node01
- node02 节点:
hostnamectl set-hostname node02
1.2.2 配置主机映射
通过 /etc/hosts
文件实现节点间通过主机名访问,避免依赖 DNS,所有节点执行:
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 关闭防火墙
# 停止防火墙服务
systemctl stop firewalld.service
# 禁止防火墙开机启动
systemctl disable firewalld.service
1.3.2 关闭 SELinux
SELinux 是 Linux 安全增强机制,可能会限制容器对宿主机资源的访问,需永久禁用:
# 临时关闭 SELinux(当前会话生效)
setenforce 0
# 永久关闭 SELinux(重启后生效)
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
1.4 关闭 Swap 分区
K8s 要求关闭 Swap 分区,以确保节点内存资源能被准确调度(避免容器使用 Swap 导致性能下降):
# 临时关闭 Swap(当前会话生效)
swapoff -a
# 永久关闭 Swap(注释 Swap 挂载项,重启后生效)
sed -i '/swap/s/^/#/g' /etc/fstab
1.5 配置内核参数(网络优化)
K8s 依赖特定内核参数实现网络转发、网桥过滤等功能,需手动配置并加载:
# 创建内核参数配置文件
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 支持 iptables
和 ipvs
两种服务发现模式,ipvs
性能更优(支持更多负载均衡算法、更低延迟),需安装相关工具并加载内核模块:
# 安装依赖工具
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 依赖
yum -y install yum-utils device-mapper-persistent-data lvm2
1.7.2 添加阿里 Docker 源(加速 Containerd 下载)
Containerd 属于 Docker 生态组件,可通过 Docker 源安装:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.7.3 加载 Containerd 所需内核模块
# 配置模块加载
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
# 安装最新版本的 Containerd
yum -y install containerd.io
1.7.5 配置 Containerd(适配 K8s)
默认配置需调整以支持 K8s 的 Systemd 控制组和国内镜像源:
# 创建 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 并设置开机启动
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 官方源在国内访问较慢,使用阿里源替代:
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)
需确保 kubectl
、kubelet
、kubeadm
版本一致,避免兼容性问题:
2.2.1 查看 1.28 系列可用版本
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 版本
yum -y install kubectl-1.28.2 kubelet-1.28.2 kubeadm-1.28.2
2.2.3 启动 kubelet 并设置开机启动
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),先确认镜像列表:
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
配置文件,指定控制平面地址、镜像源、网络网段等:
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 执行集群初始化
kubeadm init --config=/tmp/kubeadm-init.yaml --ignore-preflight-errors=all
--config
:指定上述配置文件;--ignore-preflight-errors=all
:忽略部分预检错误(如内核版本 minor 号不匹配、Swap 未完全关闭等非致命问题)。
关键输出保存:初始化成功后,会输出「工作节点加入集群」的命令(含 token 和 hash),需复制保存(后续 node01、node02 需执行),示例:
# 控制平面节点加入命令(本文单主架构,暂用不到)
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 用户可操作):
# 创建 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 查看节点状态
kubectl get node
输出示例(此时 master01 状态为 NotReady
,原因是缺少 CNI 网络插件):
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane 5m v1.28.2
3.3.2 查看 Pod 状态
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
方法一:
-
下载 Calico 配置文件(v3.25 版本,适配 K8s 1.28):
wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
-
修改配置文件(确保网段与集群初始化一致):
vim calico.yaml
找到
CALICO_IPV4POOL_CIDR
配置项,取消注释并设置为10.244.0.0/16
(与kubeadm-init.yaml
中的podSubnet
一致):- name: CALICO_IPV4POOL_CIDRvalue: "10.244.0.0/16"
-
应用 Calico 配置:
kubectl apply -f calico.yaml
方法二:
将calico相关镜像上传至所有节点
# 导入镜像
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 配置:
kubectl apply -f calico.yaml
3.5 验证集群状态(master01 节点)
3.5.1 查看 Pod 状态(等待 1-2 分钟,Calico 组件启动)
kubectl get pod -A
输出示例(calico-node
和 coredns
均为 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
)
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 中保存的「工作节点加入命令」:
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 节点)
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-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
兼容,适合管理容器:
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 配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
4.2 修改配置文件(开启 NodePort 访问)
默认 Dashboard 仅支持集群内部访问(ClusterIP 类型),需修改为 NodePort 类型以支持外部浏览器访问:
vim recommended.yaml
找到 Service
配置段(kind: Service
,name: kubernetes-dashboard
),添加 type: NodePort
和 nodePort: 30000
:
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:type: NodePort # 新增:开启 NodePort 访问ports:- port: 443targetPort: 8443nodePort: 30000 # 新增:外部访问端口(30000-32767 之间)selector:k8s-app: kubernetes-dashboard
4.3 部署 Dashboard 并验证
4.3.1 应用配置文件
kubectl apply -f recommended.yaml
4.3.2 查看 Dashboard 状态
# 查看 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 页面
- 打开浏览器,输入地址:
https://192.168.10.14:30000
(master01 的 IP + 30000 端口); - 浏览器提示「不安全连接」(Dashboard 使用自签证书),点击「高级」→「继续访问」(仅测试环境,生产环境需配置可信证书);
- 进入登录页面,支持「Token」和「Kubeconfig」两种登录方式,本文使用「Token」登录。
4.5 创建 Dashboard 管理员用户(master01 节点)
默认 Dashboard 无管理员权限,需创建 ServiceAccount 并绑定 cluster-admin
角色:
# 创建管理员配置文件
cat > dashboard-admin.yaml << EOF
# 1. 创建 ServiceAccount(kubernetes-dashboard 命名空间)
apiVersion: v1
kind: ServiceAccount
metadata:name: adminnamespace: kubernetes-dashboard
---
# 2. 绑定 ClusterRole(cluster-admin 为集群最高权限)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: adminnamespace: kubernetes-dashboard
---
# 3. 创建 Secret(关联 ServiceAccount,用于生成 Token)
apiVersion: v1
kind: Secret
metadata:name: kubernetes-dashboard-adminnamespace: kubernetes-dashboardannotations: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
kubectl -n kubernetes-dashboard create token admin
输出示例(复制此 Token,用于登录):
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik5EN1V5WWJxamRraGZSb29aeFBnOUpBOGZPaXdwSFk5WGNIQnNuQzRIdlUifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzYwMDE3MzE3LCJpYXQiOjE3NjAwMTM3MTcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5...
方法 2:从 Secret 中获取 Token(永久有效)
# 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
-
在登录页面选择「Token」,粘贴上述获取的 Token,点击「登录」;
-
登录成功后,可查看集群节点、Pod、Service 等资源,也可通过「Deployments」页面部署新应用。
-
创建一个名为 nginx 的部署,使用 nginx:1.14 镜像并维持 3 个运行的 Pod 副本
kubectl create deployment nginx --image=nginx:1.14 --replicas=3
常见问题:登录后无资源权限
若登录后提示「找不到资源」,执行以下命令重新绑定权限:
kubectl create clusterrolebinding serviceaccount-cluster-admin \--clusterrole=cluster-admin \--user=system:serviceaccount:kubernetes-dashboard:admin
总结
本文详细讲解了 Kubernetes 1.28.2 集群的部署流程,核心步骤可总结为:
- 环境准备:关闭防火墙/SELinux/Swap、配置内核参数、安装 Containerd,确保节点满足 K8s 运行条件;
- 组件安装:通过阿里源安装
kubeadm
/kubelet
/kubectl
,保证版本一致; - 集群初始化:在 master 节点编写配置文件并执行初始化,保存工作节点加入命令;
- 网络插件:安装 Calico 实现 Pod 跨节点通信,使节点状态变为
Ready
; - 工作节点加入:在 node 节点执行加入命令,完成集群扩容;
- 可视化工具:部署 Dashboard 并配置管理员权限,实现集群可视化管理。
注意事项:
- 所有节点 IP 和主机名需与实际环境匹配(本文适配 192.168.10.14/15/16);
- 初始化时的
podSubnet
需与 Calico 配置一致,否则网络插件无法正常工作; - Token 和
admin.conf
文件需妥善保存,避免泄露导致集群安全风险; - 若部署过程中出现节点
NotReady
、PodPending
等问题,可通过kubectl describe pod <pod-name> -n <namespace>
查看日志排查原因。
通过本文步骤,可快速搭建一个稳定的 K8s 1.28 集群,为后续部署微服务、持续集成/持续部署(CI/CD)奠定基础。