当前位置:   article > 正文

【云原生】k8s之HPA,命名空间资源限制_命名空间限制

命名空间限制

内容预知

 1.HPA的相关知识

 2.HPA的部署运用

 2.1 进行HPA的部署设置

 2.2 HPA伸缩的测试演示

 (1)创建一个用于测试的pod资源

(2)创建HPA控制器,进行资源的限制,伸缩管理 

(3)进入其中一个pod容器仲,进行死循环模拟 

3.命名空间的资源限制

3.1 计算资源的配额限制 

3.2  配置对象数量配额限制


 1.HPA的相关知识

 HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源,HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、 Deployment 或者Replica Set 中的 Pod 数量。

(1)HPA 基于 Master 上的 kube-controller-manager 服务启动参数 horizontal-pod-autoscaler-sync-period 定义的时长(默认为30秒),周期性的检测 Pod 的 CPU 使用率。

(2)HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况, 来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

(3)metrics-server 也需要部署到集群中, 它可以通过 resource metrics API 对外提供度量数据。

 2.HPA的部署运用

 2.1 进行HPA的部署设置

  1. //在所有 Node 节点上传 metrics-server.tar 镜像包到 /opt 目录
  2. cd /opt/
  3. docker load -i metrics-server.tar
  4. #在主master节点上执行
  5. kubectl apply -f components.yaml

  1. vim components.yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. labels:
  6. k8s-app: metrics-server
  7. name: metrics-server
  8. namespace: kube-system
  9. ---
  10. apiVersion: rbac.authorization.k8s.io/v1
  11. kind: ClusterRole
  12. metadata:
  13. labels:
  14. k8s-app: metrics-server
  15. rbac.authorization.k8s.io/aggregate-to-admin: "true"
  16. rbac.authorization.k8s.io/aggregate-to-edit: "true"
  17. rbac.authorization.k8s.io/aggregate-to-view: "true"
  18. name: system:aggregated-metrics-reader
  19. rules:
  20. - apiGroups:
  21. - metrics.k8s.io
  22. resources:
  23. - pods
  24. - nodes
  25. verbs:
  26. - get
  27. - list
  28. - watch
  29. ---
  30. apiVersion: rbac.authorization.k8s.io/v1
  31. kind: ClusterRole
  32. metadata:
  33. labels:
  34. k8s-app: metrics-server
  35. name: system:metrics-server
  36. rules:
  37. - apiGroups:
  38. - ""
  39. resources:
  40. - pods
  41. - nodes
  42. - nodes/stats
  43. - namespaces
  44. - configmaps
  45. verbs:
  46. - get
  47. - list
  48. - watch
  49. ---
  50. apiVersion: rbac.authorization.k8s.io/v1
  51. kind: RoleBinding
  52. metadata:
  53. labels:
  54. k8s-app: metrics-server
  55. name: metrics-server-auth-reader
  56. namespace: kube-system
  57. roleRef:
  58. apiGroup: rbac.authorization.k8s.io
  59. kind: Role
  60. name: extension-apiserver-authentication-reader
  61. subjects:
  62. - kind: ServiceAccount
  63. name: metrics-server
  64. namespace: kube-system
  65. ---
  66. apiVersion: rbac.authorization.k8s.io/v1
  67. kind: ClusterRoleBinding
  68. metadata:
  69. labels:
  70. k8s-app: metrics-server
  71. name: metrics-server:system:auth-delegator
  72. roleRef:
  73. apiGroup: rbac.authorization.k8s.io
  74. kind: ClusterRole
  75. name: system:auth-delegator
  76. subjects:
  77. - kind: ServiceAccount
  78. name: metrics-server
  79. namespace: kube-system
  80. ---
  81. apiVersion: rbac.authorization.k8s.io/v1
  82. kind: ClusterRoleBinding
  83. metadata:
  84. labels:
  85. k8s-app: metrics-server
  86. name: system:metrics-server
  87. roleRef:
  88. apiGroup: rbac.authorization.k8s.io
  89. kind: ClusterRole
  90. name: system:metrics-server
  91. subjects:
  92. - kind: ServiceAccount
  93. name: metrics-server
  94. namespace: kube-system
  95. ---
  96. apiVersion: v1
  97. kind: Service
  98. metadata:
  99. labels:
  100. k8s-app: metrics-server
  101. name: metrics-server
  102. namespace: kube-system
  103. spec:
  104. ports:
  105. - name: https
  106. port: 443
  107. protocol: TCP
  108. targetPort: https
  109. selector:
  110. k8s-app: metrics-server
  111. ---
  112. apiVersion: apps/v1
  113. kind: Deployment
  114. metadata:
  115. labels:
  116. k8s-app: metrics-server
  117. name: metrics-server
  118. namespace: kube-system
  119. spec:
  120. selector:
  121. matchLabels:
  122. k8s-app: metrics-server
  123. strategy:
  124. rollingUpdate:
  125. maxUnavailable: 0
  126. template:
  127. metadata:
  128. labels:
  129. k8s-app: metrics-server
  130. spec:
  131. containers:
  132. - args:
  133. - --cert-dir=/tmp
  134. - --secure-port=4443
  135. - --kubelet-preferred-address-types=InternalIP
  136. - --kubelet-use-node-status-port
  137. - --kubelet-insecure-tls
  138. image: registry.cn-beijing.aliyuncs.com/dotbalo/metrics-server:v0.4.1
  139. imagePullPolicy: IfNotPresent
  140. livenessProbe:
  141. failureThreshold: 3
  142. httpGet:
  143. path: /livez
  144. port: https
  145. scheme: HTTPS
  146. periodSeconds: 10
  147. name: metrics-server
  148. ports:
  149. - containerPort: 4443
  150. name: https
  151. protocol: TCP
  152. readinessProbe:
  153. failureThreshold: 3
  154. httpGet:
  155. path: /readyz
  156. port: https
  157. scheme: HTTPS
  158. periodSeconds: 10
  159. securityContext:
  160. readOnlyRootFilesystem: true
  161. runAsNonRoot: true
  162. runAsUser: 1000
  163. volumeMounts:
  164. - mountPath: /tmp
  165. name: tmp-dir
  166. nodeSelector:
  167. kubernetes.io/os: linux
  168. priorityClassName: system-cluster-critical
  169. serviceAccountName: metrics-server
  170. volumes:
  171. - emptyDir: {}
  172. name: tmp-dir
  173. ---
  174. apiVersion: apiregistration.k8s.io/v1
  175. kind: APIService
  176. metadata:
  177. labels:
  178. k8s-app: metrics-server
  179. name: v1beta1.metrics.k8s.io
  180. spec:
  181. group: metrics.k8s.io
  182. groupPriorityMinimum: 100
  183. insecureSkipTLSVerify: true
  184. service:
  185. name: metrics-server
  186. namespace: kube-system
  187. version: v1beta1
  188. versionPriority: 100
  1. #部署完毕后,可以通过命令来监视pod的资源占用
  2. kubectl top pods
  3. kubectl top nodes

 

 2.2 HPA伸缩的测试演示

 (1)创建一个用于测试的pod资源

  1. kubectl create deployment hpa-deploy --image=nginx:1.14 --replicas=3 -o yaml >hpa-test.yaml
  2. vim hpa-test.yaml
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6. labels:
  7. app: hpa-deploy
  8. name: hpa-deploy
  9. namespace: default
  10. spec:
  11. replicas: 3
  12. selector:
  13. matchLabels:
  14. app: hpa-deploy
  15. template:
  16. metadata:
  17. labels:
  18. app: hpa-deploy
  19. spec:
  20. containers:
  21. - image: nginx:latest
  22. name: nginx-hpa
  23. imagePullPolicy: IfNotPresent
  24. ports:
  25. - containerPort: 80
  26. resources:
  27. requests:
  28. cpu: 200m
  29. ---
  30. apiVersion: v1
  31. kind: Service
  32. metadata:
  33. name: hpa-deploy
  34. spec:
  35. ports:
  36. - port: 80
  37. protocol: TCP
  38. targetPort: 80
  39. selector:
  40. app: hpa-deploy

