kubectl Pod

Horizontal Pod Autoscaling - HPA

HPA 与之前的 Deployment、Service 一样,也属于一种 K8S 资源对象。

HPA 的目标是希望通过追踪集群中所有 Pod 的负载变化情况,来自动化地调整 Pod 的副本数,以此来满足应用的需求和减少资源的浪费。

HAP 度量 Pod 负载变化情况的指标有两种:

  • CPU 利用率(CPUUtilizationPercentage)
  • 自定义的度量指标,比如服务在每秒之内的请求数(TPS 或 QPS)

如何统计和查询这些指标,要依托于组件Heapster。Heapster 会监控一段时间内集群内所有 Pod 的 CPU 利用率的平均值或者其他自定义的值,在满足条件时(比如 CPU 使用率超过 80% 或 降低到 10%)会将这些信息反馈给 HPA 控制器,HPA 控制器就根据 RC 或者 Deployment 的定义调整 Pod 的数量。

Theory

autoscaler(自动扩容器)的实现方式是一个循环,它通过定期通过 Status.PodSelector 来查询Pods的状态,获得他们的CPU使用率。然后,它通过现有Pods的CPU使用率的算数平均值跟目标使用率进行比较,并且在扩容的时候,还要遵循预先设定的副本数限制:MinReplicas <= Replicas <= MaxReplicas(MinReplicas是用户预先设置的最小副本数,MaxReplicas是用户预先设置的最大副本数)

定期轮询的时间通过–horizontal-pod-autoscaler-sync-period选项来设置,默认的时间为30秒。

CPU利用率是指最近的Pod使用量(最近一分钟的平均值,从heapster中获得)除以设定的每个Pod的CPU使用率限额,在kubernetes1.1版本中,CPU的使用率直接从Heapster中获得,将来,我们将从Master提供的API中获得。

计算扩容后Pod的个数计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

CurrentPodsCPUUtilization 为最近一分钟内某个Pod的CPU使用率/量的平均值
Target CPU使用上限

自动扩容的流程:

  1. 创建HPA资源,设定目标CPU使用率限额,以及最大、最小实例数;
  2. 收集一组中(PodSelector)每个Pod最近一分钟内的CUP使用率,并计算平均值;
  3. 读取HPA中设定的CPU使用限额;
  4. 计算:平均值之和/限额,求出目标调整的实例个数;
  5. 目标调整的实例数不能超过1中设定的最大、最小实例数,如果没有超过,则扩容;超过,则扩容至最大的实例个数;
  6. 默认情况每隔30秒做一次自动扩容判断。

Example:假设一组Pod中有三个实例,CPU限额为50%,当前的CPU使用率/量分别为:60%, 80%, 80%时,要扩容成多少实例呢?

(60%+80%+80%)/ 50% = 4.4,4.4取整后为4,即应该扩容到4个实例。

启动、停止Pod可能会引入噪声度量(例如,启动过程会暂时增加cpu的使用),所以,在每次起/停操作后,自动扩容器会等待一段时间(冷却时间),以获得更可靠的数据。扩容每次要冷却3分钟之后才能再次扩容,缩容要冷却5分钟。


实现方式:

  1. 配置文件
  2. 命令行

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
namespace: default
spec:
scaleTargetRef:
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
targetAverageUtilization: 50
  • scaleTargetRef 字段指定需要管理的 Deployment/RC 的名字,也就是提前需要存在一个 Deployment/RC 对象。
  • minReplicas 和 maxReplicas 字段定义 Pod 可伸缩的数量范围。这个例子中扩容最高不能超过 10 个,缩容最低不能少于 1 个。
  • targetAverageUtilization 指定 CPU 使用率,也就是自动扩容和缩容的触发条件,当 CPU 使用率超过 50% 时会触发自动动态扩容的行为,当回落到 50% 以下时,又会触发自动动态缩容的行为。

命令行

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


Command

Force delete

1
kubectl delete pods pod-name  --grace-period=0 --force

If even after these commands the pod is stuck on Unknown state, use the following command to remove the pod from the cluster:

1
kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'

Running with Shell

1
kubectl run pod-name -i --rm --image nginx:lastes -- sh -c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Examples:
# Start a single instance of nginx.
kubectl run nginx --image=nginx

# Start a single instance of hazelcast and let the container expose port 5701 .
kubectl run hazelcast --image=hazelcast --port=5701

# Start a single instance of hazelcast and set environment variables "DNS_DOMAIN=cluster" and "POD_NAMESPACE=default" in the container.
kubectl run hazelcast --image=hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"

# Start a single instance of hazelcast and set labels "app=hazelcast" and "env=prod" in the container.
kubectl run hazelcast --image=nginx --labels="app=hazelcast,env=prod"

# Start a replicated instance of nginx.
kubectl run nginx --image=nginx --replicas=5

# Dry run. Print the corresponding API objects without creating them.
kubectl run nginx --image=nginx --dry-run

# Start a single instance of nginx, but overload the spec of the deployment with a partial set of values parsed from JSON.
kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'

# Start a pod of busybox and keep it in the foreground, don't restart it if it exits.
kubectl run -i -t busybox --image=busybox --restart=Never

# Start the nginx container using the default command, but use custom arguments (arg1 .. argN) for that command.
kubectl run nginx --image=nginx -- <arg1> <arg2> ... <argN>

# Start the nginx container using a different command and custom arguments.
kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>

# Start the perl container to compute π to 2000 places and print it out.
kubectl run pi --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'

# Start the cron job to compute π to 2000 places and print it out every 5 minutes.
kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'

Adding or updating labels for existing clusters

1
gcloud container clusters update [CLUSTER_NAME] --update-labels [KEY]=[VALUE]

Remove labels for existing clusters

1
gcloud container clusters update example-cluster --remove-labels env=dev

Reference