K8s集群部署_v1.35
title: K8s环境部署 date: 2026-02-02 20:00:00 updated: 2026-03-02 20:00:00 tags: categories: - K8s summary: "" status: writing
摘要 :本文详细记录了在 centos 10环境下,基于 containerd 运行时手动搭建 Kubernetes v1.35 集群的全过程,涵盖从底层内核优化、网络插件 Calico 部署到 IPVS 高性能负载均衡配置的完整实战指南。以及后续组件的安装
版本演进
从 v1.24 版本开始,K8s 正式移除了 Dockershim。这意味着 Docker 不再是默认的容器运行时。
-
v1.23 (旧架构):k8s->docker->containerd->runc->内核lxc->容器
-
v1.24+ (新架构):k8s->containerd->内核lxc->容器
集群部署的四种方法
kubeadm
K8s 社区官方推荐的工具,也是目前最通用的部署方式 手动准备操作系统、安装容器运行时(如 Containerd),然后通过 kubeadm init 和 kubeadm join 命令组建集群 优点 : 流程标准化,能让你清晰理解证书管理、组件运行方式 缺点 : 不包含高可用(HA)负载均衡器的配置、不包含监控和日志
自动化安装
使用 Ansible 脚本,将数以百计的手动操作封装成自动化剧本。
-
kubespray : K8s社区官方维护的ansible脚本,支持多个linux版本
-
kubeasz : 国内非常流行的开源项目,针对国内网络环境(镜像加速)做了大量优化,且内置了高可用方案和监控。 优点 : 一键安装,集成了高可用、网络插件(Calico/Cilium)、核心插件(CoreDNS/Dashboard)。
轻量安装工具
这类工具将 K8s 的所有组件打包成极小的二进制文件,甚至一键起停
-
K3s :rancher出品,将控制平面打包进一个100MB左右的二进制文件,内存小号极低
-
MicroK8s : 由 Canonical (Ubuntu 母公司) 开发,支持 Snap 一键安装。
-
Minikube : 专门用于在本地开发环境中运行单节点 K8s。 优点 : 安装迅速,自动配置组件(包括存储和网络) 缺点 : 内部组件被替换 (Etcd -> SQLIte)
二进制手动安装
不借助任何自动化工具,手动下载 kube-apiserver、etcd、kubelet 等所有二进制文件
-
手动生成CA证书
-
手动缩写Systemd服务配置文件
-
手动配置网络转发与IPVS 优点 :对集群有绝对的控制力,哪里坏了看一眼日志就能精准定位
其他方法
-
云服务商托管部署
-
容器镜像部署
部署思路
搭建一个分布式操作系统
第一层:地基(操作系统与网络预处理)
-
身份识别:每台机器的
hostname和ip要在/etc/hosts中登记 -
swap:必须关掉,磁盘交换会拖慢响应速度
-
防火墙/selinux:关闭,避免 它们拦截 Pod 之间的通信
-
通信补丁 (Bridge) : Linux 默认不让网桥流量经过 iptables,但 K8s 必须让它经过,所以要加载
br_netfilter模块并设置net.bridge.bridge-nf-call-iptables = 1。
第二层:动力源(容器运行时)
K8s 只是一个“调度员”,它不直接管理容器,而是命令“工人”去做。
-
选择工人:以前直接选 Docker。但在 v1.24+ 之后,K8s 移除了原生支持。
-
中间人(CRI):现在主流做法是使用 Containerd 或 Docker + cri-dockerd。
-
如果你用 Docker,就必须装
cri-dockerd。它相当于一个翻译官,把 K8s 的命令翻译给 Docker 听。 -
驱动一致性:必须让工人和调度员都使用同一种管理方式(通常是
systemd)。
第三层:骨架 (K8s 三大件安装)
-
kubelet:每个节点上的“工头”,负责接收 Master 指令并操作容器。
-
kubeadm:安装工具,相当于“自动化施工队长”,能帮你自动配置复杂的证书和核心组件。
-
kubectl:给集群下指令的“控制台”。
此时的状态:骨架搭好了,但还没通电,没联网。
第四层: 激活(初始化与神经系统)
这是最容易出错的一步,也是最关键的一步。
-
Master 初始化 (
**kubeadm init**):-
这一步会启动“大脑”(Control Plane):
apiserver、controller-manager、scheduler。 -
它会生成一串
kubeadm join令牌。
-
-
网络插件(CNI):
-
初始化完你会发现节点是
NotReady。因为 Pod 之间还不能跨机器说话。 -
你需要部署 Flannel 或 Calico。这相当于给集群拉网线。
-
-
Node 加入 (
**kubeadm join**):-
工头(Node)拿着令牌跑去 Master 那里报到,正式加入集群。
-
1.35版本部署-container
环境说明
软件版本
-
系统环境: centos stream 10
-
Kubernetes: v1.35.0
-
Containerd: v2.2.1
-
Calico: v3.28.0
服务器规格
环境初始化
配置静态IP
设置主机名
# 在master上执行 hostnamectl set-hostname k8s-master-1 && su # 在node-1上执行 hostnamectl set-hostname k8s-node-1 && su # 在node-2上执行 hostnamectl set-hostname k8s-node-2 && su
配置hosts
配置hosts文件,通过主机名互相访问 每台宿主机都要完成,在3台机器上都操作
cat >> /etc/hosts << EOF 192.168.10.172 k8s-master-1 192.168.10.173 k8s-node-1 192.168.10.174 k8s-node-2 EOF
关闭selinux
# 临时关闭 setenforce 0 # 永久关闭 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 修改selinux配置文件之后,重启机器,selinux配置才能永久生效 reboot # 检查 getenforce # 显示Disabled说明selinux已经关闭
禁用firewalld和iptables
# Centos systemctl stop firewalld && systemctl disable firewalld
关闭交换分区
# 临时关闭 swapoff -a # 永久关闭 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 为什么要关闭交换分区?因为交换分区是使用磁盘里的空间做内存使用的,防止内存不足的时候,让容器在交换分区里运行,磁盘的运行速度比较慢,会影响到k8s集群里启动的容器应用程序的性能,所以要关闭。
调整内核参数
# 修改linux的内核参数,添加网桥过滤和地址转发功能,转发IPv4并让iptables看到桥接流量 cat <<EOF | tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF #加载网桥过滤模块 modprobe overlay modprobe br_netfilter # 编辑/etc/sysctl.d/kubernetes.conf文件,主要是对容器虚拟网络的支持,添加如下配置: cat << EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF # 应用sysctl参数而不重新启动 sysctl -p # 查看br_netfilter和 overlay模块是否加载成功 lsmod | grep -e br_netfilter -e overlay # br_netfilter 22256 0 # bridge 151336 1 br_netfilter # overlay 91659 0 # 查看br_netfilter和 overlay模块是否加载成功 [root@k8s-master-1 ~]# lsmod | egrep "br_netfilter|overlay" br_netfilter 22256 0 overlay 91659 0 bridge 151336 1 br_netfilter
更新和配置软件源
直接使用官方源
配置ipvs功能
ipvs是一个负载均衡的软件,目前已经直接安装在linux内核里了,不需要额外安装
# 安装ipset和ipvsadm,主要是对ipvs进行传递参数的或者管理的 yum install ipset ipvsadm -y # 添加需要加载的模块写入脚本文件 #modprobe 作用是加载模块到内核里 cat <<EOF > /etc/modules-load.d/ipvs.conf #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nfconntrack EOF # 为脚本文件添加执行权限 chmod +x /etc/modules-load.d/ipvs.conf # 执行脚本文件 /bin/bash /etc/modules-load.d/ipvs.conf [root@k8s-master-1 ~]# vim /etc/rc.local /bin/bash /etc/modules-load.d/ipvs.conf 确保ipvs.conf里的配置会在系统重启的时候加载 [root@k8s-master-1 ~]# chmod +x /etc/rc.d/rc.local # 重启 reboot # 查看对应的模块是否加载成功 [root@k8s-master-1 ~]# lsmod | egrep -e ip_vs -e nf_conntrack ip_vs_sh 12288 0 ip_vs_wrr 12288 0 ip_vs_rr 12288 0 ip_vs 237568 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 229376 3 nf_nat,nft_ct,ip_vs nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs nf_defrag_ipv4 12288 1 nf_conntrack libcrc32c 12288 5 nf_conntrack,nf_nat,nf_tables,xfs,ip_vs [root@k8s-master-1 ~]#
配置时间同步
systemctl restart chronyd && systemctl enable chronyd
配置containerd环境
安装containerd
#配置安装docker的源,使用docker官方提供的源 [root@localhost ~]#sudo dnf -y install dnf-plugins-core yum-utils #默认使用官方的源,在安装的时候出错,下载不下来软件,建议使用阿里云的源 [root@localhost yum.repos.d]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装containerd [root@localhost ~]#sudo dnf install containerd.io-2.2.1 -y 因为没有指定docker的版本,默认会安装最新的版本 [root@k8s-master-1 log]# containerd --version containerd containerd.io v2.2.1 dea7da592f5d1d2b7755e3a161be07f43fad8f75
配置containerd国内源
# 1. 生成默认配置
containerd config default > /etc/containerd/config.toml
# 2. 核心修改:开启systemd cgroup驱动(K8s强制要求)+ 替换pause镜像为国内源
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sed -i 's/registry.k8s.io\/pause:3.10/registry.aliyuncs.com\/google_containers\/pause:3.10/g' /etc/containerd/config.toml
# 3. 配置国内镜像仓库(加速+解决镜像拉取失败)
cat >> /etc/containerd/config.toml << EOF
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://hub-mirror.c.163.com", "https://mirror.baidubce.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://registry.aliyuncs.com/google_containers"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
endpoint = ["https://registry.aliyuncs.com/calico"]
EOF
# 验证配置:输出SystemdCgroup = true则成功
grep -n "SystemdCgroup" /etc/containerd/config.toml
配置containerd服务自启动
systemctl restart containerd && systemctl enable containerd # 验证状态(active (running)则成功) systemctl status containerd
检查/etc/hosts文件的配置,测试网络连通性
每台机器的/etc/hosts,添加下面的配置
[root@k8s-master-1 docker]# cat /etc/hosts 192.168.10.172 k8s-master-1 192.168.10.173 k8s-node-1 192.168.10.174 k8s-node-2
在node2机器上进行测试,通过访问域名是否可以ping通其他的机器
#测试能否ping通其他主机和上互联网 [root@k8s-master-1 containerd]# ping k8s-master-1 [root@k8s-master-1 containerd]# ping k8s-node-2 [root@k8s-master-1 containerd]# ping www.jd.com
配置K8s集群环境
配置K8s组件源
-
Centos 每台节点服务器都需要执行下面的命令(master和node节点)
-
centos stream 10
#高版本的k8s的阿里云的源 cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/repodata/repomd.xml.key EOF # 更新索引缓冲 yum makecache
安装
-
Centos
-
kubeadm 是用来安装master节点上的组件(apiserver、etcd、scheduler等),部署k8s集群的。
-
kubelet 是用来对容器运行时软件进行管理的(管理docker和containerd等容器运行时软件的)
-
kubectl 是用来输入k8s的命令的,是k8s给用户使用的软件,是一个客户端命令
-
# 安装kubeadm、kubelet、kubectl v1.35.0 dnf install -y kubelet-1.35.0 kubeadm-1.35.0 kubectl-1.35.0 --disableexcludes=kubernetes # 验证安装版本(均为v1.35.0则成功) kubeadm version && kubelet --version && kubectl version --client #设置 kubelet 开机自启(kubelet 会由 kubeadm 自动启动,先配置自启) systemctl enable kubelet # 此时kubelet为inactive状态,属于正常现象 systemctl status kubelet
拉取K8s集群所需镜像(Master节点初始化集群,仅再master执行)
仅在 k8s-master 执行 kubeadm 初始化时会自动拉取镜像,国内网络需指定阿里云镜像仓库,执行以下命令提前拉取(也可初始化时指定):
kubeadm config images pull \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.35.0 # 验证镜像(containerd镜像列表,包含apiserver、controller-manager等则成功) #crictl 是k8s里查看镜像的工具--》类似于docker命令 crictl images #具体效果如下 [root@k8s-master-1 kubelet]# kubeadm config images pull \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.35.0 # 验证镜像(containerd镜像列表,包含apiserver、controller-manager等则成功) crictl images #说明:crictl是k8s里命令行的工具,用于替代 docker 命令操作 K8s 容器。
集群初始化
kubeadm init
仅在master节点执行
kubeadm init \ --apiserver-advertise-address=192.168.1.10 `# master节点实际IP` \ --kubernetes-version=v1.35.0 `# K8s版本` \ --image-repository=registry.aliyuncs.com/google_containers `# 国内镜像源` \ --service-cidr=10.96.0.0/12 `# K8s Service网段(固定,不要修改)` \ --pod-network-cidr=10.244.0.0/16 `# Pod网段,与后续calico网络插件配置一致` \ --ignore-preflight-errors=all `# 忽略预检错误(如内存/CPU略低的情况)` kubeadm init \ --apiserver-advertise-address=192.168.10.152 \ --kubernetes-version=v1.35.0 \ --image-repository=registry.aliyuncs.com/google_containers \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=all
成功后会提示以下信息
#后面有用 kubeadm join 192.168.10.169:6443 --token 1zl0x4.w1ji9rp0wzvgf7n6 \ --discovery-token-ca-cert-hash sha256:9fa1c77ab31bce8850bc2ed87bb96023ee684ec8325e462c5494058f83c68f33
然后在master节点上继续执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#查看master接口监听6443端口的进程,是kube-apiserver
[root@k8s-master-1 ~]# ss -anplut|grep 6443
tcp LISTEN 0 128 [::]:6443 [::]:* users:(("kube-apiserver",pid=2809,fd=7))
[root@k8s-master-1 ~]#
所有的node节点加入集群
# 在所有的node节点上面执行的命令
kubeadm join 192.168.10.169:6443 --token 1zl0x4.w1ji9rp0wzvgf7n6 \
--discovery-token-ca-cert-hash sha256:9fa1c77ab31bce8850bc2ed87bb96023ee684ec8325e462c5494058f83c68f33
#执行下面的命令也可以得到join集群的命令,如果忘记了或者没有提前复制保存
[root@k8s-master-1 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.205.140:6443 --token yvq3xz.x0xfu68vz4rqldvw --discovery-token-ca-cert-hash sha256:1afc3cdd9442dfb8e1d6420c2cdb551a994e3972dbad5468193735b9ea18c086
[root@k8s-master-1 ~]#
如果成功,检查集群节点状态
# 在master上执行 [root@k8s-master-1 kubelet]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master-1 NotReady control-plane 2m59s v1.35.0 k8s-node-1 NotReady <none> 20s v1.35.0 k8s-node-2 NotReady <none> 11s v1.35.0 [root@k8s-master-1 kubelet]#
分配worker role
# 在master上执行 kubectl label node k8s-node-1 node-role.kubernetes.io/worker=worker kubectl label node k8s-node-2 node-role.kubernetes.io/worker=worker
在node节点上也可以执行kubectl命令
[root@k8s-node-1 ~]# mkdir -p $HOME/.kube [root@k8s-node-1 ~]# scp k8s-master-1:/etc/kubernetes/admin.conf /root/.kube/config [root@k8s-node-1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config [root@k8s-node-1 kubelet]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master-1 NotReady control-plane 8m49s v1.35.0 k8s-node-1 NotReady worker 6m10s v1.35.0 k8s-node-2 NotReady worker 6m1s v1.35.0 [root@k8s-node-1 kubelet]#
安装calico网络插件
# master执行 # 下载Calico v3.28.0配置文件(与K8s v1.35兼容) yum install wget -y wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml -O calico.yaml
去渡渡鸟里下载containerd的镜像
#每个节点都要拉取镜像 ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.28.0 ctr images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.28.0 docker.io/calico/node:v3.28.0 ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.28.0 ctr images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.28.0 docker.io/calico/cni:v3.28.0 ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.28.0 ctr images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.28.0 docker.io/calico/kube-controllers:v3.28.0 ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.10.1 ctr images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.10.1 registry.k8s.io/pause:3.10.1 #导出calico相关的4个镜像 ctr images export calico-cni-v3.28.0.tar docker.io/calico/cni:v3.28.0 ctr images export kube-controllers-v3.28.0.tar docker.io/calico/kube-controllers:v3.28.0 ctr images export node-v3.28.0.tar docker.io/calico/node:v3.28.0 ctr images export k8s.io.pause-3.10.1.tar registry.k8s.io/pause:3.10.1 #导入镜像到k8s.io命名空间里-n 指定命名空间 namespace [root@k8s-master-1 ~]# ctr -n k8s.io images import calico-cni-v3.28.0.tar [root@k8s-master-1 ~]# ctr -n k8s.io images import kube-controllers-v3.28.0.tar [root@k8s-master-1 ~]# ctr -n k8s.io images import node-v3.28.0.tar [root@k8s-master-1 ~]# ctr -n k8s.io images import k8s.io.pause-3.10.1.tar #再次查看是否导入成功 [root@k8s-master-1 ~]# ctr -n k8s.io images ls #再次查看是否导入成功 [root@k8s-master-1 ~]# crictl images
应用calico配置文件
修改配置文件参数
#`crictl images` 显示本地镜像名为 `docker.io/calico/cni:v3.28.0` 等。如果 YAML 文件里写的是 `registry.k8s.io` 或其他地址,K8s 就会去网上拉取 #所以要查找并修改 #搜索 `calico/cni` #确认版本号是 `v3.28.0`。 #确保前缀是 `docker.io/`(与你 `crictl images` 看到的名称完全一致)。 #搜索 `calico/node` #同样确保版本是 `v3.28.0` #搜索 `calico/kube-controllers` #确保版本是 `v3.28.0` #修改 Pod 网段(解决网络互通) #这是最关键的一步。Calico 默认的网段是 `192.168.0.0/16`,但你在 `kubeadm init` 时设置的是 `10.244.0.0/16`。如果不改,Pod 之间永远无法通信。 #在 vim 中搜索 `CALICO_IPV4POOL_CIDR` #你会看到类似下面的结构,**取消注释**(删掉前面的 `#`)并修改 `value` - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16" # 必须修改为你 init 时的 pod-network-cidr
应用配置文件
kubectl apply -f calico.yaml
验证
#查看pod的状态 [root@k8s-master-1 ~]# kubectl get pod -n kube-system -o wide #查看节点的状态都是ready [root@k8s-master-1 ~]# kubectl get node #查看kube-system命名空间里的pod kubectl get pod -n kube-system -o wide
# 创建crictl配置文件,指定containerd的运行时套接字 cat > /etc/crictl.yaml << EOF runtime-endpoint: unix:///var/run/containerd/containerd.sock image-endpoint: unix:///var/run/containerd/containerd.sock timeout: 10 debug: false pull-image-on-create: true EOF # 验证配置,无警告即成功 crictl info [root@k8s-master-1 ~]# crictl images
K8s配置ipvs
ipvs 是linux里的一个负载均衡软件,默认在linux内核里就安装了,修改k8s里的一个配置,负载均衡的时候使用ipvs做为默认的负载均衡软件,如果不修改默认是iptables
ipvs 是linux里的一个负载均衡软件,默认在linux内核里就安装了,修改k8s里的一个配置,负载均衡的时候使用ipvs做为默认的负载均衡软件,如果不修改默认是iptables
后续组件安装
安装dashboard
部署dashboard
mkdir dashboard && cd dashboard #创建部署文档 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml #暴露dashboard,修改配置内容 kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard #在弹出的 vi 界面中,找到 `type: ClusterIP` 改为 `type: NodePort` #查看端口 #会看到类似 `443:3xxxx/TCP` 的输出。记住这个 **3xxxx** 端口号。 kubectl get svc -n kubernetes-dashboard
创建管理账号
编写账号文件
vim dashboard-admin.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard #应用配置 kubectl apply -f dashboard-admin.yaml
获取登录token
#获取token kubectl -n kubernetes-dashboard create token admin-user
暴露服务&访问
在你的浏览器输入: https://<你的节点IP>:<刚才查到的3xxxx端口>
登录
安装metric-server
在 Kubernetes 集群中,Metrics Server 用于聚合资源监控数据。部署成功后,可支持 kubectl top 命令及 HPA(水平自动扩容)功能
完整部署流程
下载资源文件
从官方仓库获取最新版本的部署清单
#master执行 mkdir metrics && cd metrics wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.8.1/components.yaml
镜像准备
渡渡鸟拉取镜像
# 在所有节点执行(Master 和 Nodes) ctr -n k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/metrics-server/metrics-server:v0.8.1 # 打标为官方镜像名 ctr -n k8s.io images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/metrics-server/metrics-server:v0.8.1 registry.k8s.io/metrics-server/metrics-server:v0.8.1 #查看镜像 crictl images
修改配置文件(components.yaml)
修改后(image:镜像的实际地址)
添加:--kubelet-insecure-tls 这一行,args参数的作用是当容器启动的时候,传递这些参数给entrypoint指定运行的命令使用的,需要回顾Dockerfile镜像制作的时候的指令entrypoint的作用。
containers:
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
image: registry.k8s.io/metrics-server/metrics-server:v0.8.1
应用配置
kubectl apply -f components.yaml
验证方案
服务状态检查
确保 Pod 处于 1/1 Running 状态,且重启次数(RESTARTS)为 0。
kubectl get pods -n kube-system | grep metrics-server
数据链路验证(核心)
等待一分钟(采样)后执行:
# 验证节点监控 kubectl top nodes # 验证 Pod 监控 (注意:必须加 -A 查看所有空间) kubectl top pod -A
API聚合层验证
状态应显示为true
kubectl get apiservice v1beta1.metrics.k8s.io
注意事项
| 重点项目 | 描述与对策 |
|---|---|
| 端口冲突 | 在开启 hostNetwork 时,必须将默认的 10250 端口改为其他空闲端口(如 4443),否则会因与 Kubelet 冲突导致 CrashLoopBackOff。 |
| Namespace 限制 | kubectl top pod 默认只查 default 空间。验证时务必加 -n <空间名> 或 -A。 |
| 网络超时 | 若出现 i/o timeout 日志,说明 Pod 无法访问 API Server 虚拟 IP (10.96.0.1),改用 hostNetwork: true 是最快的规避方案。 |
| 镜像同步 | 必须确保集群内每一个节点都有 Metrics Server 镜像,否则 Pod 调度到无镜像节点会报错 ImagePullBackOff。 |
更多推荐


所有评论(0)