kubernetes-HPA、rancher

目录

一、HPA

二、metrics-server

三、安装HPA

四、资源限制 - Pod

五、资源限制 - 命名空间

1.计算资源配额

2.配置对象数量配额限制

六、Rancher 简介

七、Rancher 安装及配置

1.安装 rancher

2.登录 Rancher 平台

3.Rancher 管理已存在的 k8s 集群

4.Rancher 部署监控系统

5.使用 Rancher 仪表盘管理 k8s 集群


一、HPA

      HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源,HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。

1)HPA 基于 Master 上的 kube-controller-manager 服务启动参数 horizontal-pod-autoscaler-sync-period 定义的时长(默认为30秒),周期性的检测 Pod 的 CPU 使用率。

2)HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

3)metrics-server 也需要部署到集群中, 它可以通过 resource metrics API 对外提供度量数据。

二、metrics-server

       metrics-server:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl、hpa、scheduler等。

在所有 Node 节点上传 metrics-server.tar 镜像包到 /opt 目录

cd /opt/
docker load -i metrics-server.tar

使用 helm install 安装 metrics-server

mkdir /opt/metrics
cd /opt/metrics
helm repo remove stable
helm repo add stable https://charts.helm.sh/stable
或
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo update
helm pull stable/metrics-server
vim metrics-server.yaml
args:
- --logtostderr
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
image:
 repository: k8s.gcr.io/metrics-server-amd64
 tag: v0.3.2

使用 helm install 安装 metrics-server

helm install metrics-server stable/metrics-server -n kube-system -f metrics-server.yaml
kubectl get pods -n kube-system | grep metrics-server

需要多等一会儿

kubectl top node
kubectl top pods --all-namespaces

三、安装HPA

在所有节点上传 hpa-example.tar 镜像文件到 /opt 目录
hpa-example.tar 是谷歌基于 PHP 语言开发的用于测试 HPA 的镜像,其中包含了一些可以运行 CPU 密集计算任务的代码。

cd /opt
docker load -i hpa-example.tar
docker images | grep hpa-example

创建用于测试的 Pod 资源,并设置请求资源为 cpu=200m

vim hpa-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
 run: php-apache
 name: php-apache
spec:
 replicas: 1
 selector:
 matchLabels:
 run: php-apache
 template:
 metadata:
 labels:
 run: php-apache
 spec:
 containers:
 - image: gcr.io/google_containers/hpa-example
 name: php-apache
 imagePullPolicy: IfNotPresent
 ports:
 - containerPort: 80
 resources:
 requests:
 cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
 name: php-apache
spec:
 ports:
 - port: 80
 protocol: TCP
 targetPort: 80
 selector:
 run: php-apache
	
	
kubectl apply -f hpa-pod.yaml
kubectl get pods

使用 kubectl autoscale 命令创建 HPA 控制器,设置 cpu 负载阈值为请求资源的 50%,指定最少负载节点数量为 1 个,最大负载节点数量为 10 个

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

需要等一会儿,才能获取到指标信息 TARGETS

kubectl get hpa
kubectl top pods

创建一个测试客户端容器

kubectl run -it load-generator --image=busybox /bin/sh

增加负载

while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

打开一个新的窗口,查看负载节点数目

kubectl get hpa -w

以上可以看到经过压测,负载节点数量最大上升到 10 个,并且 cpu 负载也随之下降。

如果 cpu 性能较好导致负载节点上升不到 10 个,可再创建一个测试客户端同时测试:

kubectl run -i --tty load-generator1 --image=busybox /bin/sh
# while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

 查看 Pod 状态,也发现已经创建了 10 个 Pod 资源

kubectl get pods

       HPA 扩容的时候,负载节点数量上升速度会比较快;但回收的时候,负载节点数量下降速度会比较慢。
       原因是防止在业务高峰期时因为网络波动等原因的场景下,如果回收策略比较积极的话,K8S集群可能会认为访问流量变小而快速收缩负载节点数量,而仅剩的负载节点又承受不了高负载的压力导致崩溃,从而影响业务。

四、资源限制 - Pod

        Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU 和各种设备都有对应的 cgroup。
        默认情况下,Pod 运行没有 CPU 和内存的限额。这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一样, 消耗足够多的 CPU 和内存。一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过 resources 的 requests 和 limits 来实现。requests 为创建 Pod 时初始要分配的资源,limits 为 Pod 最高请求的资源值。

spec:
 containers:
 - image: xxxx
 imagePullPolicy: IfNotPresent
 name: auth
 ports:
 - containerPort: 8080
 protocol: TCP
 resources:
 limits:
 cpu: "2"
 memory: 1Gi
 requests:
 cpu: 250m
 memory: 250Mi

五、资源限制 - 命名空间

1.计算资源配额

apiVersion: v1
kind: ResourceQuota 使用 ResourceQuota 资源类型
metadata:
 name: compute-resources
 namespace: spark-cluster 指定命令空间
