- Kubernetes進階實戰
- 馬永亮
- 2299字
- 2019-03-13 14:20:37
2.3 kubectl使用基礎與示例
Kubernetes API是管理其各種資源對象的唯一入口,它提供了一個RESTful風格的CRUD(Create、Read、Update和Delete)接口用于查詢和修改集群狀態,并將結果存儲于集群狀態存儲系統etcd中。事實上,API server也是用于更新etcd中資源對象狀態的唯一途徑,Kubernetes的其他所有組件和客戶端都要通過它來完成查詢或修改操作,如圖2-9所示。從這個角度來講,它們都算得上是API server的客戶端。

圖2-9 API Server及其部分客戶端
任何RESTful風格API中的核心概念都是“資源”(resource),它是具有類型、關聯數據、同其他資源的關系以及可對其執行的一組操作方法的對象,它與對象式編程語言中的對象實例類似,兩者之間的重要區別在于RESTful API僅為資源定義了少量的標準方法(對應于標準HTTP的GET、POST、PUT和DELETE方法),而編程語言中的對象實例通常有很多方法。另外,資源可以根據其特性分組,每個組是同一類型資源的集合,它僅包含一種類型的資源,并且各資源間不存在順序的概念,集合本身也是資源。對應于Kubernetes中,Pod、Deployment和Service等都是所謂的資源類型,它們由相應類型的對象集合而成。
API Server通過認證(Authentication)、授權(Authorization)和準入控制(Admission Control)等來管理對資源的訪問請求,因此,來自于任何客戶端(如kubectl、kubelet、kube-proxy等)的訪問請求都必須事先完成認證之后方可進行后面的其他操作。API Server支持多種認證方式,客戶端可以使用命令行選項或專用的配置文件(稱為kubeconfig)提供認證信息。相關的內容將在后面的章節中給予詳細說明。
kubectl的核心功能在于通過API Server操作Kubernetes的各種資源對象,它支持三種操作方式,其中直接命令式(Imperative commands)的使用最為簡便,是了解Kubernetes集群管理的一種有效途徑。
kubectl命令常用操作示例
為了便于讀者快速適應kubectl的命令操作,這里給出幾個使用示例用于說明其基本使用方法。
1.創建資源對象
直接通過kubectl命令及相關的選項創建資源對象的方式即為直接命令式操作,例如下面的命令分別創建了名為nginx-deploy的Deployment控制器資源對象,以及名為nginx-svc的Service資源對象:
$ kubectl run nginx-deploy --image=nginx:1.12--replicas=2 $ kubectl expose deployment/nginx --name=nginx-svc --port=80
用戶也可以根據資源清單創建資源對象,即命令式對象配置文件,例如,假設存在定義了Deployment對象的nginx-deploy.yaml文件,和定義了Service對象的nginx-svc.yaml文件,使用kubectl create命令即可進行基于命令式對象配置文件的創建操作:
$ kubectl create -f nginx-deploy.yaml -f nginx-svc.yaml
甚至還可以將創建交由kubectl自行確定,用戶只需要聲明期望的狀態,這種方式稱為聲明式對象配置。例如,假設存在定義了Deployment對象的nginx-deploy.yaml文件,以及定義了Service對象的nginx-svc.yaml文件,那么使用kubectl apply命令即可實現聲明式配置:
$ kubectl apply -f nginx-deploy.yaml -f nginx-svc.yaml
本章后面的章節主要使用第一種資源管理方式,第二種和第三種方式將在后面的章節中展開講述。
2.查看資源對象
運行著實際負載的Kubernetes系統上通常會存在多種資源對象,用戶可分類列出感興趣的資源對象及其相關的狀態信息,“kubectl get”正是用于完成此類功能的命令。例如,列出系統上所有的Namespace資源對象,命令如下:
$ kubectl get namespaces
用戶也可一次查看多個資源類別下的資源對象,例如,列出默認名稱空間內的所有Pod和Service對象,并輸出額外信息,可以使用如下形式的kubectl get命令:
$ kubectl get pods, services -o wide
Kubernetes系統的大部分資源都隸屬于某個Namespace對象,缺省的名稱空間為default,若需要獲取指定Namespace對象中的資源對象的信息,則需要使用-n或--namespace指明其名稱。例如,列出kube-namespace名稱空間中擁有k8s-app標簽名稱的所有Pod對象:
$ kubectl get pods -l k8s-app -n kube-system
3.打印資源對象的詳細信息
每個資源對象都包含著用戶期望的狀態(Spec)和現有的實際狀態(Status)兩種狀態信息,“kubectl get -o {yaml|josn}”或“kubectl describe”命令都能夠打印出指定資源對象的詳細描述信息。例如,查看kube-system名稱空間中擁有標簽component=kube-apiserver的Pod對象的資源配置清單(期望的狀態)及當前的狀態信息,并輸出為yaml格式,命令如下:
$ kubectl get pods -l component=kube-apiserver -o yaml -n kube-system
而“kubectl describe”命令還能顯示與當前對象相關的其他資源對象,如Event或Controller等。例如,查看kube-system名稱空間中擁有標簽component=kube-apiserver的Pod對象的詳細描述信息,可以使用下面的命令:
$ kubectl describe pods -l component=kube-apiserver -n kube-system
這兩個命令都支持以“TYPE NAME”或“TYPE/NAME”的格式指定具體的資源對象,如“pods kube-apiserver-master.ilinux.io”或“pods/kube-apiserver-master.ilinux.io”,以了解特定資源對象的詳細屬性信息及狀態信息。
4.打印容器中的日志信息
通常一個容器中僅會運行一個進程(及其子進程),此進程作為PID為1的進程接收并處理管理信息,同時將日志直接輸出至終端中,而無須再像傳統的多進程系統環境那樣將日志保存于文件中,因此容器日志信息的獲取一般要到其控制上進行。“kubectl logs”命令可打印Pod對象內指定容器的日志信息,命令格式為“kubectl logs [-f] [-p] (POD|TYPE/NAME) [-c CONTAINER] [options]”,若Pod對象內僅有一個容器,則-c選項及容器名為可選。例如,查看名稱空間kube-system中僅有一個容器的Pod對象kube-apiserver-master. ilinux.io的日志:
$ kubectl logs kube-apiserver-master.ilinux.io -n kube-system
為上面的命令添加“-f”選項,還能用于持續監控指定容器中的日志輸出,其行為類似于使用了-f選項的tail命令。
5.在容器中執行命令
容器的隔離屬性使得對其內部信息的獲取變得不再直觀,這一點在用戶需要了解容器內進程的運行特性、文件系統上的文件及路徑布局等信息時,需要穿透其隔離邊界進行。“kubectl exec”命令便是用于在指定的容器內運行其他應用程序的命令,例如,在kube-system名稱空間中的Pod對象kube-apiserver-master.ilinux.io上的唯一容器中運行ps命令:
$ kubectl exec kube-apiserver-master.ilinux.io -n kube-system -- ps
注意,若Pod對象中存在多個容器,則需要以-c選項指定容器后再運行。
6.刪除資源對象
使命已經完成或存在錯誤的資源對象可使用“kubectl delete”命令予以刪除,不過,對于受控于控制器的對象來說,刪除之后其控制器可能會重建出類似的對象,例如,Deployment控制器下的Pod對象在被刪除時就會被重建。例如,刪除默認名稱空間中名為nginx-svc的Service資源對象:
$ kubectl delete services nginx-svc
下面的命令可用于刪除kube-system名稱空間中擁有標簽“k8s-app=kube-proxy”的所有Pod對象:
$ kubectl delete pods -l app=monitor -n kube-system
若要刪除指定名稱空間中的所有的某類對象,可以使用“kubectl delete TYPE --all -n NS”命令,例如,刪除kube-public名稱空間中的所有Pod對象:
$ kubectl delete pods --all -n kube-public
另外,有些資源類型(如Pod),支持優雅刪除的機制,它們有著默認的刪除寬限期,不過,用戶可以在命令中使用--grace-period選項或--now選項來覆蓋默認的寬限期。
- 深度實踐OpenStack:基于Python的OpenStack組件開發
- Android開發精要
- 我的第一本算法書
- Network Automation Cookbook
- Java Web應用開發技術與案例教程(第2版)
- C語言程序設計案例式教程
- JSP開發案例教程
- Scientific Computing with Scala
- UNIX Linux程序設計教程
- 基于SpringBoot實現:Java分布式中間件開發入門與實戰
- Kivy Cookbook
- SQL Server 2008 R2數據庫技術及應用(第3版)
- 3ds Max印象 電視欄目包裝動畫與特效制作
- Java Web開發實例大全(基礎卷) (軟件工程師開發大系)
- Drupal Search Engine Optimization