autoscale¶
还是先创建基本条件,deployment和service¶
$ kubectl create -f https://raw.githubusercontent.com/AlvinWanCN/poppy/master/code/k8s.yamls/nginx-deploy.yaml
$ kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
autoscale一个deploy¶
这里的autuscale表示现在进行的动作是autuscale, autoscale一个deployment,deployment的名字是nginx-deploy, –min=1表示最小1个pod –max=6表示最多6个pod,–cpu-percent=10表示当cpu使用率超过10%的时候就扩展pod数量(这里我们为了快速验证自动水平扩展所以设置为10,一般设置为80左右)
[alvin@k8s1 ~]$ kubectl autoscale deploy nginx-deploy --min=1 --max=6 --cpu-percent=10
horizontalpodautoscaler.autoscaling/nginx-deploy autoscaled
查看hpa¶
hpa全称horizontalpodautoscaler。 下面我们可以看到replicas数量是1了,因为我们设置的最小值是一。
这里targets的值前面那个值是当前值,后面那个是触发扩展的值,如果前面那个值是unknow,可以用describe查看一下这个hpa,这里我们设置hpa的deployment,他的pod里必须要对容器做了资源限制,设置了resources:的,否则这里会报错,监控不到cpu的值。
[alvin@k8s1]~% kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 0%/10% 1 6 1 3m
访问service,通过service调度到deploy里的pod¶
这里我们先确认下service的IP
[alvin@k8s1 ~]$ kubectl get svc -l run=nginx-deploy
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP 10.111.215.66 <none> 80/TCP 5d
然后开始curl访问这个service ip的80。
这里我们写个脚本来访问url
[alvin@k8s2 ~]$ vim curl.sh
#!/bin/bash
for i in {1..100000}
do
curl -s 10.111.215.66 >/dev/null
done
[alvin@k8s2 ~]$ ./curl.sh &
[1] 54987
[alvin@k8s2 ~]$ ./curl.sh &
[2] 55028
[alvin@k8s2 ~]$ ./curl.sh &
[3] 55078
[alvin@k8s2 ~]$ ./curl.sh &
[4] 55119
查看hpa状态,确认是否有扩展¶
然后再查看hpa的状态
这里我们可以看到replicas的数量,变成了2.
[alvin@k8s1 ~]$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 19%/10% 1 6 2 9m
[alvin@k8s1 ~]$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 10%/10% 1 6 2 10m
然后我们再起一个curl,加大访问量,
然后继续查看hpa的状态,replicas的数量,变成了3.
[alvin@k8s1 ~]$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 12%/10% 1 6 2 12m
[alvin@k8s1 ~]$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 12%/10% 1 6 3 12m
查看pod状态,发现有一个是pending
[alvin@k8s1 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-6dc465bbb6-4sskq 1/1 Running 0 17m
nginx-deploy-6dc465bbb6-f9jbp 1/1 Running 0 7m
nginx-deploy-6dc465bbb6-wbm5n 0/1 Pending 0 3m
describe 查看一下,发现有一个报错
[alvin@k8s1 ~]$ kubectl describe pod nginx-deploy-6dc465bbb6-wbm5n
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 2m (x25 over 3m) default-scheduler 0/3 nodes are available: 1 node(s) had taints that the pod didn't tolerate, 2 node(s) didn't have free ports for the requested pod ports.
这个报错,是因为我们在配置pod属性的时候在 ports:下面写了hostPort,就是容器所在主机需要监听的端口号,使用了这个参数后,就不能在同一个节点上启动多个该容器了。 真如上面的报错说的,没有可用端口了。
所以我们把创建那个deploy的方式改变一下,取消设置hostPort就好了。
现在master还不能运行普通pod,想要让master节点运行普通pod,可执行下面的命令
$ kubectl taint nodes --all node-role.kubernetes.io/master-
让master节点恢复不运行普通pod,则执行下面的命令
[root@k8s1 ~]# kubectl taint nodes k8s1.alv.pub node-role.kubernetes.io=master:NoSchedule
node/k8s1.alv.pub tainted
最后再重新来一次¶
上面有过的一些东西修复掉,容器不用hostPort这个选项,当前我们的deployment是设置了4个pod
[root@k8s1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-deploy-7c4c4f96cd-gj5wh 1/1 Running 0 2m 10.244.1.43 k8s2.alv.pub <none>
nginx-deploy-7c4c4f96cd-h7g5r 1/1 Running 0 2m 10.244.1.44 k8s2.alv.pub <none>
nginx-deploy-7c4c4f96cd-hq5ll 1/1 Running 0 2m 10.244.2.61 k8s3.alv.pub <none>
nginx-deploy-7c4c4f96cd-v5czh 1/1 Running 0 2m 10.244.2.62 k8s3.alv.pub <none>
[root@k8s1 ~]# kubectl autoscale deployment nginx-deploy --min=1 --max=6 --cpu-percent=5
horizontalpodautoscaler.autoscaling/nginx-deploy autoscaled
[root@k8s1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy <unknown>/5% 1 6 0 15s
[root@k8s1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 0%/5% 1 6 1 1m
然后用我们的访问脚本访问
[alvin@k8s2 ~]$ cat curl.sh
#!/bin/bash
for i in {1..100000}
do
curl -s 10.111.215.66 >/dev/null
done
[alvin@k8s2 ~]$ ./curl.sh &
[1] 127810
[alvin@k8s2 ~]$ ./curl.sh &
[2] 127920
[alvin@k8s2 ~]$ ./curl.sh &
[3] 128050
[alvin@k8s2 ~]$ ./curl.sh &
[4] 128223
[alvin@k8s2 ~]$ cat curl.sh
[root@k8s1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 32%/5% 1 6 1 4m
然后pod要开始扩展了。
[root@k8s1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 32%/5% 1 6 1 4m
[root@k8s1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 32%/5% 1 6 4 5m
[root@k8s1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 30%/5% 1 6 4 8m
[root@k8s1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deploy Deployment/nginx-deploy 30%/5% 1 6 6 9m
最终扩展到了6