kubeadm部署1.28版本k8s
一、初始化k8s实验环境
三台虚拟机基本配置:操作系统centos7.6,4G内存/4核CPU/60G硬盘。NAT网络。
注意开启虚拟机虚拟化引擎:Intel VT-x 、虚拟化CPU性能计算器、虚拟化IOMMU。
| K8s集群角色 | IP地址 | 主机名 | 安装的组件 |
|---|---|---|---|
| 控制节点 | 192.168.200.180 | k8s-master | kube-apiserver、kube-controller-manager、kube-scheduler、docker、etcd、calico |
| 工作节点 | 192.168.200.181 | k8s-node1 | kubelet、kube-proxy、docker、calico、coreDNS |
| 工作节点 | 192.168.200.182 | k8s-node2 | kubelet、kube-proxy、docker、calico、coreDNS |
1、kubeadm和二进制安装k8s适用场景分析
kubeadm是官方提供的开源工具,用于快速搭建kubernetes集群,目前比较方便和推荐使用的。
kubeadmi int 以及 kubeadm join 这两个命令可以快速创建 kubernetes集群。kubeadm 初始化 k8s,所有的组件都是以pod形式运行的,具备故障自恢复能力。
kubeadm 是工具,可以快速搭建集群,也就是相当于程序脚本自动部署,简化操作。证书、组件资源清单文件都是自动创建的,屏蔽了很多细节,使得对各个模块感知很少。
kubeadm适合经常部署k8s集群的场景,或对自动化要求比较高的场景。
二进制:在官网下载相关组件的二进制包,如果手动安装,对k8s理解更加清楚,对集群组件的安装部署更加了解。
kubeadm和二进制都适合生产环境,在生产环境运行很稳定,具体根据实际项目评估。
2、创建虚拟机,修改IP
如下所示修改网卡信息,下面是控制节点的配置信息,工作节点仅IP地址不同。
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=92c69021-2981-4c15-8c9a-2d1efb6bb011
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.180
NETMASK=255.255.255.0
GATEWAY=192.168.200.2
# 修改dns文件
[root@localhost ~]# vi /etc/resolv.conf
nameserver 8.8.8.8
nameserver 114.114.114.114
# 重启网络
[root@localhost ~]# systemctl restart network
然后关闭虚拟机,克隆成node1和node2虚拟机。
3、配置主机名和hosts文件
配置机器主机名:
# 在192.168.200.180上执行
[root@localhost ~]# hostnamectl set-hostname k8s-master && bash
配置主机hosts文件,相互间通过主机名访问:
echo '''192.168.200.180 k8s-master
192.168.200.181 k8s-node1
192.168.200.182 k8s-node2''' >> /etc/hosts
4、关闭交换分区
SWAP是交换分区,如果机器内存不够,会使用swaq分区,但是swap分区的性能较低,k8s设计时为了提升性能,默认不允许使用交换分区。
kubeadm初始化的时候会监测swap是否关闭,若没有关闭,则初始化失败。如不想关闭交换分区,安装k8s的时候可以指定————ignore-preflight-error=Swap 来解决。
# 临时关闭交换分区
[root@k8s-master ~]# swapoff -a
[root@k8s-node1 ~]# swapoff -a
[root@k8s-node2 ~]# swapoff -a
[root@k8s-master ~]# free -m
total used free shared buff/cache available
Mem: 3934 151 3621 11 160 3556
Swap: 0 0 0
# 永久关闭交换分区
# 编辑/etc/fstab文件,注释掉swap分区的行
[root@k8s-master ~]# vim /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=1f767b34-97e1-4fd0-a40e-f078e9535bfa /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
5、配置内核参数
三个机器均执行该操作。
[root@k8s-master ~]# modprobe br_netfilter
[root@k8s-master ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@k8s-master ~]# 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
[root@k8s-master ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
(1)sysctl命令
在运行时配置内核参数
-p 从指定的文件加载系统参数,如不指定即从 /etc/sysctl.conf 文件中加载。
(2)modprobe br_netfilter
br_netfilter模块是docker网络插件的依赖模块,如果不加载,docker网络插件将无法工作。
(3)net.bridge.bridge-nf-call-iptables
在centos安装docker,执行 docker info 时,会提示如下警告:
Warning: bridge-nf-call-iptables is disabled
Warning: bridge-nf-call-ip6tables is disabled
警告提示表明,需要设置net.bridge.bridge-nf-call-iptables和net.bridge.bridge-nf-call-ip6tables参数为1,才能使docker网络插件正常工作。
(4)net.ipv4.ip_forward
默认情况下,内核不支持IP转发,需要设置net.ipv4.ip_forward为1,才能使docker网络插件正常工作。
如没配置,kubeadm初始化时,会提示如下报错:
ERROR FileContent--proc-sys-net-ipv4-ip_forward: /proc/sys/net/ipv4/ip_forward: contents are not set to 1
出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的 ip 地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
要让 Linux 系统具有路由转发功能,需要配置一个 Linux 的内核参数 net.ipv4.ip_forward。这个参数指定了 Linux 系统当前对路由转发功能的支持情况;其值为 0 时表示禁止进行 IP 转发;如果是 1,则说明 IP 转发功能已经打开。
6、关闭防火墙和selinux
# 关闭防火墙
[root@k8s-master ~]# systemctl stop firewalld; systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
# 关闭selinux
[root@k8s-master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 修改完selinux配置文件后,需要重启系统才生效
# 显示Disabled 说明已经关闭
[root@k8s-master ~]# getenforce
Disabled
7、配置repo源
# 备份基础源
[root@k8s-master ~]# mkdir /etc/yum.repos.d/repo.bak
[root@k8s-master ~]# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo.bak/
# 添加阿里云源
[root@k8s-master ~]# curl -o /etc/yum.repos.d/CenOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2523 100 2523 0 0 34062 0 --:--:-- --:--:-- --:--:-- 34561
# 配置国内docker源
[root@k8s-master ~]# yum install yum-utils -y
[root@k8s-master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
# 配置epel源
[root@k8s-master ~]# yum install -y wget
[root@k8s-master ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
# 配置安装kubernetes组件需要的阿里云源
[root@k8s-master ~]# cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
8、配置时区和时间同步
# 1.配置主节点为NTP时间服务器
[root@k8s-master ~]# yum install chrony -y
[root@k8s-master ~]# systemctl start chronyd && systemctl enable chronyd
[root@k8s-master ~]# vi /etc/chrony.conf
###### 注释默认同步服务器,添加阿里时间同步 #########
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp.aliyun.com iburst
###### 配置允许同网段主机使用本机的NTP服务 ###########
# Allow NTP client access from local network.
allow 192.168.200.0/24
# 3.重启时间同步服务让配置生效
[root@k8s-master ~]# systemctl restart chronyd
# 4.检查时间同步状态
[root@k8s-node1 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* k8s-master 3 6 17 34 +4386ns[ +40us] +/- 26ms
[root@k8s-master ~]# date
Tue Dec 24 22:32:16 CST 2024
9、开启ipvs
ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的 4 层 LAN 交换,作为 Linux 内核的一部分。ipvs 运行在主机上,在真实服务器集群前充当负载均衡器。ipvs 可以将基于 TCP 和 UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。
[root@k8s-master ~]# vi /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ 0 -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
[root@k8s-master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
ip_vs_ftp 13079 0
nf_nat 26787 1 ip_vs_ftp
ip_vs_sed 12519 0
ip_vs_nq 12516 0
ip_vs_sh 12688 0
ip_vs_dh 12688 0
ip_vs_lblcr 12922 0
ip_vs_lblc 12819 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs_wlc 12519 0
ip_vs_lc 12516 0
ip_vs 141432 22 ip_vs_dh,ip_vs_lc,ip_vs_nq,ip_vs_rr,ip_vs_sh,ip_vs_ftp,ip_vs_sed,ip_vs_wlc,ip_vs_wrr,ip_vs_lblcr,ip_vs_lblc
nf_conntrack 133053 2 ip_vs,nf_nat
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
(1)ipvs 和 iptable 对比分析:
kube-proxy 支持 iptables 和 ipvs 两种模式, 在 kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于 netfilter的,但是 ipvs 采用的是 hash 表,因此当 service 数量达到一定规模时,hash 查表的速度优势就会显现出来,从而提高 service 的服务性能。
那么 ipvs 模式和 iptables 模式之间有哪些差异呢?
- ipvs 为大型集群提供了更好的可扩展性和性能
- ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)
- ipvs 支持服务器健康检查和连接重试等功能
11、安装基础软件包
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
如果 firewalld 不习惯,可以安装 iptables。
# 安装
yum install -y iptables-services
# 关闭
service iptables stop && systemctl disable iptables
# 清空默认规则
iptables -F
二、安装 docker 服务
1、安装docker-ce
[root@k8s-master ~]# yum install -y docker-ce-26.1.3 docker-ce-cli-26.1.3 containerd.io
[root@k8s-master ~]# systemctl start docker && systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
2、配置加速器
[root@k8s-master ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": [ "https://d23993ac0d3d404abf3d96846337d9a7.mirror.swr.myhuaweicloud.com" ],
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 修改 docker 文件驱动为 systemd,默认为 cgroupfs,kubelet 默认使用 systemd,两者必须一致才可以
[root@k8s-master ~]# systemctl daemon-reload && systemctl restart docker && systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2024-12-24 23:15:48 CST; 5ms ago
3、配置cri-docker环境(1.28的操作)
[root@k8s-master ~]# yum install -y libcgroup
[root@k8s-master ~]# ls
anaconda-ks.cfg cri-dockerd-0.3.2-3.el7.x86_64.rpm
[root@k8s-master ~]# rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:cri-dockerd-3:0.3.2-3.el7 ################################# [100%]
[root@k8s-master ~]# vi /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
# 重启cri-docker
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart cri-docker && systemctl enable cri-docker
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /usr/lib/systemd/system/cri-docker.service.
三、安装 k8s
1、安装初始化k8s需要的软件包
Kubeadm: kubeadm 是一个工具,用来初始化 k8s 集群的。
kubelet: 安装在集群所有节点上,用于启动 Pod 的。
kubectl: 通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。
# 查看可用的k8s版本
[root@k8s-master ~]# yum list kubelet --showduplicates | sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
kubelet.x86_64 1.28.9-150500.2.1 kubernetes
kubelet.x86_64 1.28.8-150500.1.1 kubernetes
kubelet.x86_64 1.28.7-150500.1.1 kubernetes
kubelet.x86_64 1.28.6-150500.1.1 kubernetes
kubelet.x86_64 1.28.5-150500.1.1 kubernetes
kubelet.x86_64 1.28.4-150500.1.1 kubernetes
kubelet.x86_64 1.28.3-150500.1.1 kubernetes
kubelet.x86_64 1.28.2-150500.1.1 kubernetes
kubelet.x86_64 1.28.2-150500.1.1 @kubernetes
kubelet.x86_64 1.28.15-150500.1.1 kubernetes
kubelet.x86_64 1.28.14-150500.2.1 kubernetes
kubelet.x86_64 1.28.13-150500.1.1 kubernetes
kubelet.x86_64 1.28.12-150500.1.1 kubernetes
kubelet.x86_64 1.28.1-150500.1.1 kubernetes
kubelet.x86_64 1.28.11-150500.1.1 kubernetes
kubelet.x86_64 1.28.10-150500.1.1 kubernetes
kubelet.x86_64 1.28.0-150500.1.1 kubernetes
Installed Packages
Available Packages
# 安装k8s
[root@k8s-master ~]# yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
# 修改/etc/sysconfig/kubelet文件,实现cgroupdriver和kubelet的cgroup的一致
[root@k8s-master ~]# vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
[root@k8s-master ~]# systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
# 上传 离线镜像包
[root@k8s-master ~]# yum install -y lrzsz
[root@k8s-master ~]# rz
[root@k8s-master ~]# ls
anaconda-ks.cfg etcd-3.5.9.tar kube-proxy-v1.28.2.tar
coredns-v1.10.1.tar kube-apiserver-v1.28.2.tar kube-scheduler-v1.28.2.tar
cri-dockerd-0.3.2-3.el7.x86_64.rpm kube-controller-manager-v1.28.2.tar pause-3.9.tar
[root@k8s-master ~]# du -sh *
4.0K anaconda-ks.cfg
52M coredns-v1.10.1.tar
9.2M cri-dockerd-0.3.2-3.el7.x86_64.rpm
282M etcd-3.5.9.tar
122M kube-apiserver-v1.28.2.tar
118M kube-controller-manager-v1.28.2.tar
72M kube-proxy-v1.28.2.tar
59M kube-scheduler-v1.28.2.tar
740K pause-3.9.tar
# 如果已经有三台虚拟机,需要scp传递镜像包
[root@k8s-master ~]# scp ./*.tar k8s-node1:/root
coredns-v1.10.1.tar 100% 51MB 127.1MB/s 00:00
etcd-3.5.9.tar 100% 282MB 107.5MB/s 00:02
kube-apiserver-v1.28.2.tar 100% 121MB 91.7MB/s 00:01
kube-controller-manager-v1.28.2.tar 100% 117MB 96.6MB/s 00:01
kube-proxy-v1.28.2.tar 100% 71MB 87.5MB/s 00:00
kube-scheduler-v1.28.2.tar 100% 59MB 101.9MB/s 00:00
pause-3.9.tar 100% 739KB 90.1MB/s 00:00
[root@k8s-master ~]# scp ./*.tar k8s-node2:/root
...略
# 加载 镜像包
[root@k8s-master ~]# docker load -i etcd-3.5.9.tar
e023e0e48e6e: Loading layer [==================================================>] 327.7kB/327.7kB
...略
a4563151d59b: Loading layer [==================================================>] 19.67MB/19.67MB
Loaded image: registry.aliyuncs.com/google_containers/etcd:3.5.9-0
[root@k8s-master ~]# docker load -i kube-proxy-v1.28.2.tar
d2a4b045f3d0: Loading layer [==================================================>] 19.63MB/19.63MB
5e8877c87d9f: Loading layer [==================================================>] 55.05MB/55.05MB
Loaded image: registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
[root@k8s-master ~]# docker load -i coredns-v1.10.1.tar
6a4a177e62f3: Loading layer [==================================================>] 203.8kB/203.8kB
398c9baff0ce: Loading layer [==================================================>] 53.41MB/53.41MB
Loaded image: registry.aliyuncs.com/google_containers/coredns:v1.10.1
[root@k8s-master ~]# docker load -i kube-apiserver-v1.28.2.tar
47c446271f8d: Loading layer [==================================================>] 1.607MB/1.607MB
c5af401a13b1: Loading layer [==================================================>] 121.7MB/121.7MB
Loaded image: registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
[root@k8s-master ~]# docker load -i kube-scheduler-v1.28.2.tar
86adbf8edefb: Loading layer [==================================================>] 56.01MB/56.01MB
Loaded image: registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
[root@k8s-master ~]# docker load -i kube-controller-manager-v1.28.2.tar
5a79e3f66baa: Loading layer [==================================================>] 117.7MB/117.7MB
Loaded image: registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
[root@k8s-master ~]# docker load -i pause-3.9.tar
e3e5579ddd43: Loading layer [==================================================>] 746kB/746kB
Loaded image: registry.aliyuncs.com/google_containers/pause:3.9
# 如有三台虚拟机,在node1和node2上加载镜像包
[root@k8s-node1 ~]# for i in /root/*.tar;do docker load -i $i;done
[root@k8s-node2 ~]# for i in /root/*.tar;do docker load -i $i;done
# 查看镜像
[root@k8s-master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-proxy v1.20.6 9a1ebfd8124d 3 years ago 118MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.20.6 560dd11d4550 3 years ago 116MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.20.6 b93ab2ec4475 3 years ago 47.3MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.20.6 b05d611c1af9 3 years ago 122MB
calico/pod2daemon-flexvol v3.18.0 2a22066e9588 3 years ago 21.7MB
calico/node v3.18.0 5a7c4970fbc2 3 years ago 172MB
calico/cni v3.18.0 727de170e4ce 3 years ago 131MB
calico/kube-controllers v3.18.0 9a154323fbf7 3 years ago 53.4MB
registry.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 4 years ago 253MB
registry.aliyuncs.com/google_containers/coredns 1.7.0 bfe3a36ebd25 4 years ago 45.2MB
registry.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 4 years ago 683kB
补充说明,如果没有镜像文件包,可以用如下命令拉取镜像:
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
``
### 1-2、如果在此处克隆两个node配置操作
关闭master机器,完整克隆出node1和node2。先开启node1进行配置
```bash
[root@k8s-master ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 克隆的机器需要删除uuid
IPADDR=192.168.200.181
NETMASK=255.255.255.0
GATEWAY=192.168.200.2
# 改主机名
[root@k8s-master ~]# hostnamectl set-hostname k8s-node1
[root@k8s-master ~]# bash
bash
[root@k8s-node1 ~]# systemctl restart network
# 与master时间同步
[root@k8s-node1 ~]# vi /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server k8s-master iburst
[root@k8s-node1 ~]# systemctl restart chronyd
[root@k8s-node1 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? k8s-master 0 7 0 - +0ns[ +0ns] +/- 0ns
再开启node2进行配置
[root@k8s-master ~]# hostnamectl set-hostname k8s-node2
[root@k8s-master ~]# bash
bash
[root@k8s-node2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.182
NETMASK=255.255.255.0
GATEWAY=192.168.200.2
[root@k8s-node2 ~]# systemctl restart network
[root@k8s-node2 ~]# vi /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server k8s-master iburst
[root@k8s-node2 ~]# systemctl restart chronyd
然后开启master,三台机器配置免密登录
# 1、三台机器都生成ssh密钥,一路回车
[root@k8s-master ~]# ssh-keygen
[root@k8s-node1 ~]# ssh-keygen
[root@k8s-node2 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:56kFtc+z1a7/cWTg9Hlh7xLcf8PHLh/LSQF113kK8os root@k8s-master
The keys randomart image is:
+---[RSA 2048]----+
| .=|
| . . ..=|
| .o oo+.|
| . ..++++|
| S o. .+oB|
| +E+. .B+|
| + + o*O|
| o +++X|
| . . .OB|
+----[SHA256]-----+
# 三台机器都执行将公钥拷贝到其他机器
[root@k8s-master ~]# ssh-copy-id k8s-master
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'k8s-master (192.168.200.180)' can't be established.
ECDSA key fingerprint is SHA256:u7nlxwc8AwCbT5fFs2kWLcQQJpZ4cTlLBhl8qWRZtis.
ECDSA key fingerprint is MD5:80:39:be:e6:78:40:82:6b:30:de:69:74:64:11:a0:7d.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@k8s-master's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'k8s-master'"
and check to make sure that only the key(s) you wanted were added.
[root@k8s-master ~]# ssh-copy-id k8s-node1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'k8s-node1 (192.168.200.181)' can't be established.
ECDSA key fingerprint is SHA256:u7nlxwc8AwCbT5fFs2kWLcQQJpZ4cTlLBhl8qWRZtis.
ECDSA key fingerprint is MD5:80:39:be:e6:78:40:82:6b:30:de:69:74:64:11:a0:7d.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@k8s-node1's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'k8s-node1'"
and check to make sure that only the key(s) you wanted were added.
[root@k8s-master ~]# ssh-copy-id k8s-node2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'k8s-node2 (192.168.200.182)' can't be established.
ECDSA key fingerprint is SHA256:u7nlxwc8AwCbT5fFs2kWLcQQJpZ4cTlLBhl8qWRZtis.
ECDSA key fingerprint is MD5:80:39:be:e6:78:40:82:6b:30:de:69:74:64:11:a0:7d.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@k8s-node2's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'k8s-node2'"
and check to make sure that only the key(s) you wanted were added.
2、初始化 k8s 集群
把初始化 k8s 集群需要的离线镜像包上传到 master1、node1、node2 机器上,手动解压:
# 初始化 k8s 集群
# 注:--image-repository registry.aliyuncs.com/google_containers:手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm 默认从 k8s.grc.io 拉取镜像,但是 k8s.gcr.io访问不到,所以需要指定从 registry.aliyuncs.com/google_containers 仓库拉取镜像。
[root@k8s-master ~]# kubeadm init --kubernetes-version=v1.28.2 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.200.180 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
# 显示如下信息,表示初始化成功
Your Kubernetes control-plane has 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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.200.180:6443 --token ic9mur.14n0sj64gv6rjc84 \
--discovery-token-ca-cert-hash sha256:2392db8eba82ba84fc0153599aa161c40448f7f64fe0c531a2f98c48fb147d7a
# 上面这个命令是把 node 节点加入集群,需要保存下来,每个人的都不一样
配置 kubectl 的配置文件 config,相当于对 kubectl 进行授权,这样 kubectl 命令可以使用这个证书对 k8s 集群进行管理。
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 2m13s v1.28.2
# 此时集群状态还是 NotReady 状态,因为没有安装网络插件。
3、扩容集群
(1)添加第一个工作节点
# 当token过期或丢失,可以使用如下查看加入节点的命令
[root@k8s-master ~]# kubeadm token create --print-join-command
kubeadm join 192.168.200.180:6443 --token dgzhsb.ngeaupe77fd1lr2y --discovery-token-ca-cert-hash sha256:47b8eb2f92736a73f4358e6e7f286c88f80db91fcae29e81c6055e1fc0b37c71
# 将node1加入集群:
[root@k8s-node1 ~]# kubeadm join 192.168.200.180:6443 --token ic9mur.14n0sj64gv6rjc84 --discovery-token-ca-cert-hash sha256:2392db8eba82ba84fc0153599aa161c40448f7f64fe0c531a2f98c48fb147d7a --cri-socket=unix:///var/run/cri-dockerd.sock
# 查看集群状态
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 3m48s v1.28.2
k8s-node1 NotReady <none> 14s v1.28.2
(2)添加第二个工作节点
# 将node2加入集群:
[root@k8s-node2 ~]# kubeadm join 192.168.200.180:6443 --token ic9mur.14n0sj64gv6rjc84 --discovery-token-ca-cert-hash sha256:2392db8eba82ba84fc0153599aa161c40448f7f64fe0c531a2f98c48fb147d7a --cri-socket=unix:///var/run/cri-dockerd.sock
# 查看集群状态
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 6m49s v1.28.2
k8s-node1 NotReady <none> 21s v1.28.2
k8s-node2 NotReady <none> 9s v1.28.2
看到上面说明 node1、node2 节点已经加入到集群了,充当工作节点。
(3)将工作节点ROLES设置为worker
[root@k8s-master ~]# kubectl label node k8s-node1 node-role.kubernetes.io/worker=worker
node/k8s-node1 labeled
[root@k8s-master ~]# kubectl label node k8s-node2 node-role.kubernetes.io/worker=worker
node/k8s-node2 labeled
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 8m49s v1.28.2
k8s-node1 NotReady worker 2m21s v1.28.2
k8s-node2 NotReady worker 2m9s v1.28.2
注意:上面状态都是 NotReady 状态,说明没有安装网络插件
4、安装网络组件-Calico
上传 calico.yaml 到 k8s-master 上,使用 yaml 文件安装 calico 网络插件。
在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml
calico.yaml 文件适配 3.25 版本。
# calico.yaml文件
[root@k8s-master ~]# ls
calico.yaml
[root@k8s-master ~]# du -sh *
236K calico.yaml
# 下载calico.yaml
wget https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml
[root@k8s-master ~]# kubectl apply -f calico.yaml
# STATUS 状态是 Running,说明安装成功。
[root@k8s-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-658d97c59c-ht2wn 1/1 Running 0 2m32s
calico-node-2fbw6 1/1 Running 0 2m32s
calico-node-kvf8p 1/1 Running 0 2m32s
calico-node-t9995 1/1 Running 0 2m32s
coredns-66f779496c-8xqqj 1/1 Running 0 48m
coredns-66f779496c-spg62 1/1 Running 0 48m
etcd-k8s-master 1/1 Running 0 49m
kube-apiserver-k8s-master 1/1 Running 0 49m
kube-controller-manager-k8s-master 1/1 Running 0 49m
kube-proxy-bh6b8 1/1 Running 0 48m
kube-proxy-f6m77 1/1 Running 0 42m
kube-proxy-ggpth 1/1 Running 0 42m
kube-scheduler-k8s-master 1/1 Running 0 49m
# STATUS 状态是 Ready,说明节点已经就绪。
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 49m v1.28.2
k8s-node1 Ready worker 43m v1.28.2
k8s-node2 Ready worker 42m v1.28.2
5、测试 k8s 网络和 dns 是否正常
把 busybox-1-28.tar.gz 上传到 xianchaonode1、xianchaonode2 节点,手动解压
首先测试网络:
# 上传 busybox-1-28.tar.gz,传递给 k8s-node1、k8s-node2 节点
[root@k8s-master ~]# rz
[root@k8s-master ~]# scp busybox-1-28.tar.gz k8s-node1:/root
busybox-1-28.tar.gz 100% 1338KB 88.6MB/s 00:00
[root@k8s-master ~]# scp busybox-1-28.tar.gz k8s-node2:/root
busybox-1-28.tar.gz 100% 1338KB 19.6MB/s 00:00
# 解压 busybox-1-28.tar.gz
[root@k8s-node1 ~]# docker load -i busybox-1-28.tar.gz
432b65032b94: Loading layer [==================================================>] 1.36MB/1.36MB
Loaded image: busybox:1.28
[root@k8s-node2 ~]# docker load -i busybox-1-28.tar.gz
432b65032b94: Loading layer [==================================================>] 1.36MB/1.36MB
Loaded image: busybox:1.28
# 创建 busybox pod
# -- sh:作用是启动一个交互式 shell,这样在容器中就可以执行命令了。
[root@k8s-master ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
If you dont see a command prompt, try pressing enter.
/ # ping www.baidu.com
PING www.baidu.com (183.2.172.42): 56 data bytes
64 bytes from 183.2.172.42: seq=0 ttl=127 time=27.719 ms
64 bytes from 183.2.172.42: seq=1 ttl=127 time=22.266 ms
64 bytes from 183.2.172.42: seq=2 ttl=127 time=23.727 ms
# 通过上面的命令,已经可以ping通了,说明 calico 网络插件安装成功。
然后测试dns:
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
# ClusterIP 是 Kubernetes Service 的默认类型,它为服务分配一个集群内部的虚拟 IP 地址,这个地址只在集群网络中可达。每个服务都会获得一个唯一的 ClusterIP,用于访问该服务提供的资源或应用程序。
# 10.96.0.1 是k8s集群的 apiserver 的 clusterIP
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 54m
# 10.96.0.10 是k8s内部的 dns 服务
[root@k8s-master ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 54m
10.96.0.10 就是 coreDNS 的 clusterIP,说明 dns 已经配置好了。
解析内部 Service 的名称,是通过 coreDNS 来解析的。
kubernetes.default.svc.cluster.local的:是 Kubernetes 集群中的一种特殊的 DNS 名称,用于解析集群内的 API Server 的服务地址。这是 Kubernetes 服务发现机制的一部分,允许 Pod 内的应用通过这个预定义的 DNS 名称与 Kubernetes API Server 进行通信。
- kubernetes:这是默认的服务名称,对应于 Kubernetes API Server。
- default:这表示服务所在的命名空间(Namespace)。在这个例子中,它位于默认的命名空间中。
- svc:这是一个简写,代表“service”,表明这是一个 Kubernetes Service 类型的资源。
- cluster.local:这是集群的域后缀,通常配置在集群级别,用来标识集群内部的 DNS 查询。不同的集群可能会有不同的配置,但 cluster.local 是一个常见的默认值。
注意:busybox 要使用指定的1.28版本,不能用最新版本,最新版本,nslookup 会解析不到dns和ip。
四、k8s可视化UI界面dashboard
1、安装dashboard
仅需在k8s-master上操作。
# 下载dashboard所需的yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 修改配置文件,配置 dashboard 访问端口
[root@k8s-master ~]# vim recommended.yaml
# 修改spec下的内容如下:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: dashboard-metrics-scraper
name: dashboard-metrics-scraper
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30000
selector:
k8s-app: kubernetes-dashboard
# 安装dashboard
[root@k8s-master ~]# kubectl apply -f recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
# 查看dashboard状态
[root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-5657497c4c-pjn56 1/1 Running 0 10m
kubernetes-dashboard-78f87ddfc-57b84 1/1 Running 0 10m
# 如上所示,dashboard 已经安装成功。
# 查看dashboard前端的service
[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper NodePort 10.96.19.163 <none> 443:30000/TCP 10m
kubernetes-dashboard ClusterIP 10.98.91.215 <none> 443/TCP 10m
# 检查相关服务运行状态
[root@k8s-master ~]# kubectl get deployment kubernetes-dashboard -n kubernetes-dashboard
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-dashboard 1/1 1 1 11m
上面可看到 service 类型是 NodePort,master-ip:30000 端口即可访问 kubernetes dashboard,在浏览器(使用火狐浏览器)访问如下地址: https://192.168.200.180:30000

2、通过 token 令牌访问 dashboard
创建管理员 token,具有查看任何空间的权限,可以管理所有资源对象
# 编辑yaml,创建管理用户
[root@k8s-master ~]# vi 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
# 用户创建
[root@k8s-master ~]# kubectl apply -f dashboard_admin.yaml
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
# 创建并查看admin-user的令牌值
[root@k8s-master ~]# kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6Ijh4TDJ2Y2pVWTlRWU9taUZrcHplRW9Kc3FDbmZFN0x6UFNfeXVLaEpETlUifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzgwMzY1NDc4LCJpYXQiOjE3ODAzNjE4NzgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiYWI3OTY0NDUtODE2Yy00NjljLTg0MWYtMjU2YTYwNDhlMTc4In19LCJuYmYiOjE3ODAzNjE4NzgsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.IOBvs8XI-kQw_sjY-o2F_FtO9dYSGcDjOySuOnieLtAwBsn4snOjMlHVewNxR_hvLobOJjo1DzPw2IrDzYMLHF-GUN9VFVtG1GO2Yrd_Grq-uxa47UwM0xDSqOUzF089P7pbcskfRa4QLPzB15BvFybcrl1A7P8IUcGg0iUvbM7oQC5uBW2P6ffZh-naH0L_p6jaBjuVuu_jvknD4-Pyn7yha2vYGBg6mjHoSaQDegutsUkG4tK6G_sOprU65tS3WgDTOnACk7vcd6j34WOd9RKqmxySYD9aVw7WS80SgITut7nUqIWY0OanxfhVv_RVZmwQySHkX_hoKs6KCGjNLQ
复制令牌值内容到浏览器token登录处,然后sign in,进入集群管理页面:

3、关于 port、targetport、nodeport 的说明
nodeport 是集群外流量访问集群内服务的端口,比如客户访问 nginx,apache。
port 是集群内的 pod 互相通信用的端口类型,比如 nginx 访问 mysql,而 mysql 是不需要让客户访问到的,port 是 service 的的端口。
targetport 目标端口,也就是最终端口,也就是 pod 的端口。
五、安装 metrics-server 组件
metrics-server 是一个集群范围内的资源数据集和工具,同样的,metrics-server 也只是显示数据,并不提供数据存储服务,主要关注的是资源度量 API 的实现,比如 CPU、文件描述符、内存、请求延时等指标,metric-server 收集数据给 k8s 集群内使用,如 kubectl,hpa,scheduler 等。
Metrics Server 是 Kubernetes 内置自动缩放管道的可扩展、高效的容器资源指标来源。Metrics Server 从 Kubelets 收集资源指标,并通过 Metrics API 在 Kubernetes apiserver 中公开它们,以供 Horizontal Pod Autoscaler 和Vertical Pod Autoscaler 使用。Metrics API 也可以通过访问kubectl top,从而更容易调试自动缩放管道。
kubectl top 是一个用于查看 Kubernetes 集群中资源使用情况的命令。它可以显示节点或Pod的CPU、内存和存储的使用情况。该命令要求正确配置Metrics Server并在服务器上工作。
# 先到Metrics Server项目地址,查询对应版本支持那个K8S版本
# 由于我安装的k8S版本是1.28.2,所以需要下载1.21+的版本
[root@k8s-master ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
[root@k8s-master ~]# ls
high-availability-1.21+.yaml
# 修改high-availability-1.21+.yaml配置文件,把镜像的地址修改阿里云镜像,并添加一个参数kubelet-insecure-tls
144 containers:
145 - args:
146 - --cert-dir=/tmp
147 - --secure-port=10250
148 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
149 - --kubelet-use-node-status-port
150 - --metric-resolution=15s
151 - --kubelet-insecure-tls
152 image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.0
153 imagePullPolicy: IfNotPresent
# 执行kubectl命令部署
[root@k8s-master ~]# kubectl apply -f high-availability-1.21+.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
poddisruptionbudget.policy/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
# 检查
[root@k8s-master ~]# kubectl get apiservices | grep metrics
v1beta1.metrics.k8s.io kube-system/metrics-server True 70s
1、测试 kubectl top 命令
# 查看 pod 资源使用情况:
[root@k8s-master ~]# kubectl top pods -n kube-system
NAME CPU(cores) MEMORY(bytes)
calico-kube-controllers-658d97c59c-ht2wn 2m 74Mi
calico-node-2fbw6 25m 152Mi
calico-node-kvf8p 27m 155Mi
calico-node-t9995 24m 146Mi
coredns-66f779496c-8xqqj 1m 54Mi
coredns-66f779496c-spg62 1m 28Mi
etcd-k8s-master 15m 107Mi
kube-apiserver-k8s-master 42m 420Mi
kube-controller-manager-k8s-master 14m 159Mi
kube-proxy-bh6b8 1m 76Mi
kube-proxy-f6m77 1m 75Mi
kube-proxy-ggpth 1m 74Mi
kube-scheduler-k8s-master 3m 75Mi
metrics-server-7d79df8559-cck8z 2m 17Mi
metrics-server-7d79df8559-rt77r 3m 17Mi
# 查看 节点 资源使用情况:
[root@k8s-master ~]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 145m 7% 1269Mi 33%
k8s-node1 62m 3% 731Mi 19%
k8s-node2 65m 3% 698Mi 18%

浙公网安备 33010602011771号