菜鸟学Kubernetes(K8s)系列——(番外)实现Deployment的动态扩缩容能力(HPA)
该系列将从新手到老手的角度讲解学习Kubernetes的心得
·
菜鸟学Kubernetes(K8s)系列——(番外)实现Deployment的动态扩缩容能力(HPA)
Kubernetes系列文章 | 主要内容 |
---|---|
菜鸟学Kubernetes(K8s)系列——(一)关于Pod和Namespace | 通过本文你将学习到: (1)什么是Pod,为什么需要它、如何创建Pod、Pod的健康检查机制(三种探针) (2)什么是标签、标签选择器 (3)什么是Namespace、他能做什么、如何创建它等等 |
菜鸟学Kubernetes(K8s)系列——(二)关于Deployment、StatefulSet、DaemonSet、Job、CronJob | 通过本文你将学习到: (1)什么是Deployment,如何创建它、它的扩缩容能力是什么、自愈机制,滚动升级全过程、如何进行回滚 (2)什么是ReplicaSet、它和Deployment的关系是什么 (3)动态扩缩容能力(HPA)、蓝绿部署、金丝雀部署 (4)什么是DaemonSet/Job/CronJob、它们的功能是什么、如何创建使用等等 |
菜鸟学Kubernetes(K8s)系列——(三)关于Service、Ingress | 通过本文你将学习到: (1)什么是Service,如何创建它、它的服务发现能力、对外暴露方式 (2)什么是NodePort类型的Service,它的使用方式、工作原理 (3)什么是Ingress,如何创建它、为什么需要Ingress (4)什么的Ingress-Nginx、他和Nginx是什么关系、Ingress的各种功能 (5)什么是headless服务等等 |
菜鸟学Kubernetes(K8s)系列——(四)关于Volume卷(PV、PVC、StorageClass等) | 通过本文你将学习到: (1)什么是Volume卷、它的几种类型(emptyDir、hostPath、NFS)、这几种类型是使用方式 (2)什么是PV-PVC、为什么要用他们、他们是怎么协作的、如何使用PV-PVC (3)动态配置持久卷是什么,它是怎么工作的、如何实现动态的分配PV等等 |
菜鸟学Kubernetes(K8s)系列——(五)关于ConfigMap和Secret | 通过本文你将学习到: (1)什么是ConfigMap,如何创建它、它能用来做什么事情、在实战中怎么使用ConfigMap (2)什么是Secret,如何创建它,怎么使用它等等 |
菜鸟学Kubernetes(K8s)系列——(七)关于Kubernetes底层工作原理 | 通过本文你将学习到: (1)Kubernetes的核心组件:Etcd、Api-Server、Scheduler、Controller-Manager、Kubelet、Kube-proxy的工作方式,工作原理。 (2)Kubernetes集群中核心组件的协作方式、运行原理。 |
菜鸟学Kubernetes(K8s)系列——(八)关于Kubernetes的认证机制(RBAC) | 通过本文你将学习到: (1)Api-Server的认证授权流程(2)什么是ServiceAccount(3)什么是Role、ClusterRole、RoleBinding、ClusterRoleBinding,如何使用他们,他们之间是如何关联协作的。等等 |
菜鸟学Kubernetes(K8s)系列——(番外)安装Ingress-Nginx(工作原理) | 通过本文你将学会安装Ingress-Nginx |
我们知道通过Deployment可以对Pod副本数进行动态扩缩容,但是这毕竟还是需要人为检测我们部署的服务的压力状况,然后去手动调整Pod的副本数量。**在Kubernetes中,有一种感知能力,可以在请求高峰期的时候动态扩容Pod的数量,在高峰期过去后动态缩容。**完全不需要人为干预。
想要实现动态扩缩容需要先准备一个Metrics服务器,这个服务器可以监控当前系统的指标。
安装Metrics
-
首先部署下面的资源(下面文件做了一些特殊修改,比如修改镜像地址等,可以直接使用)
apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: metrics-server rbac.authorization.k8s.io/aggregate-to-admin: "true" rbac.authorization.k8s.io/aggregate-to-edit: "true" rbac.authorization.k8s.io/aggregate-to-view: "true" name: system:aggregated-metrics-reader rules: - apiGroups: - metrics.k8s.io resources: - pods - nodes verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: metrics-server name: system:metrics-server rules: - apiGroups: - "" resources: - nodes/metrics verbs: - get - apiGroups: - "" resources: - pods - nodes verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: labels: k8s-app: metrics-server 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 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: k8s-app: metrics-server 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 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: k8s-app: metrics-server 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 --- apiVersion: v1 kind: Service metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system spec: ports: - name: https port: 443 protocol: TCP targetPort: https selector: k8s-app: metrics-server --- apiVersion: apps/v1 kind: Deployment metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system spec: selector: matchLabels: k8s-app: metrics-server strategy: rollingUpdate: maxUnavailable: 0 template: metadata: labels: k8s-app: metrics-server spec: nodeName: k8s-node1 ### 新增,为master节点的hostname containers: - args: - --cert-dir=/tmp - --secure-port=4430 ### 由原来的4443改为4430 - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname ### 进行了修改,添加InternalDNS、ExternalDNS - --kubelet-use-node-status-port - --metric-resolution=15s - --kubelet-insecure-tls ### 新增 image: bitnami/metrics-server:0.6.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 httpGet: path: /livez port: https scheme: HTTPS periodSeconds: 10 name: metrics-server ports: - containerPort: 4430 ### 由原来的4443改为4430 name: https protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /readyz port: https scheme: HTTPS initialDelaySeconds: 20 periodSeconds: 10 resources: requests: cpu: 100m memory: 200Mi securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 1000 volumeMounts: - mountPath: /tmp name: tmp-dir nodeSelector: kubernetes.io/os: linux priorityClassName: system-cluster-critical serviceAccountName: metrics-server volumes: - emptyDir: {} name: tmp-dir --- apiVersion: apiregistration.k8s.io/v1 kind: APIService metadata: labels: k8s-app: metrics-server name: v1beta1.metrics.k8s.io spec: group: metrics.k8s.io groupPriorityMinimum: 100 insecureSkipTLSVerify: true service: name: metrics-server namespace: kube-system version: v1beta1 versionPriority: 100
-
kubectl apply -f metrics.yaml 即可
-
测试:kubectl top node
- 这里可能会报错
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
-
解决
-
在/etc/kubernetes/manifests 里面改一下apiserver的配置
-
vim /etc/kubernetes/manifests/kube-apiserver.yaml
-
在command下新增 - --enable-aggregator-routing=true
-
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
-
kubectl delete pods kube-apiserver -n kube-system
-
kubectl apply -f metrics.yaml
-
-
动态扩缩容的原理
首先Deployment会控制一个RS,RS控制各个Pod。Kubernetes通过HPA资源来实现实现对目标资源的监控,然后自动扩缩容。
更多推荐
已为社区贡献5条内容
所有评论(0)