(2)创建HPA控制器,进行资源的限制,伸缩管理 

  1. 使用 kubectl autoscale 命令创建 HPA 控制器,设置 cpu 负载阈值为请求资源的 50%,指定最少负载节点数量为 1 个,最大负载节点数量为 10
  2. kubectl autoscale deployment hpa-deploy --cpu-percent=50 --min=1 --max=10

 

(3)进入其中一个pod容器仲,进行死循环模拟 

  1. kubectl exec -it hpa-deploy-5dfd5cf57b-7f4ls bash
  2. while ture
  3. > do
  4. > echo this is hpa test
  5. > done

开启另一个终端,进行hpa监视: 

HPA 扩容的时候,负载节点数量上升速度会比较快;但回收的时候,负载节点数量下降速度会比较慢 

 防止在业务高峰期时因为网络波动等原因的场景下,如果回收策略比较积极的话,K8S集群可能会认为访问流量变小而快速收缩负载节点数量,而仅剩的负载节点又承受不了高负载的压力导致崩溃,从而影响业务。

3.命名空间的资源限制

命名空间资源限制的配置字段:ResourceQuota
 

kubectl explain ResourceQuota

3.1 计算资源的配额限制 

  1. apiVersion: v1
  2. kind: ResourceQuota #使用 ResourceQuota 资源类型
  3. metadata:
  4. name: compute-resources
  5. namespace: spark-cluster #指定命令空间
  6. spec:
  7. hard:
  8. pods: "20" #设置 Pod 数量最大值
  9. requests.cpu: "2"
  10. requests.memory: 1Gi
  11. limits.cpu: "4"
  12. limits.memory: 2Gi

