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














![buu [NPUCTF2020]Classical Cipher 1](https://img-blog.csdnimg.cn/3b5c07fe882942389f81a3ce512be516.png)





