iT邦幫忙

2022 iThome 鐵人賽

DAY 11
1
DevOps

30天準備CKA考試系列 第 11

Day 11:Namespaces與ResourceQuota

  • 分享至 

  • xImage
  •  

在Kubernetes中的Namespace,就是用來將同一個集群中的各種資源互相隔離的機制。所以在同一個Namespace的各種Object的名稱都要唯一,而跨Namespace屬於整個集群的Object就沒有這種限制了。

我們來看看Namespace的YAML吧~

apiVersion: v1
kind: Namespace
metadata:
  name: <insert-namespace-name-here>

另外要注意的是,創建Namespace時,名稱要避免使用kube-,因為這類型的名稱是為了Kubernetes系統所保留。

Namespace的常用指令

# 查看集群中有哪些Namespace
kubectl get namespace

# 在各項指令中指定namespace,這邊舉例是列出kube-system namespace的Pod
# 只要加-n $namespaceName,-n 代表--namespace
kubectl get pod -n kube-system

# 建立新的namespace test,也可以使用YAML建立
kubectl create namespace test

# 刪除Namespace test
kubectl delete namespace test

# 變更預設的Namespace為test
kubectl config set-context --current --namespace=test

# 確認目前預設的Namespace
kubectl config view --minify | grep namespace:

如何訪問不同Namespace?

今天如果兩個不同Namespace的Object想要互相訪問,可以透過DNS,那這個DNS的形式為:

${serviceMame}.${namespaceName}.svc.cluster.local

舉例來說,default Namespace的Pod想要連到test Namespace的DB,而這個DB Pod綁著一個叫db-service的service,那這個DB的host會是:

db-service.test.svc.cluster.local

哪些Object不屬於Namespace?

集群中有許多Object不屬於Namespace,如StorageClass、Node、PersistentVolume。

那我們要如何確認呢?

# 確認哪些Object屬於Namespace
kubectl api-resources --namespaced=true

# 確認哪些Object部屬於Namespace
kubectl api-resources --namespaced=false

Resource Quota

這是一種針對Namespace限制資源總量的機制,有分為Limit和Request。

  • Request:對這項資源的基本保證,像是我保證這個Container可以拿到2 CPU。
  • Limit:對這項資源的上限保證,像是我保證這個Container不會使用超過4 CPU。

而ResourceQuota的限制有分為三類:

  • 計算資源的配額:像是CPU, Memory。而在目前目前1.10版本後,還新增了Extended Resources,而它支援GPU的限制,但是只限於Request。
  • 儲存資源配額:這邊是針對儲存資源,像是所有PVC的reuest總量、所有PVC的總量,以及針對各StorageClass可以請求的PV與PVC。
  • Object數量配額:針對service、deployment等Object的數量限制。

看看YAML吧~

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
  namespace: test
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.nvidia.com/gpu: 4

讓某些Pod可以優先拿到足夠的資源

可以建立PriorityClass,並在Pod的YAML設定PriorityClassName。

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: very-much-so-important
value: 0000500
preemptionPolicy: Never
globalDefault: false
description: 'very much so important'
  • value:值越高,優先度越高。
  • preemptionPolicy:是否允許搶佔其他優先度較低的Pod的資源。如果設Never則不允許,將等待有足夠的資源才會被部署。
  • globalDefault:像是預設的PriorityClass,將被應用於沒有priorityClassName的Pod。系統中只能有一個globalDefault為true的PriorityClass,如果沒有的話,則沒有priorityClassName的Pod的優先度會為0。
  • description:用來告知使用者何時應使用此PriorityClass。
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: very-much-so-important
  name: very-much-so-important
spec:
  containers:
  - image: nginx:1.17.6-alpine
    name: very-much-so-important
    resources:
      requests:
        memory: 1.5Gi
  dnsPolicy: ClusterFirst
  restartPolicy: Never
  priorityClassName: very-much-so-important
status: {}
  • priorityClassName:這個Pod的優先度要參考哪個PriorityClass。

參考資料

Namespaces

通过名字空间共享集群

资源配额

Kubernetes CKA hands-on challenge #6 Pod Priority

Pod 优先级和抢占


上一篇
Day 10:DaemonSet vs. Static Pods
下一篇
Day 12:Logging & Monitoring
系列文
30天準備CKA考試30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言