在生產環境下,在面臨服務需要擴容的場景時,可以使用Deployment/RC的Scale機制來實現。
Kubernetes支持對Pod的手動擴容和自動擴容。
手動擴容縮容
通過執行擴容命令,對某個deployment直接進行擴容:
# kubectl scale deployment nginx-deployment --replicas=4
當要縮容,減少副本數量即可:
# kubectl scale deployment nginx-deployment --replicas=2
自動擴容縮容
在使用自動化擴容和縮容,需要kubernetes安裝heapster插件。
參考鏈接
按照說明,修改如下YAML文件中的image信息為國內可以訪問的鏡像倉庫,然后執行:
[root@node-1 influxdb]# ll total 16 -rw-r--r-- 1 root root 2288 Jun 21 20:23 grafana.yaml -rw-r--r-- 1 root root 264 Jun 21 20:24 heapster-rbac.yaml # 來源於上一級rbac目錄 -rw-r--r-- 1 root root 1112 Jun 21 20:24 heapster.yaml -rw-r--r-- 1 root root 972 Jun 21 20:24 influxdb.yaml [root@node-1 influxdb]# kubectl create -f ./
安裝完成之后,使用如下鏈接可以訪問Grafana的web界面,查看資源使用情況:
https://10.0.0.1:6443/api/v1/namespaces/kube-system/services/http:monitoring-grafana:/proxy/
在kubernetes 1.11以后的版本中將不再使用heapster插件來監控資源的使用狀態,而是使用metric server。
創建php-apche的deployment的應用和Service,當訪問此應用時,返回“OK!”:
# cat php-apache.yaml apiVersion: apps/v1 kind: Deployment metadata: name: php-apache labels: app: php-apache spec: replicas: 1 selector: matchLabels: app: php-apache template: metadata: name: php-apache labels: app: php-apache spec: containers: - name: php-apache image: mirrorgooglecontainers/hpa-example resources: requests: cpu: 200m ports: - containerPort: 80 # cat php-svc.yaml apiVersion: v1 kind: Service metadata: name: php-apache spec: ports: - port: 80 selector: app: php-apache
創建一個busybox的工具Pod,用於做壓力測試:
# cat php-svc.yaml apiVersion: v1 kind: Service metadata: name: php-apache spec: ports: - port: 80 selector: app: php-apache
創建完以上對象,還需要創建一個HPA控制器,用於監控對象的資源使用率:
kubectl autoscale deployment php-apache --min=1 --max=6 --cpu-percent=50 # 對php-apache的deployment的對象創建HPA控制器,當CPU的使率超過50%時實現自動化擴容,支持1到6之前Pod副本數量,以使得Pod CPU使用率維持在50% 以內。
查看當前hpa的狀態,如果狀態顯示<unknown>,查看下文中的故障排查:
[root@node-1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 8 1 39m
登錄busybox,執行循環訪問命令,對php-apache進行壓測:
# kubectl exec -it busybox -- sh / # while true;do wget -q -O - http://php-apache > /dev/null ;done # 此處如果DNS沒有正常工作將無法正常解析URL地址。
查看資源監控信息:
[root@node-1 hpa-test]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 42%/50% 1 8 1 1h [root@node-1 hpa-test]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 491%/50% 1 8 4 1h
查看對應的對象創建情況,正在陸續創建:
[root@node-1 hpa-test]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE php-apache 4 4 4 2 1h [root@node-1 hpa-test]# kubectl get rs NAME DESIRED CURRENT READY AGE php-apache-56b5765b95 4 4 2 1h [root@node-1 hpa-test]# kubectl get pod NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 36m php-apache-56b5765b95-8pclp 1/1 Running 0 1h php-apache-56b5765b95-gsvqk 1/1 Running 0 1m php-apache-56b5765b95-nbwbk 1/1 Running 0 1m php-apache-56b5765b95-zmc29 0/1 ContainerCreating 0 1m
當CPU使用率下降后,自動縮容:
[root@node-1 hpa-test]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 8 1 1h [root@node-1 hpa-test]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE php-apache 1 1 1 1 1h [root@node-1 hpa-test]# kubectl get rs NAME DESIRED CURRENT READY AGE php-apache-56b5765b95 1 1 1 1h [root@node-1 hpa-test]# kubectl get pod NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 43m php-apache-56b5765b95-8pclp 1/1 Running 0 1h
故障排查
如果設置hpa后,出現如下無法獲取資源狀態的情況:
[root@node-1 hpa-test]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache <unknown>/50% 1 8 1 9m
在master上修改kube-controller-manager的配置,添加如下參數:
cat /usr/lib/systemd/system/kube-controller-manager.service ... --horizontal-pod-autoscaler-use-rest-clients=false \ ...
實例配置:
[root@pressure-master03 ~]# kubectl autoscale deployment mall-audit-provider -n x****ssure --min=1 --max=8 --cpu-percent=50 horizontalpodautoscaler.autoscaling/mall-audit-provider autoscaled [root@pressure-master03 ~]# kubectl autoscale deployment mall-basic-provider -n x****sure --min=1 --max=8 --cpu-percent=50 horizontalpodautoscaler.autoscaling/mall-basic-provider autoscaled [root@pressure-master03 ~]# kubectl get hpa -n x*****ure NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ma****-api Deployment/mall-app-api 1%/50% 1 8 2 4m29s mall****ovider Deployment/mall-audit-provider 1%/50% 1 8 1 4m10s