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:给集群下指令的“控制台”。

此时的状态:骨架搭好了,但还没通电,没联网。

第四层: 激活(初始化与神经系统)

这是最容易出错的一步,也是最关键的一步。

  1. Master 初始化 (**kubeadm init**):

    • 这一步会启动“大脑”(Control Plane):apiserver、controller-manager、scheduler。

    • 它会生成一串 kubeadm join 令牌。

  2. 网络插件(CNI):

    • 初始化完你会发现节点是 NotReady。因为 Pod 之间还不能跨机器说话。

    • 你需要部署 Flannel 或 Calico。这相当于给集群拉网线。

  3. 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。

更多推荐