11.k8s基于metrics-server监控的弹性伸缩

2022-04-12 分类:k8s 阅读(397) 评论(0)

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

1.metrics-server概述

Metrics Server 是 Kubernetes 内置自动缩放管道的容器资源指标的可扩展、高效源。
Metrics Server 从 Kubelets 收集资源指标,并通过 Metrics API 在 Kubernetes apiserver 中公开它们,供 Horizontal Pod Autoscaler 和 Vertical Pod Autoscaler 使用

2.安装metrics-server监控

建议阅读:
https://github.com/kubernetes-sigs/metrics-server
因为我的k8s集群是1.15版本的所以安装0.3版本的监控
编辑yaml文件
[root@k8s-master metric]# cat aggregated-metrics-reader.yaml 
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: system:aggregated-metrics-reader
  labels:
    rbac.authorization.k8s.io/aggregate-to-view: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
[root@k8s-master metric]# cat auth-reader.yaml 
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
[root@k8s-master metric]# cat metrics-server-deployment.yaml 
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
apiVersion: extensions/v1beta1
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:
      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.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.3
        imagePullPolicy: Always
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
        command:
        - /metrics-server
        - --metric-resolution=30s
        - --kubelet-preferred-address-types=InternalIP
        - --kubelet-insecure-tls
[root@k8s-master metric]# cat resource-reader.yaml 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
[root@k8s-master metric]# cat auth-delegator.yaml 
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
[root@k8s-master metric]# cat metrics-apiservice.yaml 
---
apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100
[root@k8s-master metric]# cat metrics-server-service.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: metrics-server
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443

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
ab -n 1000000 -c 40  http://k8s.com:30001
增加到了8个

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1