spec:
 hard:
 pods: "20" 设置 Pod 数量最大值
 requests.cpu: "2"
 requests.memory: 1Gi
 limits.cpu: "4"
 limits.memory: 2Gi

2.配置对象数量配额限制

apiVersion: v1
kind: ResourceQuota
metadata:
 name: object-counts
 namespace: spark-cluster
spec:
 hard:
 configmaps: "10"
 persistentvolumeclaims: "4"	 设置 pvc 数量最大值
 replicationcontrollers: "20" 设置 rc 数量最大值
 secrets: "10"
 services: "10"
 services.loadbalancers: "2"

        如果Pod没有设置requests和limits,则会使用当前命名空间的最大资源;如果命名空间也没设置,则会使用集群的最大资源。
K8S 会根据 limits 限制 Pod 使用资源,当内存超过 limits 时 cgruops 会触发 OOM。

这里就需要创建 LimitRange 资源来设置 Pod 或其中的 Container 能够使用资源的最大默认值

apiVersion: v1
kind: LimitRange 使用 LimitRange 资源类型
metadata:
 name: mem-limit-range
 namespace: test 可以给指定的 namespace 增加一个资源限制
spec:
 limits:
 - default: default 即 limit 的值
 memory: 512Mi
 cpu: 500m
 defaultRequest: defaultRequest 即 request 的值
 memory: 256Mi
 cpu: 100m
 type: Container 类型支持 Container、Pod、PVC

六、Rancher 简介

Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,实现了 Kubernetes 集群在混合云+本地数据中心的集中部署与管理, 以确保集群的安全性,加速企业数字化转型。超过 40000 家企业每天使用 Rancher 快速创新。

官网:https://docs.rancher.cn/

Rancher 和 k8s 的区别

       Rancher 和 k8s 都是用来作为容器的调度与编排系统。但是 rancher 不仅能够管理应用容器,更重要的一点是能够管理 k8s 集群。 Rancher2.x 底层基于 k8s 调度引擎,通过 Rancher 的封装,用户可以在不熟悉 k8s 概念的情况下轻松的通过 Rancher 来部署容器到k8s集群当中。

七、Rancher 安装及配置

1.安装 rancher

在 master节点下载 rancher-agent 镜像

docker pull rancher/rancher-agent:v2.5.7

在 rancher 节点下载 rancher 镜像

docker pull rancher/rancher:v2.5.7
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged --name rancher rancher/rancher:v2.5.7
--restart=unless-stopped 表示在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
docker ps -a|grep rancher

2.登录 Rancher 平台

需要先等一会儿,再浏览器访问 http://ip,由于未使用授信证书,会有报警,忽略即可。
登录后如是英文页面,可点击右下角语言选项选择中文

3.Rancher 管理已存在的 k8s 集群

选择【添加集群】,点击【导入】
【集群名称】设置为 k8s-cluster,点击【创建】
选择复制第三条命令绕过证书检查导入 k8s 集群

在 k8s 控制节点 master01 上执行刚才复制的命令,如第一次执行报错,再执行一次即可

curl --insecure -sfL 
kubectl get ns
kubectl get pods -n cattle-system -o wide
kubectl get pods -n fleet-system -o wide

4.Rancher 部署监控系统

点击【启用监控以查看实时监控】
【监控组件版本】选择 0.2.1,其他的默认即可
点击【启用监控】,启动监控时间可能比较长,需要等待10分钟左右

5.使用 Rancher 仪表盘管理 k8s 集群

以创建 nginx 服务为例
点击【仪表盘】进入 k8s 集群仪表盘界面

创建名称空间 namespace
点击左侧菜单【Namespaces】,再点击右侧【Create】
【Name】输入 dev,【Description】选填可自定义
点击右下角【Create】

创建 Deployment 资源
点击左侧菜单【Deployments】,再点击右侧【Create】
【Namespace】下拉选择 dev,【Name】输入 nginx-dev,【Replicas】输入 3
点击中间选项【Container】,【Container Image】输入 nginx:1.14,【Pull Policy】选择 IfNotPresent
在【Pod Labels】下点击【Add Lable】,【Key】输入 app,【Value】输入 nginx
点击中间选项【Labels and Annotations】,点击【Add Label】,【Key】输入 app,【Value】输入 nginx
点击右下角【Create】

创建 service
点击左侧菜单【Services】,再点击右侧【Create】
点击【Node Port】
【Namespace】下拉选择 dev,【Name】输入 nginx-dev
【Port Name】输入 nginx,【Listening Port】输入 80,【Target Port】输入 80,【Node Port】输入 30180
点击中间选项【Selectors】,【Key】输入 app,【Value】输入 nginx
点击右下角【Create】
点击【nginx-dev】查看 service 是否已关联上 Pod

点击 service 资源的节点端口 30180/TCP,可以访问内部的 nginx 页面了

作者:Drw_Dcm原文地址:https://blog.csdn.net/Drw_Dcm/article/details/127870592

%s 个评论

要回复文章请先登录注册