查看 Namespace 與資源對象
預設的 Kubernetes 提供了幾個 namespace 用於不同的目的,下面的結果在 GKE 或 kubeadm 上目前使用是一樣的,至於 namespace 名稱的用途可參考此鏈接
$ kubectl get namespace
NAME STATUS AGE
default Active 13h
kube-node-lease Active 13h
kube-public Active 13h
kube-system Active 13h
針對某一個特定 namespace 進行詳細訊息查看
$ kubectl describe namespaces default
如果使用了 namespace 將一些應用進行隔離,我們要查看特定 namespace 下資源時須使用 -n 參數進行切換,預設是在 default 上。下面結果是 GKE 的環境。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
event-exporter-v0.3.0-5cd6ccb7f7-mp7p4 2/2 Running 0 13h
fluentd-gcp-scaler-6855f55bcc-mchvv 1/1 Running 0 13h
fluentd-gcp-v3.1.1-f8wc8 2/2 Running 0 13h
fluentd-gcp-v3.1.1-g6mbn 2/2 Running 0 13h
fluentd-gcp-v3.1.1-zq4xm 2/2 Running 0 13h
heapster-gke-7c7bdf567c-cmqhm 3/3 Running 0 13h
kube-dns-5c446b66bd-5ltbw 4/4 Running 0 13h
kube-dns-5c446b66bd-fqvwk 4/4 Running 0 13h
...
Namespace 資源管理
我們拿上一章節的實驗來做說明。
定義 namespace 清單。
apiVersion: v1
kind: Namespace
metadata:
name: test
使用 create 建立該清單的資源。
$ kubectl creat -f namespace-example.yaml
$ kubectl get namespace # 這邊會看到所建立的 test namespace 資源
直接建立
$ kubectl create namespace prod
上面說了建立,在刪除方面只要刪除了 namespace 會刪除與其相關的資源。下面顯示了刪除的方式,ns 為 namespace 縮寫。
$ kubectl delete ns test
namespace "test" deleted
POD 資源管理操作
POD 是 Kubernetes 中的一個核心組件,可以將其用 json 或 yaml 各式定義乘資源清單,最後由聲明式或宣告式進行資源管理。整個流程如下圖,用戶透過 create 或 apply 將資源清單請求提交至 API Server 並將其保存至集群狀態儲存系統 etcd 中,之後由調度元件把用戶請求調度至最佳節點,而被選中節點將借助 kubectl 和 CRI 進行容器建立。這種由客戶端直接由 API Server 建立的 POD 稱作為自主式 POD。

我們使用 yaml 定義資源清單,但 Api Server 會將其轉 JSON 再執行
Imperative Object Configuration
建立 POD 資源
POD 是用於容器相關應用,因此在 spec 字段中需要定義 containers,它為容器的列表,可以建立多個容器。下面為一個 POD 資源清單範例
apiVersion: v1
kind: Pod
metadata:
name: pod-demo # POD 名稱
namespace: default # 選擇 namespace
labels: # 標籤
app: myapp
tier: frontend
spec:
containers: # 定義容器
- name: myapp
image: nginx:1.18
- name: busybox
image: busybox:latest
command: ["bin/sh", "-c", "sleep 3600"]
使用 create 建立 POD,-f 可以支援以路徑方式或 URL。
$ kubectl create -f pod-demo.yaml
pod/pod-demo created
查看 POD 狀態
get 通常用來顯示資源對象狀態訊息。使用 -o wide 時可以知道更多訊息。
$ kubectl get pods pod-demo
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 0 10s
$ kubectl get pods pod-demo -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 0 9m11s 10.4.2.5 gke-cluster-1-default-pool-7dc8b11b-r7rg <none> <none>
describe 可以詳細的描述出 POD 資源的內容,像是 Volume、QoS等,當中 event 相當重要,其訊息可檢視出為何 POD 會故障等訊息以用來除錯。
$ kubectl describe pods pod-demo
Name: pod-demo
Namespace: default
Priority: 0
Node: gke-cluster-1-default-pool-7dc8b11b-r7rg/10.128.0.22
Start Time: Sun, 30 Aug 2020 10:56:36 +0000
Labels: app=myapp
tier=frontend
Annotations: kubernetes.io/limit-ranger: LimitRanger plugin set: cpu request for container myapp; cpu request for container busybox
...
更新 POD 資源
正在運行的 POD 上帶有非常多的字段,而並非所有字段都能修改。我們使用 replace 方式進行實驗,我們將修改容器 image。
先在 yaml 檔將 image 版本從 1.18 變成 1.12,在執行以下指令。但發現這樣使用出現了錯誤。
$ kubectl replace pods -f pod-demo.yaml
The Pod "pod-demo" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)
core.PodSpec{
- Volumes: nil,
使用以下方式就可以避免上面的失敗。對於 POD 來說,能夠修改的欄位有限,自定義的 yaml 跟系統上面的 yaml 不一樣,因此無法覆蓋,會存在著少資源覆蓋多資源問題。因此在修改時應該是要跟系統 yaml 一模一樣才對,透過 -o yaml 可以取得。在進行 replace 時,無定義的 yaml 都會被檢視出來,反正必須取得當前運行的 yaml,修改後呼叫 replace 覆蓋。
$ kubectl get pod pod-demo -o yaml > pod-replace-demo.yaml
$ vi pod-replace-demo.yaml
$ kubectl replace -f pod-replace-demo.yaml
pod/pod-demo replaced
$ kubectl describe pod pod-demo # 容器 image 已經更改
當然除了上面方法,還有加 --force 的方式,它會將 POD 資源先刪除並重新建立。
$ kubectl replace -f pod-demo.yaml --force
pod "pod-demo" deleted
pod/pod-demo replaced
$ kubectl describe pod pod-demo # 容器 image 已經更改
而 edit 是另一種方式,像是使用 vi,它直接編輯了該 POD 完整資訊,因此可以直接利用此方式進行修改。
$ kubectl edit pods pod-demo # 此方式也能進行修改
刪除 POD 資源
$ kubectl delete pod pod-demo
pod "pod-demo" deleted
然而,replace 在現實中並非很理想,對於更改的配置難以追蹤,取而代之的是 Declarative object configuration ,可以嘗試將上面的步驟用 apply 取代。
$ kubectl apply -f pod-demo.yaml
總結
我們介紹了 Namespace 操作同時知道 POD 資源配置是由 kind、apiVersion、metadata、spec 和 status 組成。同時也比較 Imperative 和 Declarative。這邊也學習到使用 create、delete、replace、edit、apply 等指令應用。