4.k8s的弹性伸缩

2022-04-08 分类:k8s 阅读(589) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.弹性伸缩概述

k8s弹性伸缩,需要附加插件heapster监控,当达到阈值后自动增加或者减少pod数量但是heapster在Kubernetes1.10.1已经弃用,后面的文章会写官方支持的metrics-server监控做弹性伸缩

2.部署heapster监控

1.heapster概述

Heapster是容器集群监控和性能分析工具,HPA、Dashborad、Kubectl top都依赖于heapster收集的数据。
k8s早期版本需要附加插件heapster监控,但是Heapster从kubernetes 1.8以后已经被遗弃了,被metrics-server所替代,后期监控功能逐渐被Prometheus替代
kubelet是集成了cAdvisor组件的且监听了4194端口。

heapster插件用到用到以下几个组件:
heapster:采集监控数据。其需要和Api-Server进行通信,从而获取Node节点信息。而后基于Node节点的kubelet组件内置的cAdvisor获取监控数据。
influxdb:负责数据存储。
grafana:负责数据展示
heapster组件的工作原理如下图所示

2.安装heapster监控

###上传镜像
ls *.tar.gz
for n in `ls *.tar.gz`;do docker load -i $n ;done
docker tag docker.io/kubernetes/heapster_grafana:v2.6.0 10.0.0.11:5000/heapster_grafana:v2.6.0
docker tag  docker.io/kubernetes/heapster_influxdb:v0.5 10.0.0.11:5000/heapster_influxdb:v0.5
docker tag docker.io/kubernetes/heapster:canary 10.0.0.11:5000/heapster:canary
###编写资源清单
[root@k8s-master k8s_yaml]# mkdir heapster
[root@k8s-master k8s_yaml]# cd heapster/
[root@k8s-master heapster]# cat 01-heapster-controller.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    k8s-app: heapster
    name: heapster
    version: v6
  name: heapster
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: heapster
        version: v6
    spec:
      nodeName: k8s-node-2
      containers:
      - name: heapster
        image: k8s-master:5000/heapster:canary
        imagePullPolicy: IfNotPresent
        command:
        - /heapster
        - --source=kubernetes:http://10.0.0.11:8080?inClusterConfig=false
        - --sink=influxdb:http://monitoring-influxdb:8086
[root@k8s-master heapster]# cat 02-heapster-service.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: Heapster
  name: heapster
  namespace: kube-system
spec:
  ports:
  - port: 80
    targetPort: 8082
  selector:
    k8s-app: heapster
[root@k8s-master heapster]# cat 03-influxdb-grafana-controller.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    name: influxGrafana
  name: influxdb-grafana
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: influxGrafana
    spec:
      nodeName: k8s-node-2
      containers:
      - name: influxdb
        image: k8s-master:5000/heapster_influxdb:v0.5
        volumeMounts:
        - mountPath: /data
          name: influxdb-storage
      - name: grafana
        image: k8s-master:5000/heapster_grafana:v2.6.0
        env:
          - name: INFLUXDB_SERVICE_URL
            value: http://monitoring-influxdb:8086
            # The following env variables are required to make Grafana accessible via
            # the kubernetes api-server proxy. On production clusters, we recommend
            # removing these env variables, setup auth for grafana, and expose the grafana
            # service using a LoadBalancer or a public IP.
          - name: GF_AUTH_BASIC_ENABLED
            value: "false"
          - name: GF_AUTH_ANONYMOUS_ENABLED
            value: "true"
          - name: GF_AUTH_ANONYMOUS_ORG_ROLE
            value: Admin
          - name: GF_SERVER_ROOT_URL
            value: /api/v1/proxy/namespaces/kube-system/services/monitoring-grafana/
        volumeMounts:
        - mountPath: /var
          name: grafana-storage
      volumes:
      - name: influxdb-storage
        emptyDir: {}
      - name: grafana-storage
        emptyDir: {}
[root@k8s-master heapster]# cat 04-grafana-service.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-grafana
  name: monitoring-grafana
  namespace: kube-system
spec:
  # In a production setup, we recommend accessing Grafana through an external Loadbalancer
  # or through a public IP. 
  # type: LoadBalancer
  ports:
  - port: 80
    targetPort: 3000
  selector:
    name: influxGrafana
[root@k8s-master heapster]# cat 05-influxdb-service.yaml 
apiVersion: v1
kind: Service
metadata:
  labels: null
  name: monitoring-influxdb
  namespace: kube-system
spec:
  ports:
  - name: http
    port: 8083
    targetPort: 8083
  - name: api
    port: 8086
    targetPort: 8086
  selector:
    name: influxGrafana

3.应用资源清单并验证部署结果

[root@k8s-master heapster]# kubectl apply -f .
温馨提示:
imagePullPolicy的值有3个,分别为"Always, Never, IfNotPresent"。
Always:无论本地是否有镜像,总是去仓库下载镜像。
Never:无论本地是否有镜像,始终不去仓库更新。
IfNotPresent:如果本地没有镜像,则会去镜像仓库下载相应的镜像名称
登录dashboard验证,如下图所示,很明显已经被监控了

3.验证弹性伸缩

1.创建deployment文件

[root@k8s-master hpa]# cat deploy-wordpress2.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: k8s-master:5000/mysql:5.7
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: somewordpress
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_USER
          value: wordpress
        - name: MYSQL_PASSWORD
          value: wordpress
---

apiVersion: v1
kind: Service   #简称svc
metadata:
  name: musql-svc
  namespace: kube-system
spec:
  clusterIP: 10.254.86.101
  type: ClusterIP
  ports:
    - port: 3306
      targetPort: 3306    #pod port
  selector:
    app: mysql

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: k8s-master:5000/wordpress:latest
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 100m
          requests:
            cpu: 100m
        env:
        - name: WORDPRESS_DB_HOST
          value: musql-svc.kube-system.svc.cluster.local
        - name: WORDPRESS_DB_USER
          value: wordpress
        - name: WORDPRESS_DB_PASSWORD
          value: wordpress
---

apiVersion: v1
kind: Service   #简称svc
metadata:
  name: wordpress-svc
spec: 
  type: NodePort
  ports:
    - port: 80
      nodePort: 31001
      targetPort: 80   #pod port
  selector:
    app: wordpress
[root@k8s-master hpa]# kubectl apply -f deploy-wordpress2.yaml

2.创建弹性伸缩规则

###基于yaml文件创建
[root@k8s-master hpa]# cat hpa.yaml 
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: wordpress
  namespace: default
spec:
  maxReplicas: 8 ###最大pod数
  minReplicas: 1 ###最小pod数
  scaleTargetRef: ###扩容相关选择器
    apiVersion: extensions/v1beta1 ###版本号
    kind: Deployment  ###需要扩容的资源类型
    name: wordpress ###资源的名字
  targetCPUUtilizationPercentage: 5 ###cpu的百分比,超过后触发扩容
[root@k8s-master hpa]# kubectl apply -f hpa.yaml
##基于命令行创建
kubectl autoscale deployment wordpress --max=5 --min=2 --cpu-percent=5
--max:指定最大的Pod数量,如果指定的数量越大,则弹性伸缩的资源创建的就越多,对服务器资源会进行消耗。
--minx:指定最小的Pod数量。
--cpu-percent:指定CPU的百分比

3.使用ab工具进行压测

##安装ab工具
[root@k8s-master hpa]# yum -y install httpd-tools.x86_64
##压测前pod数
###压测后pod数

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1