目錄
1 metrics-server
2 指定內(nèi)存請求和限制
3 指定 CPU 請求和限制
資源限制
在k8s中對于容器資源限制主要分為以下兩類:
-
內(nèi)存資源限制: 內(nèi)存請求(request)和內(nèi)存限制(limit)分配給一個容器。 我們保障容器擁有它請求數(shù)量的內(nèi)存,但不允許使用超過限制數(shù)量的內(nèi)存。
-
官網(wǎng)參考地址: 為容器和 Pod 分配內(nèi)存資源 | Kubernetes
-
-
CPU 資源限制: 為容器設(shè)置 CPU request(請求) 和 CPU limit(限制)。 容器使用的 CPU 不能超過所配置的限制。 如果系統(tǒng)有空閑的 CPU 時間,則可以保證給容器分配其所請求數(shù)量的 CPU 資源。
-
官網(wǎng)參考地址: 為容器和 Pods 分配 CPU 資源 | Kubernetes
-
請求 request memory cpu :可以使用的基礎(chǔ)資源 100M
限制 limit memory cpu :可以使用的最大資源 200M 超過最大資源之后容器會被 kill , OOM 錯誤
1 metrics-server
官網(wǎng)地址: GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.
Kubernetes Metrics Server (Kubernetes指標(biāo)服務(wù)器),它是一個可擴展的、高效的容器資源度量源。Metrics Server 用于監(jiān)控每個 Node 和 Pod 的負(fù)載(用于Kubernetes內(nèi)置自動擴縮管道)。Metrics Server 從Kubelets 收集資源指標(biāo),并通過 Metrics API 在Kubernetes apiserver中公開,供 Horizontal Pod Autoscaler 和 Vertical Pod Autoscaler 使用。Metrics API 也可以通過 kubectl top 訪問,使其更容易調(diào)試自動擴縮管道。
-
查看 metrics-server(或者其他資源指標(biāo) API
metrics.k8s.io
服務(wù)提供者)是否正在運行, 請鍵入以下命令:
kubectl get apiservices
-
如果資源指標(biāo) API 可用,則會輸出將包含一個對
metrics.k8s.io
的引用。
NAME
v1beta1.metrics.k8s.io
-
安裝 metrics-server
# components.yaml
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:
? ? containers:
? ? ? - args:
? ? ? ? ? - --cert-dir=/tmp
? ? ? ? ? - --secure-port=4443
? ? ? ? ? - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
? ? ? ? ? - --kubelet-use-node-status-port
? ? ? ? ? - --metric-resolution=15s
? ? ? ? ? - --kubelet-insecure-tls #修改去掉證書驗證
? ? ? ? image: dyrnq/metrics-server:v0.6.2 #修改官方無法下載
? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? livenessProbe:
? ? ? ? ? failureThreshold: 3
? ? ? ? ? httpGet:
? ? ? ? ? ? path: /livez
? ? ? ? ? ? port: https
? ? ? ? ? ? scheme: HTTPS
? ? ? ? ? periodSeconds: 10
? ? ? ? name: metrics-server
? ? ? ? ports:
? ? ? ? ? - containerPort: 4443
? ? ? ? ? ? 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
? ? hostNetwork: true ?#必須指定這個才行
? ? 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 appply -f components.yaml
2 指定內(nèi)存請求和限制
官網(wǎng): 為容器和 Pod 分配內(nèi)存資源 | Kubernetes
為容器指定內(nèi)存請求,請在容器資源清單中包含 resources:requests
字段。 同理,要指定內(nèi)存限制,請包含 resources:limits
。
# nginx-memory-demo.yaml #內(nèi)存資源的基本單位是字節(jié)(byte)。你可以使用這些后綴之一,將內(nèi)存表示為 純整數(shù)或定點整數(shù):E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki。 例如,下面是一些近似相同的值:128974848, 129e6, 129M, 123Mi
apiVersion: v1
kind: Pod
metadata:
name: nginx-memory-demo
spec:
containers:
- name: nginx-memory-demo
? image: nginx:1.19
? resources:
? ? requests:
? ? ? memory: "100Mi"
? ? limits:
? ? ? memory: "200Mi"
-
查看容器內(nèi)存使用情況
$ kubectl get pod nginx-memory-demo --output=yaml
-
查看容器正在使用內(nèi)存情況
$ kubectl top pod nginx-memory-demo
-
內(nèi)存請求和限制的目的
通過為集群中運行的容器配置內(nèi)存請求和限制,你可以有效利用集群節(jié)點上可用的內(nèi)存資源。 通過將 Pod 的內(nèi)存請求保持在較低水平,你可以更好地安排 Pod 調(diào)度。 通過讓內(nèi)存限制大于內(nèi)存請求,你可以完成兩件事:
-
Pod 可以進行一些突發(fā)活動,從而更好的利用可用內(nèi)存。
-
Pod 在突發(fā)活動期間,可使用的內(nèi)存被限制為合理的數(shù)量。
-
-
沒有指定內(nèi)存限制
如果你沒有為一個容器指定內(nèi)存限制,則自動遵循以下情況之一:
-
容器可無限制地使用內(nèi)存。容器可以使用其所在節(jié)點所有的可用內(nèi)存, 進而可能導(dǎo)致該節(jié)點調(diào)用 OOM Killer。 此外,如果發(fā)生 OOM Kill,沒有資源限制的容器將被殺掉的可行性更大。
-
運行的容器所在命名空間有默認(rèn)的內(nèi)存限制,那么該容器會被自動分配默認(rèn)限制。
-
3 指定 CPU 請求和限制
官網(wǎng): 為容器和 Pods 分配 CPU 資源 | Kubernetes
為容器指定 CPU 請求,請在容器資源清單中包含 resources: requests
字段。 要指定 CPU 限制,請包含 resources:limits
。
# nginx-cpu-demo.yaml #CPU 資源以 CPU 單位度量。小數(shù)值是可以使用的。一個請求 0.5 CPU 的容器保證會獲得請求 1 個 CPU 的容器的 CPU 的一半。 你可以使用后綴 m 表示毫。例如 100m CPU、100 milliCPU 和 0.1 CPU 都相同。 CPU 請求只能使用絕對數(shù)量,而不是相對數(shù)量。0.1 在單核、雙核或 48 核計算機上的 CPU 數(shù)量值是一樣的。
apiVersion: v1
kind: Pod
metadata:
name: nginx-cpu-demo
spec:
containers:
- name: nginx-cpu-demo
? image: nginx:1.19
? resources:
? ? limits:
? ? ? cpu: "1"
? ? requests:
? ? ? cpu: "0.5"
-
顯示 pod 詳細(xì)信息
$ kubectl get pod nginx-cpu-demo --output=yaml
-
顯示 pod 運行指標(biāo)
$ kubectl top pod nginx-cpu-demo
-
CPU 請求和限制的初衷
通過配置你的集群中運行的容器的 CPU 請求和限制,你可以有效利用集群上可用的 CPU 資源。 通過將 Pod CPU 請求保持在較低水平,可以使 Pod 更有機會被調(diào)度。 通過使 CPU 限制大于 CPU 請求,你可以完成兩件事:
-
Pod 可能會有突發(fā)性的活動,它可以利用碰巧可用的 CPU 資源。
-
Pod 在突發(fā)負(fù)載期間可以使用的 CPU 資源數(shù)量仍被限制為合理的數(shù)量。
-
-
如果不指定 CPU 限制
如果你沒有為容器指定 CPU 限制,則會發(fā)生以下情況之一:
-
容器在可以使用的 CPU 資源上沒有上限。因而可以使用所在節(jié)點上所有的可用 CPU 資源。
-
容器在具有默認(rèn) CPU 限制的名字空間中運行,系統(tǒng)會自動為容器設(shè)置默認(rèn)限制。
-
-
如果你設(shè)置了 CPU 限制但未設(shè)置 CPU 請求
文章來源:http://www.zghlxwxcb.cn/news/detail-632857.html
如果你為容器指定了 CPU 限制值但未為其設(shè)置 CPU 請求,Kubernetes 會自動為其 設(shè)置與 CPU 限制相同的 CPU 請求值。類似的,如果容器設(shè)置了內(nèi)存限制值但未設(shè)置 內(nèi)存請求值,Kubernetes 也會為其設(shè)置與內(nèi)存限制值相同的內(nèi)存請求。文章來源地址http://www.zghlxwxcb.cn/news/detail-632857.html
到了這里,關(guān)于【云原生】kubernetes中容器的資源限制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!