【k8s、云原生】基于metrics-server弹性伸缩

第四阶段

时 间:2023年8月18日

参加人:全班人员

内 容:

基于metrics-server弹性伸缩

目录

一、Kubernetes部署方式

(一)minikube

(二)二进制包

(三)Kubeadm

二、基于kubeadm部署K8S集群

(一)环境准备

(二)部署kubernetes集群

[(三)安装Dashboard UI](#(三)安装Dashboard UI)

(四)metrics-server服务部署

(五)弹性伸缩


一、 Kubernetes部署方式

官方提供Kubernetes部署3种方式

(一) minikube

Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。

官方文档:Install Tools | Kubernetes

(二) 二进制包

从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。目前企业生产环境中主要使用该方式。

下载地址:

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md#v1113

(三) Kubeadm

Kubeadm 是谷歌推出的一个专门用于快速部署 kubernetes 集群的工具。在集群部署的过程中,可以通过 kubeadm init 来初始化 master 节点,然后使用 kubeadm join 将其他的节点加入到集群中。

1、Kubeadm 通过简单配置可以快速将一个最小可用的集群运行起来。它在设计之初关注点是快速安装并将集群运行起来,而不是一步步关于各节点环境的准备工作。同样的,kubernetes 集群在使用过程中的各种插件也不是 kubeadm 关注的重点,比如 kubernetes集群 WEB Dashboard、prometheus 监控集群业务等。kubeadm 应用的目的是作为所有部署的基础,并通过 kubeadm 使得部署 kubernetes 集群更加容易。

2、Kubeadm 的简单快捷的部署可以应用到如下三方面:

·新用户可以从 kubeadm 开始快速搭建 Kubernete 并了解。

·熟悉 Kubernetes 的用户可以使用 kubeadm 快速搭建集群并测试他们的应用。

·大型的项目可以将 kubeadm 配合其他的安装工具一起使用,形成一个比较复杂的系统。

·官方文档:

Kubeadm | Kubernetes
Installing kubeadm | Kubernetes

二、 基于kubeadm部署K8S集群

(一) 环境准备

|-----------------|------------|-----------------------------------|
| IP地址 | 主机名 | 组件 |
| 192.168.100.131 | k8s-master | kubeadm、kubelet、kubectl、docker-ce |
| 192.168.100.132 | k8s-node01 | kubeadm、kubelet、kubectl、docker-ce |
| 192.168.100.133 | k8s-node02 | kubeadm、kubelet、kubectl、docker-ce |

注意:所有主机配置推荐CPU:2C+ Memory:2G+

1 主机初始化配置

所有主机配置禁用防火墙和selinux

复制代码
[root@localhost ~]# setenforce 0

[root@localhost ~]# iptables -F

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

[root@localhost ~]# systemctl stop NetworkManager

[root@localhost ~]# systemctl disable NetworkManager

[root@localhost ~]# sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

2、 配置主机名并绑定hosts,不同主机名称不同

复制代码
[root@localhost ~]# hostname k8s-master

[root@localhost ~]# bash

[root@k8s-master ~]# cat << EOF >> /etc/hosts

192.168.100.131 k8s-master

192.168.100.132 k8s-node01

192.168.100.133 k8s-node02

EOF

root@localhost \~\]# hostname k8s-node01 \[root@k8s-node01 \~\]# cat /etc/hosts

root@localhost \~\]# hostname k8s-node02 \[root@k8s-node02 \~\]#cat /etc/hosts

3、 主机配置初始化

