1 - 詞彙表
2 - 教學
本節收錄了 Kubernetes 的教學。 教學示範了如何完成一個比單一任務更大的目標。 通常一個教學會有幾個小節,每個小節都有一系列的步驟。 在閱讀每個教學之前,建議您將詞彙表頁面加入書籤,以便日後參考。
基礎
- Kubernetes 基礎是一個深入的互動式教學,幫助您了解 Kubernetes 系統並實際嘗試一些基本的 Kubernetes 功能。
- Kubernetes 簡介(edX)
- Hello Minikube
設定
撰寫 Pod
無狀態應用程式
有狀態應用程式
服務
安全性
叢集管理
接下來
如果您想撰寫教學,請參閱 內容頁面類型 以取得有關教學頁面類型的資訊。
2.1 - Hello Minikube
本教學示範如何使用 minikube 在 Kubernetes 上執行一個範例應用程式。 教學提供了一個使用 NGINX 回應所有請求的容器映像檔。
學習目標
- 將範例應用程式部署到 minikube。
- 執行應用程式。
- 查看應用程式日誌。
開始之前
本教學假設您已完成 minikube 的設定。
請參閱 minikube start 中的步驟 1 以取得安裝說明。
說明:
請只執行步驟 1:安裝中的指令,其餘部分將在本頁說明。
您還需要安裝 kubectl。
請參閱安裝工具以取得安裝說明。
建立 minikube 叢集
minikube start
確認 minikube 叢集狀態
確認 minikube 叢集的狀態,以確保所有元件都處於執行狀態。
minikube status
上述指令的輸出應顯示所有元件為 Running 或 Configured,如以下範例輸出所示:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
開啟 Dashboard
開啟 Kubernetes Dashboard,您可以透過以下兩種方式進行:
開啟一個新的終端機,並執行:
# Start a new terminal, and leave this running.
# 開啟新終端機,讓此指令持續執行。
minikube dashboard
接著,切換回您執行 minikube start 的終端機。
說明:
若您不想讓 minikube 自動開啟網頁瀏覽器,請使用 --url 旗標執行 dashboard 子指令。
minikube 會輸出一個 URL,您可以在偏好的瀏覽器中開啟。
開啟一個新的終端機,並執行:
# Start a new terminal, and leave this running.
# 開啟新終端機,讓此指令持續執行。
minikube dashboard --url
接著,您可以使用此 URL 並切換回您執行 minikube start 的終端機。
建立 Deployment
Kubernetes Pod 是由一個或多個容器組成的群組, 以便集中管理並共用網路資源。本教學中的 Pod 只有一個容器。Kubernetes Deployment 會檢查 Pod 的健康狀態, 並在 Pod 的容器終止時將其重新啟動。建議使用 Deployment 來管理 Pod 的建立和擴展。
-
使用
kubectl create指令建立一個管理 Pod 的 Deployment。 Pod 會根據提供的 Docker 映像檔執行容器。# Run a test container image that includes a webserver kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.53 -- /agnhost netexec --http-port=8080
-
查看 Deployment:
kubectl get deployments輸出類似如下:NAME READY UP-TO-DATE AVAILABLE AGE hello-node 1/1 1 1 1m(Pod 可能需要一些時間才能就緒。若看到「0/1」,請稍候幾秒後再試。)
-
查看 Pod:
kubectl get pods輸出類似如下:NAME READY STATUS RESTARTS AGE hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m
-
查看叢集事件:
kubectl get events
-
查看
kubectl設定:kubectl config view
-
查看 Pod 中容器的應用程式日誌(請將 Pod 名稱替換為您從
kubectl get pods取得的名稱)。說明:
請將
kubectl logs指令中的hello-node-5f76cf6ccf-br9b5替換為kubectl get pods輸出中的 Pod 名稱。kubectl logs hello-node-5f76cf6ccf-br9b5輸出類似如下:
I0911 09:19:26.677397 1 log.go:195] Started HTTP server on port 8080 I0911 09:19:26.677586 1 log.go:195] Started UDP server on port 8081
說明:
有關 kubectl 指令的更多資訊,請參閱 kubectl 概述。
建立 Service
預設情況下,Pod 只能透過其在 Kubernetes 叢集內的內部 IP 位址存取。
若要讓 hello-node 容器可從 Kubernetes 虛擬網路外部存取,
您必須將 Pod 公開為 Kubernetes Service。
警告:
agnhost 容器有一個 /shell 端點,這對於除錯很有用,但若暴露於公開網際網路上則相當危險。
請勿在對外公開的叢集或正式環境叢集上執行此指令。
-
使用
kubectl expose指令將 Pod 對外公開:kubectl expose deployment hello-node --type=LoadBalancer --port=8080`--type=LoadBalancer` 旗標表示您希望將 Service 公開至叢集外部。測試映像檔中的應用程式碼只監聽 TCP 通訊埠 8080。若您使用
kubectl expose公開不同的通訊埠,用戶端將無法連線到該通訊埠。
-
查看您建立的 Service:
kubectl get services輸出類似如下:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.108.144.78 <pending> 8080:30369/TCP 21s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23m在支援負載平衡器的雲端供應商上,系統會分配一個外部 IP 位址來存取 Service。在 minikube 上,
LoadBalancer類型讓您可透過minikube service指令存取 Service。
-
執行以下指令:
minikube service hello-node這會開啟一個瀏覽器視窗,顯示您的應用程式及其回應。
啟用附加元件
minikube 工具內建了一組 附加元件,可在本機 Kubernetes 環境中啟用、停用,或在瀏覽器中開啟。
-
列出目前支援的附加元件:
minikube addons list輸出類似如下:addon-manager: enabled dashboard: enabled default-storageclass: enabled efk: disabled freshpod: disabled gvisor: disabled helm-tiller: disabled ingress: disabled ingress-dns: disabled logviewer: disabled metrics-server: disabled nvidia-driver-installer: disabled nvidia-gpu-device-plugin: disabled registry: disabled registry-creds: disabled storage-provisioner: enabled storage-provisioner-gluster: disabled
-
啟用附加元件,例如
metrics-server:minikube addons enable metrics-server輸出類似如下:The 'metrics-server' addon is enabled
-
查看安裝該附加元件後建立的 Pod 和 Service:
kubectl get pod,svc -n kube-system輸出類似如下:NAME READY STATUS RESTARTS AGE pod/coredns-5644d7b6d9-mh9ll 1/1 Running 0 34m pod/coredns-5644d7b6d9-pqd2t 1/1 Running 0 34m pod/metrics-server-67fb648c5 1/1 Running 0 26s pod/etcd-minikube 1/1 Running 0 34m pod/influxdb-grafana-b29w8 2/2 Running 0 26s pod/kube-addon-manager-minikube 1/1 Running 0 34m pod/kube-apiserver-minikube 1/1 Running 0 34m pod/kube-controller-manager-minikube 1/1 Running 0 34m pod/kube-proxy-rnlps 1/1 Running 0 34m pod/kube-scheduler-minikube 1/1 Running 0 34m pod/storage-provisioner 1/1 Running 0 34m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/metrics-server ClusterIP 10.96.241.45 <none> 80/TCP 26s service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 34m service/monitoring-grafana NodePort 10.99.24.54 <none> 80:30002/TCP 26s service/monitoring-influxdb ClusterIP 10.111.169.94 <none> 8083/TCP,8086/TCP 26s
-
查看
metrics-server的輸出:kubectl top pods輸出類似如下:NAME CPU(cores) MEMORY(bytes) hello-node-ccf4b9788-4jn97 1m 6Mi若您看到以下訊息,請等待後再試:error: Metrics API not available
-
停用
metrics-server:minikube addons disable metrics-server輸出類似如下:metrics-server was successfully disabled
清理
現在您可以清理在叢集中建立的資源:
kubectl delete service hello-node
kubectl delete deployment hello-node
停止 Minikube 叢集:
minikube stop
選擇性地刪除 Minikube 虛擬機器:
# Optional
minikube delete
若您想再次使用 minikube 來學習更多 Kubernetes 知識,則不需要刪除它。
結論
本頁說明了啟動並執行 minikube 叢集的基本步驟,您現在已準備好部署應用程式。
接下來
- 教學:使用 kubectl 在 Kubernetes 上部署您的第一個應用程式。
- 深入了解 Deployment 物件。
- 深入了解部署應用程式。
- 深入了解 Service 物件。
2.2 - 叢集管理
2.2.1 - 使用 DRA 安裝驅動程式並配置裝置
Kubernetes v1.35 [stable](enabled by default)本教學示範如何在叢集中安裝動態資源分配(DRA)驅動程式,以及如何搭配 DRA API 將裝置配置給 Pod。本頁面適合叢集管理員閱讀。
動態資源分配(DRA)讓叢集能夠管理硬體資源的可用性與分配,以滿足 Pod 對硬體資源的需求與偏好。
為了支援此功能,Kubernetes 內建組件(如 Kubernetes 排程器、kubelet 和 kube-controller-manager)與裝置擁有者提供的第三方驅動程式(稱為 DRA 驅動程式)共同負責在 Pod 生命週期中公告、分配、準備、掛載、健康檢查、解除準備及清理資源。這些組件透過 resource.k8s.io API 群組中的一系列 DRA 專用 API 共享資訊,包括 DeviceClasses、ResourceSlices、ResourceClaims,以及 Pod 規格本身的新欄位。
學習目標
- 部署範例 DRA 驅動程式
- 部署使用 DRA API 請求硬體資源的 Pod
- 刪除具有資源請求的 Pod
開始之前
您的叢集應支援 RBAC。您可以在使用其他授權機制的叢集上嘗試本教學,但在這種情況下,您需要調整定義角色和權限的步驟。
您需要有一個 Kubernetes 叢集,且必須設定 kubectl 命令列工具與叢集通訊。建議在至少有兩個不擔任控制平面主機的節點的叢集上執行本教學。如果您還沒有叢集,可以使用 Minikube 建立一個,或使用以下其中一個 Kubernetes 練習環境:
本教學已在 Linux 節點上測試,但也可能適用於其他類型的節點。
您的 Kubernetes 伺服器版本必須不低於 v1.34.若要確認版本,請輸入 kubectl version.
若您的叢集目前未執行 Kubernetes 1.35,請查閱您計劃使用的 Kubernetes 版本的文件。
探索叢集的初始狀態
您可以花些時間觀察啟用 DRA 的叢集初始狀態,對於還不熟悉這些 API 的使用者來說尤為有用。 若您為本教學設定了新叢集,且尚未安裝驅動程式也沒有待滿足的 Pod 請求,這些指令的輸出將不會顯示任何資源。
-
取得 DeviceClasses 清單:
kubectl get deviceclasses輸出類似如下:
No resources found -
取得 ResourceSlices 清單:
kubectl get resourceslices輸出類似如下:
No resources found -
取得 ResourceClaims 和 ResourceClaimTemplates 清單:
kubectl get resourceclaims -A kubectl get resourceclaimtemplates -A輸出類似如下:
No resources found No resources found
至此,您已確認 DRA 在叢集中已啟用且設定正確,且目前尚無 DRA 驅動程式向 DRA API 公告任何資源。
安裝範例 DRA 驅動程式
DRA 驅動程式是在叢集每個節點上執行的第三方應用程式,用於與該節點的硬體及 Kubernetes 內建 DRA 組件互動。 安裝程序取決於您選擇的驅動程式,但通常會以 DaemonSet 的形式部署到叢集中的全部或部分節點(使用選擇器或類似機制)。
請查閱您的驅動程式文件以取得特定安裝說明,其中可能包含 Helm chart、一組設定檔或其他部署工具。
本教學使用可在 kubernetes-sigs/dra-example-driver 儲存庫中找到的範例驅動程式來示範驅動程式安裝。此範例驅動程式會向 Kubernetes 公告模擬 GPU,供您的 Pod 互動。
準備叢集以安裝驅動程式
為了簡化清理工作,請建立名為 dra-tutorial 的命名空間:
-
建立命名空間:
kubectl create namespace dra-tutorial
在正式環境中,您通常會使用驅動程式廠商或您所屬組織先前發佈或認證的映像檔, 且您的節點需要能夠存取託管驅動程式映像檔的映像檔儲存庫。 在本教學中,您將使用公開發佈的 dra-example-driver 映像檔來模擬存取 DRA 驅動程式映像檔。
-
在叢集的其中一個節點上執行以下指令,確認節點可以存取映像檔:
docker pull registry.k8s.io/dra-example-driver/dra-example-driver:v0.2.0
部署 DRA 驅動程式組件
在本教學中,您將使用 kubectl 逐一安裝重要的範例資源驅動程式組件。
-
建立代表此 DRA 驅動程式所支援裝置類型的 DeviceClass:
apiVersion: resource.k8s.io/v1 kind: DeviceClass metadata: name: gpu.example.com spec: selectors: - cel: expression: "device.driver == 'gpu.example.com'"kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/deviceclass.yaml -
建立驅動程式與此叢集 Kubernetes API 互動所需的 ServiceAccount、ClusterRole 和 ClusterRoleBinding:
-
建立 ServiceAccount:
apiVersion: v1 kind: ServiceAccount metadata: name: dra-example-driver-service-account namespace: dra-tutorial labels: app.kubernetes.io/name: dra-example-driver app.kubernetes.io/instance: dra-example-driverkubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/serviceaccount.yaml -
建立 ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: dra-example-driver-role rules: - apiGroups: ["resource.k8s.io"] resources: ["resourceclaims"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get"] - apiGroups: ["resource.k8s.io"] resources: ["resourceslices"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/clusterrole.yaml -
建立 ClusterRoleBinding:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dra-example-driver-role-binding subjects: - kind: ServiceAccount name: dra-example-driver-service-account namespace: dra-tutorial roleRef: kind: ClusterRole name: dra-example-driver-role apiGroup: rbac.authorization.k8s.iokubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/clusterrolebinding.yaml
-
-
為 DRA 驅動程式建立 PriorityClass。 PriorityClass 可防止 DRA 驅動程式組件被搶佔,該組件負責處理具有資源請求的 Pod 的重要生命週期操作。 深入了解 Pod 優先權與搶佔。
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: dra-driver-high-priority value: 1000000 globalDefault: false description: "This priority class should be used for DRA driver pods only."kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/priorityclass.yaml -
將實際的 DRA 驅動程式部署為 DaemonSet,並設定為使用上述已配置的權限執行範例驅動程式二進位檔。 DaemonSet 具有您在前述步驟中授予 ServiceAccount 的權限。
apiVersion: apps/v1 kind: DaemonSet metadata: name: dra-example-driver-kubeletplugin namespace: dra-tutorial labels: app.kubernetes.io/name: dra-example-driver spec: selector: matchLabels: app.kubernetes.io/name: dra-example-driver updateStrategy: type: RollingUpdate template: metadata: labels: app.kubernetes.io/name: dra-example-driver spec: priorityClassName: dra-driver-high-priority serviceAccountName: dra-example-driver-service-account securityContext: {} containers: - name: plugin securityContext: privileged: true image: registry.k8s.io/dra-example-driver/dra-example-driver:v0.2.0 imagePullPolicy: IfNotPresent command: ["dra-example-kubeletplugin"] resources: {} # Production drivers should always implement a liveness probe # For the tutorial we simply omit it # livenessProbe: # grpc: # port: 51515 # service: liveness # failureThreshold: 3 # periodSeconds: 10 env: - name: CDI_ROOT value: /var/run/cdi - name: KUBELET_REGISTRAR_DIRECTORY_PATH value: "/var/lib/kubelet/plugins_registry" - name: KUBELET_PLUGINS_DIRECTORY_PATH value: "/var/lib/kubelet/plugins" - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace # Simulated number of devices the example driver will pretend to have. - name: NUM_DEVICES value: "9" - name: HEALTHCHECK_PORT value: "51515" volumeMounts: - name: plugins-registry mountPath: "/var/lib/kubelet/plugins_registry" - name: plugins mountPath: "/var/lib/kubelet/plugins" - name: cdi mountPath: /var/run/cdi volumes: - name: plugins-registry hostPath: path: "/var/lib/kubelet/plugins_registry" - name: plugins hostPath: path: "/var/lib/kubelet/plugins" - name: cdi hostPath: path: /var/run/cdikubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/daemonset.yamlDaemonSet 設定了與底層容器裝置介面(CDI)目錄互動所需的卷掛載,並透過
kubelet/plugins目錄向kubelet公開其 socket。
驗證 DRA 驅動程式安裝
-
取得所有工作節點上 DRA 驅動程式 DaemonSet 的 Pod 清單:
kubectl get pod -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial輸出類似如下:
NAME READY STATUS RESTARTS AGE dra-example-driver-kubeletplugin-4sk2x 1/1 Running 0 13s dra-example-driver-kubeletplugin-cttr2 1/1 Running 0 13s -
每個節點本地 DRA 驅動程式的初始職責是透過將其中繼資料發布到 ResourceSlices API, 向叢集更新該節點上 Pod 可使用的裝置資訊。您可以查看該 API,確認每個安裝了驅動程式的節點都在公告其所代表的裝置類別。
查看可用的 ResourceSlices:
kubectl get resourceslices輸出類似如下:
NAME NODE DRIVER POOL AGE kind-worker-gpu.example.com-k69gd kind-worker gpu.example.com kind-worker 19s kind-worker2-gpu.example.com-qdgpn kind-worker2 gpu.example.com kind-worker2 19s
至此,您已成功安裝範例 DRA 驅動程式並確認其初始設定。您現在可以使用 DRA 來排程 Pod。
請求資源並部署 Pod
若要使用 DRA 請求資源,您需要建立 ResourceClaims 或 ResourceClaimTemplates 來定義 Pod 所需的資源。 在範例驅動程式中,模擬 GPU 裝置會公開記憶體容量屬性。 本節說明如何使用 Common Expression Language 在 ResourceClaim 中表達您的需求、 在 Pod 規格中選取該 ResourceClaim,以及觀察資源分配情況。
本教學僅展示 DRA ResourceClaim 的一個基本範例。請閱讀動態資源分配以深入了解 ResourceClaims。
建立 ResourceClaim
在本節中,您將建立一個 ResourceClaim 並在 Pod 中參照它。
無論請求內容為何,deviceClassName 都是必填欄位,用於將請求範圍縮小到特定裝置類別。
請求本身可以包含 Common Expression Language 表達式,
用來參照驅動程式針對該裝置類別所公告的屬性。
在本範例中,您將建立一個 ResourceClaim,用於請求任何公告超過 10Gi 記憶體容量的 GPU。
範例驅動程式公開容量的屬性格式為 device.capacity['gpu.example.com'].memory。
另請注意,此請求的名稱設定為 some-gpu。
apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata:
name: some-gpu
namespace: dra-tutorial
spec:
devices:
requests:
- name: some-gpu
exactly:
deviceClassName: gpu.example.com
selectors:
- cel:
expression: "device.capacity['gpu.example.com'].memory.compareTo(quantity('10Gi')) >= 0"kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/example/resourceclaim.yaml
建立參照 ResourceClaim 的 Pod
以下是透過 spec.resourceClaims.resourceClaimName 欄位參照 some-gpu ResourceClaim 的 Pod 設定檔。
該請求的別名 gpu 隨後會在 spec.containers.resources.claims.name 欄位中使用,
以將請求分配給 Pod 的底層容器。
apiVersion: v1
kind: Pod
metadata:
name: pod0
namespace: dra-tutorial
labels:
app: pod
spec:
containers:
- name: ctr0
image: ubuntu:24.04
command: ["bash", "-c"]
args: ["export; trap 'exit 0' TERM; sleep 9999 & wait"]
resources:
claims:
- name: gpu
resourceClaims:
- name: gpu
resourceClaimName: some-gpukubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/example/pod.yaml
-
確認 Pod 已部署:
kubectl get pod pod0 -n dra-tutorial輸出類似如下:
NAME READY STATUS RESTARTS AGE pod0 1/1 Running 0 9s
探索 DRA 狀態
建立 Pod 後,叢集會嘗試將該 Pod 排程到 Kubernetes 可以滿足 ResourceClaim 的節點。 在本教學中,DRA 驅動程式部署在所有節點上,並在所有節點上公告模擬 GPU, 所有節點公告的容量都足以滿足 Pod 的請求,因此 Kubernetes 可以將此 Pod 排程到任何節點, 並分配該節點上的任何模擬 GPU。
當 Kubernetes 將模擬 GPU 分配給 Pod 時,範例驅動程式會為每個被分配到該裝置的容器新增環境變數, 以指示真實資源驅動程式_本應_注入哪些 GPU 及其設定方式, 您可以查看這些環境變數來了解系統如何處理這些 Pod。
-
查看 Pod 日誌,其中記錄了已分配的模擬 GPU 名稱:
kubectl logs pod0 -c ctr0 -n dra-tutorial | grep -E "GPU_DEVICE_[0-9]+=" | grep -v "RESOURCE_CLAIM"輸出類似如下:
declare -x GPU_DEVICE_0="gpu-0" -
查看 ResourceClaim 物件的狀態:
kubectl get resourceclaims -n dra-tutorial輸出類似如下:
NAME STATE AGE some-gpu allocated,reserved 34s在此輸出中,
STATE欄位顯示 ResourceClaim 已被分配且已保留。 -
查看
some-gpuResourceClaim 的詳細資訊。ResourceClaim 的status區段包含已分配裝置及其保留對象 Pod 的資訊:kubectl get resourceclaim some-gpu -n dra-tutorial -o yaml輸出類似如下:
1apiVersion: resource.k8s.io/v1 2kind: ResourceClaim 3metadata: 4 creationTimestamp: "2025-08-20T18:17:31Z" 5 finalizers: 6 - resource.kubernetes.io/delete-protection 7 name: some-gpu 8 namespace: dra-tutorial 9 resourceVersion: "2326" 10 uid: d3e48dbf-40da-47c3-a7b9-f7d54d1051c3 11spec: 12 devices: 13 requests: 14 - exactly: 15 allocationMode: ExactCount 16 count: 1 17 deviceClassName: gpu.example.com 18 selectors: 19 - cel: 20 expression: device.capacity['gpu.example.com'].memory.compareTo(quantity('10Gi')) 21 >= 0 22 name: some-gpu 23status: 24 allocation: 25 devices: 26 results: 27 - device: gpu-0 28 driver: gpu.example.com 29 pool: kind-worker 30 request: some-gpu 31 nodeSelector: 32 nodeSelectorTerms: 33 - matchFields: 34 - key: metadata.name 35 operator: In 36 values: 37 - kind-worker 38 reservedFor: 39 - name: pod0 40 resource: pods 41 uid: c4dadf20-392a-474d-a47b-ab82080c8bd7 -
若要查看驅動程式如何處理裝置分配,請取得驅動程式 DaemonSet Pod 的日誌:
kubectl logs -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial輸出類似如下:
I0820 18:17:44.131324 1 driver.go:106] PrepareResourceClaims is called: number of claims: 1 I0820 18:17:44.135056 1 driver.go:133] Returning newly prepared devices for claim 'd3e48dbf-40da-47c3-a7b9-f7d54d1051c3': [{[some-gpu] kind-worker gpu-0 [k8s.gpu.example.com/gpu=common k8s.gpu.example.com/gpu=d3e48dbf-40da-47c3-a7b9-f7d54d1051c3-gpu-0]}]
您現在已成功部署了一個使用 DRA 請求裝置的 Pod,確認該 Pod 已被排程到適當的節點, 並確認相關的 DRA API 物件已反映最新的分配狀態。
刪除具有資源請求的 Pod
當具有資源請求的 Pod 被刪除時,DRA 驅動程式會釋放資源,使其可用於未來的排程。 為了驗證此行為,請刪除您在前述步驟中建立的 Pod,並觀察 ResourceClaim 和驅動程式的相應變更。
-
刪除
pod0Pod:kubectl delete pod pod0 -n dra-tutorial輸出類似如下:
pod "pod0" deleted
觀察 DRA 狀態
當 Pod 被刪除時,驅動程式會從 ResourceClaim 中釋放裝置,並更新 Kubernetes API 中的 ResourceClaim 資源。
ResourceClaim 將保持 pending 狀態,直到它被新的 Pod 參照為止。
-
查看
some-gpuResourceClaim 的狀態:kubectl get resourceclaims -n dra-tutorial輸出類似如下:
NAME STATE AGE some-gpu pending 76s -
查看驅動程式日誌,確認驅動程式已解除此請求的裝置配置:
kubectl logs -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial輸出類似如下:
I0820 18:22:15.629376 1 driver.go:138] UnprepareResourceClaims is called: number of claims: 1
您現在已刪除了具有資源請求的 Pod,並觀察到驅動程式解除了底層硬體資源的配置, 同時更新 DRA API,讓該資源再次可供排程使用。
清理資源
若要清理本教學中建立的資源,請執行以下步驟:
kubectl delete namespace dra-tutorial
kubectl delete deviceclass gpu.example.com
kubectl delete clusterrole dra-example-driver-role
kubectl delete clusterrolebinding dra-example-driver-role-binding
kubectl delete priorityclass dra-driver-high-priority