以上述为例,为已创建的命名空间sapark-cluster进行计算资源限制。首先限制在该命名空间最大的pod数量为20个,预留cpu和最大限制cpu分别为两个与四个。预留内存和最大限制内存分别为2GI和4GI. 

3.2  配置对象数量配额限制

  1. apiVersion: v1
  2. kind: ResourceQuota
  3. metadata:
  4. name: object-counts
  5. namespace: spark-cluster
  6. spec:
  7. hard:
  8. configmaps: "10"
  9. persistentvolumeclaims: "4" #设置 pvc 数量最大值
  10. replicationcontrollers: "20" #设置 rc 数量最大值
  11. secrets: "10"
  12. services: "10"
  13. services.loadbalancers: "2"

上述为例,该配置是对namespace中所存在的资源对象进行限制。

如果Pod没有设置requests和limits,则会使用当前命名空间的最大资源;如果命名空间也没设置,则会使用集群的最大资源。
K8S 会根据 limits 限制 Pod 使用资源,当内存超过 limits 时 cgruops 会触发 OOM(内存溢出)。
 

这里就需要创建 LimitRange 资源来设置 Pod 或其中的 Container 能够使用资源的最大默认值: 

  1. apiVersion: v1
  2. kind: LimitRange #使用 LimitRange 资源类型
  3. metadata:
  4. name: mem-limit-range
  5. namespace: test #可以给指定的 namespace 增加一个资源限制
  6. spec:
  7. limits:
  8. - default: #defaultlimit 的值
  9. memory: 512Mi
  10. cpu: 500m
  11. defaultRequest: #defaultRequest 即 request 的值
  12. memory: 256Mi
  13. cpu: 100m
  14. type: Container #类型支持 Container、Pod、PVC

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号