root@k8s-master \~\]# yum -y install vim wget net-tools lrzsz ![](https://file.jishuzhan.net/article/1693284636471332866/657b981d33734f0ead692107ee915371.png) > \[root@k8s-master \~\]# swapoff -a > > \[root@k8s-master \~\]# sed -i '/swap/s/\^/#/' /etc/fstab > > \[root@k8s-master \~\]# cat \<\< EOF \>\> /etc/sysctl.conf > > net.bridge.bridge-nf-call-ip6tables = 1 > > net.bridge.bridge-nf-call-iptables = 1 > > EOF > > \[root@k8s-master \~\]# modprobe br_netfilter > > \[root@k8s-master \~\]# sysctl -p ![](https://file.jishuzhan.net/article/1693284636471332866/b00b699163114fff90d624e01a7e5575.png) ****4、**** ****部署docker环境**** ****1)**** ****三台主机上分别部署 Docker 环境,因为 Kubernetes 对容器的编排需要 Docker 的支持。**** > \[root@k8s-master \~\]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo > > \[root@k8s-master \~\]# yum install -y yum-utils device-mapper-persistent-data lvm2 ****2)**** ****使用 YUM 方式安装 Docker 时,推荐使用阿里的 YUM 源。**** > \[root@k8s-master \~\]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ****3)清除缓存**** > \[root@k8s-master \~\]# yum clean all \&\& yum makecache fast ****4)启动docker**** > \[root@k8s-master \~\]# yum -y install docker-ce > > \[root@k8s-master \~\]# systemctl start docker > > \[root@k8s-master \~\]# systemctl enable docker ![](https://file.jishuzhan.net/article/1693284636471332866/6313f466e76a43119e31e5789ed9f10f.png) ****5)**** ****镜像加速器(所有主机配置)**** > \[root@k8s-master \~\]# cat \<\< END \> /etc/docker/daemon.json > > { "registry-mirrors":\[ "https://nyakyfun.mirror.aliyuncs.com"

}

END

6)重启docker

root@k8s-master \~\]# systemctl daemon-reload \[root@k8s-master \~\]# systemctl restart docker

(二) 部署kubernetes集群

1、组件介绍

三个节点都需要安装下面三个组件

****kubeadm:****安装工具,使所有的组件都会以容器的方式运行

****kubectl:****客户端连接K8S API工具

kubelet:运行在node节点,用来启动容器的工具

2、配置阿里云yum源

使用 YUM 方式安装 Kubernetes时,推荐使用阿里的 YUM 源。

root@k8s-master \~\]# ls /etc/yum.repos.d/ \[root@k8s-master \~\]# cat \> /etc/yum.repos.d/kubernetes.repo

3、安装kubelet kubeadm kubectl

所有主机配置

root@k8s-master \~\]# yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0

