Kubernetes之Pod控制器
- Horizontal Pod Autoscaler(HPA)
- 安装metrics-server
- 创建Pod
- 创建HPA
- 压力测试
- Job
- CronJob
Horizontal Pod Autoscaler(HPA)
上篇文章中所说的ReplicaSet和Deployment,我们已经可以通过手动执行kubectl scale命令实现Pod的扩缩容,但是这显然不符合Kubernetes的定位目标–自动化和智能化。Kubernetes期望可以通过监测Pod的使用情况,实现Pod数量的自动调整,于是就产生了HPA这种控制器。
HPA可以获取每个Pod的利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod数量的调整。其实HPA和之前的Deployment一样,也属于一种kubernetes资源对象,它通过追踪分析目标Pod的负载变化情况,来确定是否需要针对性的调整目标Pod的副本数。
安装metrics-server
方式一:
安装git
yum install git -y
使用git下载metrics-server
git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server
方式二:
wget https://github.com/kubernetes-sigs/metrics-server/archive/v0.3.6.tar.gz
方式三:
由于网络连接一直被拒绝,所以我这边选择直接翻墙去外网把文件给下载下来,再上传至服务器。(当然,这个问题也是能够解决的,有兴趣的话可以自行百度一下哈哈哈,我暂时偷个懒)
GitHub下载地址
解压文件
tar -zxvf metrics-server-0.3.6.tar.gz
进入metrics-server-0.3.6/deploy/1.8+目录
cd metrics-server-0.3.6/deploy/1.8+
修改metrics-server-deployment.yaml文件
(为了方便编写,我这边选择删除掉这个文件,再将下面备好的yaml文件拷贝进去)
rm -rf metrics-server-deployment.yaml
vi metrics-server-deployment.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
hostNetwork: true
serviceAccountName: metrics-server
volumes:
# mount in tmp so we can safely use from-scratch images and/or read-only containers
- name: tmp-dir
emptyDir: {}
containers:
- name: metrics-server
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
imagePullPolicy: Always
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
volumeMounts:
- name: tmp-dir
mountPath: /tmp
下图为文件改动点
安装metrics-server
kubectl apply -f ./
查看metrics-server创建的Pod
kubectl get pods -n kube-system
如果有名称前缀为metrics-server的Pod,则说明安装是成功的
查看资源使用情况
kubectl top nodes
kubectl top node
kubectl top pod -n kube-system
创建Pod
kubectl create ns bubble-dev
# 创建Pod(内存需要至少200M)
kubectl run nginx --image=nginx:1.17.9 --requests=cpu=200m -n bubble-dev
# 暴露端口可供外部访问
kubectl expose deployment nginx --type=NodePort --port=80 -n bubble-dev
# 查看命名空间bubble-dev下的deployment、pod和service
kubectl get deploy,pod,svc -n bubble-dev
# 查看命名空间bubble-dev下pod的详细信息
kubectl describe pods -n bubble-dev
访问192.168.102.160:31793
创建HPA
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: pc-hpa
namespace: bubble-dev
spec:
minReplicas: 1 # 设定pod的最小数量
maxReplicas: 10 # 设定pod的最大数量
targetCPUUtilizationPercentage: 2 # cpu使用率,达到2%则开始弹性扩容
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment # 指定要控制的nginx信息
name: nginx
vi pc-hpa.yaml
cat pc-hpa.yaml
kubectl create -f pc-hpa.yaml
查看hpa
kubectl get hpa -n bubble-dev
压力测试
打开两个新的窗口进行监听变化
窗口一(监听pod变化):
kubectl get pods -n bubble-dev -w
窗口二(监听CPU变化):
kubectl get hpa -n bubble-dev -w
模拟压力测试
yum install httpd-tools -y
ab -n 1000000 -c 1000 http://192.168.102.160:31793/
可以从窗口二看到CPU已经飙升
可以从窗口一看到Pod在进行扩容
当流量下来(请求结束)之后,需要等待一段时间,HPA才会进行自动缩容。
Job
Job主要用于负责批量处理短暂的一次性任务。
Job的特点:
当Job创建的Pod执行成功结束时,Job将记录成功结束的Pod数量;
当成功结束的Pod达到指定的数量时,Job将完成执行;
apiVersion: batch/v1
kind: Job
metadata:
name: pc-job
namespace: bubble-dev
spec:
manualSelector: true
completions: 4 # 指定job运行成功Pods的次数。默认值: 1
parallelism: 2 # 指定job在任一时刻并发运行Pods的数量。默认值: 1
selector:
matchLabels:
app: busybox-pod
template:
metadata:
labels:
app: busybox-pod
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5; do echo $i;sleep 5 ;done" ]
上面Job要完成的任务是:循环输入9、8、7、6、5、4、3、2、1,每输入一个就等待3s,总共需要27s。
kubectl create ns bubble-dev
vi pc-job.yaml
cat pc-job.yaml
另外打开两个窗口分别监听Pod和Job
kubectl get pod -n bubble-dev -w
kubectl get job -n bubble-dev -w
执行配置清单
kubectl create -f pc-job.yaml
从监听Job的窗口上可以看到2个Pod并发执行,总共执行了27s,执行完成后又并发执行了2个Pod,直至成功运行完4个Pod。
监听Pod的窗口
删除Job
kubectl delete -f pc-job.yaml
CronJob
CronJob可以在特定的时间点反复去执行Job任务。
打开两个窗口分别监听CronJob和Job
kubectl get job -n bubble-dev -w
kubectl get cronjob -n bubble-dev -w
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: pc-cronjob
namespace: bubble-dev
labels:
controller: cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
metadata:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5; do echo $i;sleep 5 ;done" ]
vi pc-cronjob.yaml
cat pc-cronjob.yaml
kubectl create -f pc-cronjob.yaml
监听Job的窗口
监听CronJob的窗口
删除CronJob
kubectl delete -f pc-cronjob.yaml