root@k8s-master \~\]# systemctl enable kubelet ![](https://file.jishuzhan.net/article/1693284636471332866/4ae7cddcf0514a1681869f6191b85818.png) \[root@k8s-master \~\]# kubectl version ![](https://file.jishuzhan.net/article/1693284636471332866/38760bf9d84d49559234db314fac9fe3.png) kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。 ****4、配置init-config.yaml**** Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配内容是通过 kubeadm config 命令写入配置文件的。 在master节点安装,master 定于为192.168.100.131,通过如下指令创建默认的init-config.yaml文件: > \[root@k8s-master \~\]# kubeadm config print init-defaults \> init-config.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/4262a824797b416b9e3ada6ce448abc2.png) ****init-config.yaml配置**** \[root@k8s-master \~\]# cat init-config.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/f128e1409983430fa44d42c0137bff61.png) ****5、安装master节点**** ****1)**** ****拉取所需镜像**** > \[root@k8s-master \~\]# kubeadm config images list --config init-config.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/abe631a3b7364908ae1a301209e49252.png) \[root@k8s-master \~\]# kubeadm config images pull --config init-config.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/77cf857fce79497a8d0c4f3b3e1887d0.png) ****2)**** ****安装matser节点**** > \[root@k8s-master \~\]# kubeadm init --config=init-config.yaml //初始化安装K8S ![](https://file.jishuzhan.net/article/1693284636471332866/447133c32f704138a80053d2324f8d68.png) ****3)**** ****根据提示操作**** kubectl 默认会在执行的用户家目录下面的.kube 目录下寻找config 文件。这里是将在初始化时\[kubeconfig\]步骤生成的admin.conf 拷贝到.kube/config > ****\[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**** ![](https://file.jishuzhan.net/article/1693284636471332866/a82fc637ec15471fb05ada90d4bf559f.png) Kubeadm 通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如 k8s-master 节点上查看节点信息都是"Not Ready"状态、Pod 的 CoreDNS无法提供服务等。 ![](https://file.jishuzhan.net/article/1693284636471332866/0a41b6b00a1e426dbbc8f976f339aaff.png) ****6、安装node节点**** ****1)**** ****根据master安装时的提示信息**** > \[root@k8s-node01 \~\]# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae ![](https://file.jishuzhan.net/article/1693284636471332866/ead03f8643e0443b81eac4bece6b05ab.png) > \[root@k8s-master \~\]# kubectl get nodes > > \[root@k8s-node02 \~\]# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae ![](https://file.jishuzhan.net/article/1693284636471332866/7a99ff0d1ec341f488000e116321d612.png) ****Master操作:**** ****\[root@k8s-master \~\]# kubectl get nodes**** ![](https://file.jishuzhan.net/article/1693284636471332866/46c56fde8eb04aeba7532dca743f692e.png) 前面已经提到,在初始化 k8s-master 时并没有网络相关配置,所以无法跟 node 节点通信,因此状态都是"NotReady"。但是通过 kubeadm join 加入的 node 节点已经在k8s-master 上可以看到。 ****7、安装flannel**** Master 节点NotReady 的原因就是因为没有使用任何的网络插件,此时Node 和Master的连接还不正常。目前最流行的Kubernetes 网络插件有Flannel、Calico、Canal、Weave 这里选择使用flannel。 ****所有主机:**** ****master上传kube-flannel.yml,所有主机上传flannel_v0.12.0-amd64.tar,cni-plugins-linux-amd64-v0.8.6.tgz**** > \[root@k8s-master \~\]# docker load \< flannel_v0.12.0-amd64.tar ![](https://file.jishuzhan.net/article/1693284636471332866/149fd6cdd34c48c08b3dd20f91f47f5d.png) ****上传插件:**** > ****\[root@k8s-master \~\]# tar xf cni-plugins-linux-amd64-v0.8.6.tgz**** > > ****\[root@k8s-master \~\]# cp flannel /opt/cni/bin/**** ![](https://file.jishuzhan.net/article/1693284636471332866/0884ba5c9b81462682a36764f6985ffb.png) ****master上传kube-flannel.yml**** ****master主机配置:**** \[root@k8s-master \~\]# kubectl apply -f kube-flannel.yml ![](https://file.jishuzhan.net/article/1693284636471332866/6e53e3452a2d4c46b1efaf0a8cf627e4.png) \[root@k8s-master \~\]# kubectl get nodes \[root@k8s-master \~\]# kubectl get pods -n kube-system ![](https://file.jishuzhan.net/article/1693284636471332866/b8fe0966c33e432683c10c70bff5d8f6.png) ****已经是ready状态**** ## ****(三)**** ****安装Dashboard UI**** ****1、部署Dashboard**** dashboard的github仓库地址:https://github.com/kubernetes/dashboard 代码仓库当中,有给出安装示例的相关部署文件,我们可以直接获取之后,直接部署即可 > ****\[root@k8s-master \~\]# wget**** [https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml](https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml "https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml") ![](https://file.jishuzhan.net/article/1693284636471332866/018d8e2aa2c348bda9baa248347d1b89.png) 默认这个部署文件当中,会单独创建一个名为kubernetes-dashboard的命名空间,并将kubernetes-dashboard部署在该命名空间下。dashboard的镜像来自docker hub官方,所以可不用修改镜像地址,直接从官方获取即可。 ****2、开放端口设置**** 在默认情况下,dashboard并不对外开放访问端口,这里简化操作,直接使用nodePort的方式将其端口暴露出来,修改serivce部分的定义: ****所有主机下载镜像**** > ****\[root@k8s-master \~\]# docker pull kubernetesui/dashboard:v2.0.0**** > > ****\[root@k8s-master \~\]# docker pull kubernetesui/metrics-scraper:v1.0.4**** ![](https://file.jishuzhan.net/article/1693284636471332866/bc83b7927e234bf0b0d8764d9b5826e2.png) \[root@k8s-master \~\]# vim recommended.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/036b54098acf4a38b950d4f108ddc09e.png) ****3、权限配置**** 配置一个超级管理员权限 \[root@k8s-master \~\]# vim recommended.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/67d9e345ce59468ea9a8465e2f45d590.png) \[root@k8s-master \~\]# kubectl apply -f recommended.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/af2ce060fe9d48fbbf797d617aa8e316.png) ****\[root@k8s-master \~\]# kubectl get pods -n**** ****kubernetes-dashboard**** ****\[root@k8s-master \~\]# kubectl get pods -A -o wide**** ![](https://file.jishuzhan.net/article/1693284636471332866/f9b22ba18c6d407e98c0b9952e8e3645.png) ****4、访问Token配置**** 使用谷歌浏览器测试访问 https://192.168.100.131:32443 ![](https://file.jishuzhan.net/article/1693284636471332866/5d9799effdfb46f19fe5c2db6d6202dc.png) ![](https://file.jishuzhan.net/article/1693284636471332866/de24ece2bafd43f39cf68c0c4d41c822.png) ![](https://file.jishuzhan.net/article/1693284636471332866/e695d0c135b64bfeb4eb6e163c04beef.png) 可以看到出现如上图画面,需要我们输入一个kubeconfig文件或者一个token。事实上在安装dashboard时,也为我们默认创建好了一个serviceaccount,为kubernetes-dashboard,并为其生成好了token, ****我们可以通过如下指令获取该sa的token:**** > \[root@k8s-master \~\]# kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard \|grep kubernetes-dashboard-token \| awk '{print $1}') \|grep token \| awk '{print $2}' ![](https://file.jishuzhan.net/article/1693284636471332866/d93873cff7994b0dba3ade9886303fa7.png) ****输入获取的token**** ![](https://file.jishuzhan.net/article/1693284636471332866/70f6b38c14b44d8ea06a83d0ac5fe8dd.png) ****查看集群概况:**** ![](https://file.jishuzhan.net/article/1693284636471332866/eaaff1791e964dfa974db713376f173a.png) ****查看集群roles:**** ![](https://file.jishuzhan.net/article/1693284636471332866/6fe9018b51d94ab3a83e23e656e11597.png) ****查看集群namespaces:**** ![](https://file.jishuzhan.net/article/1693284636471332866/b191f8c5982e42ab93c5b2d7ae18708b.png) ****查看集群nodes:**** ![](https://file.jishuzhan.net/article/1693284636471332866/56aabea8bdf44cf1a7aaec0fe3c9edec.png) ****查看集群pods:**** ![](https://file.jishuzhan.net/article/1693284636471332866/3e6549f93e5644d6b2be5d0f96c751d9.png) ## ****(四)**** ****metrics-server服务部署**** ****1、在Node节点上下载镜像**** heapster已经被metrics-server取代,metrics-server是K8S中的资源指标获取工具 所有node节点上 > ****\[root@k8s-node01 \~\]# docker pull bluersw/metrics-server-amd64:v0.3.6**** > > ****\[root@k8s-node01 \~\]# docker tag bluersw/metrics-server-amd64:v0.3.6 k8s.gcr.io/metrics-server-amd64:v0.3.6**** ![](https://file.jishuzhan.net/article/1693284636471332866/c9af5a4f0f4647d8917b17096ff3c22a.png) ****2、修改 Kubernetes apiserver 启动参数**** 在kube-apiserver项中添加如下配置选项 修改后apiserver会自动重启 > ****\[root@k8s-master \~\]# vim /etc/kubernetes/manifests/kube-apiserver.yaml**** ![](https://file.jishuzhan.net/article/1693284636471332866/9195a3806421409a9ef5f84f52348088.png) ****3、Master上进行部署**** > \[root@k8s-master \~\]# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml ****修改安装脚本:**** \[root@k8s-master \~\]# vim components.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/1e4a7d8db348405294faa5ed5cddc8db.png) ****\[root@k8s-master \~\]# kubectl create -f components.yaml**** ![](https://file.jishuzhan.net/article/1693284636471332866/8f00756c90864345b564095da760df1f.png) ****等待1-2分钟后查看结果**** ****\[root@k8s-master \~\]# kubectl top nodes**** ![](https://file.jishuzhan.net/article/1693284636471332866/cb1fced4fa5b445a967d69004dfda7df.png) 再回到dashboard界面可以看到CPU和内存使用情况了 ![](https://file.jishuzhan.net/article/1693284636471332866/0c3d9c2d94c7441cb5b68fd4467e21c3.png) ## ****(五)**** ****弹性伸缩**** ****1、弹性伸缩介绍**** HPA(Horizontal Pod Autoscaler,Pod水平自动伸缩)的操作对象是replication controller, deployment, replica set, stateful set 中的pod数量。注意,Horizontal Pod Autoscaling不适用于无法伸缩的对象,例如DaemonSets。 HPA根据观察到的CPU使用量与用户的阈值进行比对,做出是否需要增减实例(Pods)数量的决策。控制器会定期调整副本控制器或部署中副本的数量,以使观察到的平均CPU利用率与用户指定的目标相匹配。 ****2、弹性伸缩工作原理**** ![](https://file.jishuzhan.net/article/1693284636471332866/7880ee3581b2485f91e1f271c574936a.png) Horizontal Pod Autoscaler 会实现为一个控制循环,其周期由--horizontal-pod-autoscaler-sync-period选项指定(默认15秒)。 在每个周期内,controller manager都会根据每个HorizontalPodAutoscaler定义的指定的指标去查询资源利用率。 controller manager从资源指标API(针对每个pod资源指标)或自定义指标API(针对所有其他指标)获取指标。 ****3、弹性伸缩实战**** > \[root@k8s-master \~\]# mkdir hpa > > \[root@k8s-master \~\]# cd hpa > > ****创建hpa测试应用的deployment**** > > \[root@k8s-master hpa\]# vim nginx.yaml ![](https://file.jishuzhan.net/article/1693284636471332866/a53c4a4a344b4418be3b8fe2592b5646.png) 使用的资源是: CPU 0.010个核,内存100M > ****\[root@k8s-master hpa\]# kubectl apply -f nginx.yaml**** > > ****\[root@k8s-master hpa\]# kubectl get pod**** ![](https://file.jishuzhan.net/article/1693284636471332866/52dba81a72004aaca53de4a6fc4202c1.png) ****创建hpa策略**** > \[root@k8s-master hpa\]# kubectl autoscale --max=10 --min=1 --cpu-percent=5 deployment hpa-test > > \[root@k8s-master \~\]# kubectl get hpa ![](https://file.jishuzhan.net/article/1693284636471332866/2d37d2658f654fd8beae49620020b333.png) ****模拟业务压力测试**** ![](https://file.jishuzhan.net/article/1693284636471332866/9e8b58bfcebb4a95994fbb021d424640.png) ****\[root@k8s-master \~\]# kubectl get pod -o wide**** ![](https://file.jishuzhan.net/article/1693284636471332866/6164413a985041118bef7c57c4572f1d.png) ****\[root@k8s-master \~\]# while true;do curl -I 10.244.**** ****1**** ****.**** ****4**** ****;done**** ![](https://file.jishuzhan.net/article/1693284636471332866/3e9ffb80d5a34d239d0363a08be583b0.png) ****观察资源使用情况及弹性伸缩情况**** > ****\[root@k8s-master \~\]# kubectl get hpa**** > > ****\[root@k8s-master \~\]# kubectl get pod**** ![](https://file.jishuzhan.net/article/1693284636471332866/495d64fa13324052922205a08be6a710.png) ****查看cpu情况:**** ![](https://file.jishuzhan.net/article/1693284636471332866/de1f8b341e254755849326be8e81f445.png) ![](https://file.jishuzhan.net/article/1693284636471332866/c56849a921b046deb4f2dc8188a4e805.png) 将压力测试终止后,稍等一小会儿pod数量会自动缩减到1 ![](https://file.jishuzhan.net/article/1693284636471332866/1aecf5d9e9db451baffaf50459f02082.png) ****\[root@k8s-master \~\]# kubectl get pod**** ![](https://file.jishuzhan.net/article/1693284636471332866/f7c74f3b0d034dfcaa27c3daa6e10680.png) ![](https://file.jishuzhan.net/article/1693284636471332866/18f2faa83f4d44a69d9451320cec06bc.png) ****删除hpa策略**** > ****\[root@k8s-master \~\]# kubectl delete hpa hpa-test**** > > ****\[root@k8s-master \~\]# kubectl get hpa**** ![](https://file.jishuzhan.net/article/1693284636471332866/a3b54c41b5ec442a9f16d6618ef8e96e.png)

相关推荐
阿里云云原生1 小时前
AI 时代,为什么编程能力≠ 开发门槛
云原生
❀͜͡傀儡师1 小时前
Docker部署禅道21.6开源版本
运维·docker·容器
wqq10272 小时前
docker Windows 存放位置
运维·docker·容器
孔令飞4 小时前
如何使用Docker在本地运行一个大模型?
人工智能·云原生·go
掉头发的王富贵4 小时前
Dockerfile不会写?于是我花十分钟看了这篇文章
后端·docker·容器
IT闫6 小时前
【AI】——结合Ollama、Open WebUI和Docker本地部署可视化AI大语言模型
docker·语言模型·容器
RedCong6 小时前
使用sealos部署kubernetes集群并实现集群管理
云原生·容器·kubernetes
阿里云云原生6 小时前
乐言科技:云原生加速电商行业赋能,云消息队列助力降本 37%
科技·云原生
LCY13314 小时前
3.k8s是如何工作的
云原生·容器·kubernetes
Bl_a_ck14 小时前
【C++】Docker介绍
运维·docker·容器·eureka