Kubernetes之curl除錯
導讀 |
Kubernetes是一個開源的、用於管理雲平臺中多個主機上的容器化應用的系統。其目標是讓部署容器化的應用簡單並且高效(powerful),它提供了應用部署,規劃,更新,維護的一種機制。
|
Kubernetes是一個開源的、用於管理雲平臺中多個主機上的容器化應用的系統。其目標是讓部署容器化的應用簡單並且高效(powerful),它提供了應用部署,規劃,更新,維護的一種機制。
Kubernetes一個核心的特點就是能夠自主的管理容器來保證雲平臺中的容器按照使用者的期望狀態執行著(比如使用者想讓apache一直執行,使用者不需要關心怎麼去做,Kubernetes會自動去監控,然後去重啟,新建,總之,讓apache一直提供服務)。
管理員可以載入一個微型服務,讓規劃器來找到合適的位置,同時,Kubernetes也系統提升工具以及人性化方面,讓使用者能夠方便的部署自己的應用(就像canary deployments)。
現在Kubernetes著重於不間斷的服務狀態(比如web伺服器或者快取伺服器)和原生雲平臺應用(Nosql),在不久的將來會支援各種生產雲平臺中的各種服務,例如,分批,工作流,以及傳統資料庫。
對於有些人而言,Kubernetes是一個非常複雜排程系統。
…因為它很複雜,所以配置非常冗長。
…由於配置YAML太多,我們需要配合其他多種工具軟體來處理該配置。
但是,在本文中,我認為那些認為kubernetns複雜的人,是因為沒有找到合理的方式去學習以及使用kubernetns,就像早期的作業系統一樣。
Kubernetes對於如何管理配置有一個簡單而巧妙的方式,本文也將討論這種方式。
因為這種方式簡單,一致,所以我們可以管理比以往更多的配置!現在,我們不僅可以管理更多的配置,也可以構建複雜的系統。
當然,配置本身可能很複雜。因此,在這篇文章中,我將跳過配置。我將僅專注於kubernetes API機制以及如何探索該API。
以這種方式構建API可以使許多工具受益。
為了解釋這種簡單而高效的方式,讓我們從Unix系統的最核心思想開始:
Everything is a file.
更確切地說,一切皆文字。Unix程式讀取和寫入文字。檔案系統是用於查詢要讀取的文字的API。並非所有這些文字都是檔案!
- ~/hello-world.txt 是一個文字檔案
- /dev/null 是一個空文字流
- /proc 是用於閱讀有關程式的一組文字流
- 正在執行多少個程式(ls /proc——列出程式)
- 哪些 行啟動了流程PID(cat /proc/PID/cmdline——獲取程式)
- 程式PID正在使用多少記憶體(cat /proc/PID/status——獲取程式狀態)
- kind ——一個使用 Docker 容器 “nodes” 執行 Kubernetes 叢集的工具
- curl ——用於傳送HTTP請求的CLI工具
- jq ——用於解析JSON的CLI工具
- kubectl——命令管理Kubernetes 叢集,幫助curl認證
透過下面的漫畫圖,讓我們仔細看看/proc。
您可以透過以下的方式來檢視以及瞭解系統上正在執行什麼/proc,例如:
Kubernetes API是叢集系統中的重要組成部分,Kubernetes中各種資源(物件)的資料透過該API介面被提交到後端的持久化儲存(etcd)中,Kubernetes叢集中的各部件之間透過該API介面實現解耦合,同時Kubernetes叢集中一個重要且便捷的管理工具kubectl也是透過訪問該API介面實現其強大的管理功能的。
Kubernetes API 是基於資源的(RESTful)、透過 HTTP 提供的程式設計介面。API 支援透過標準的 HTTP 動詞(POST、PUT、PATCH、DELETE 和 GET) 檢視、建立、更新和刪除主要資源,為很多允許細粒度許可權控制的物件提供子資源 (如將 Pod 繫結到節點上),並且出於便利性或效率考慮,支援並提供這些資源的 不同表示形式。
Kubernetes API 還透過 "watch" 和一致性的列表支援高效的資源變更通知, 從而允許其他元件對資源的狀態進行高效的快取和同步。
Kubernetes API適用/proc於分散式系統。
一切都是基於HTTP的資源。我們可以使用一些HTTP GET 探索每個Kubernetes資源。
如果要繼續進行下去,您需要熟悉以下的幾種工具:
下面,讓我們從快速建立叢集開始:
$ kind create cluster Creating cluster "kind" ... ✓ Ensuring node image (kindest/node:v1.19.1) ? ✓ Preparing nodes ? ✓ Writing configuration ? ✓ Starting control-plane ?️ ✓ Installing CNI ? ✓ Installing StorageClass ? Set kubectl context to "kind-kind" You can now use your cluster with: kubectl cluster-info --context kind-kind Have a nice day! ? $ kubectl proxy & Starting to serve on 127.0.0.1:8001
本質上kubectl proxy為訪問kubernetes apiserver的REST api充當反向代理角色,這裡反向代理的作用與通常意義上的反向代理作用相同,比如提供統一入口進行訪問控制、監控、管理,在代理中管理後端,在代理中進行認證等。
當然可以不經過kubectl proxy反向代理直接訪問kubernetes apiserver的REST api,但是需要手動管理kubernetes apiserver的地址、手動獲取token、手動將token加請到請求的頭部,相對來說要繁瑣而已。
Kubernetes API比/proc具有更多的層次結構。按版本,名稱空間和資源型別將其分為多個資料夾。API路徑格式如下:
/api/[version]/namespaces/[namespace]/[resource]/[name]
在一個新的kind叢集上,可以看到的名稱空間kube-system中已經有一些Pod正在執行 。讓我們列出叢集中的所有系統程式:
$ curl -s | head -n 20 { "kind": "PodList", "apiVersion": "v1", "metadata": { "selfLink": "/api/v1/namespaces/kube-system/pods", "resourceVersion": "1233" }, "items": [ { "metadata": { "name": "coredns-f9fd979d6-5zxtx", "generateName": "coredns-f9fd979d6-", "namespace": "kube-system", "selfLink": "/api/v1/namespaces/kube-system/pods/coredns-f9fd979d6-5zxtx", "uid": "a30e70cc-2b53-4511-a5de-57c80e5b68ad", "resourceVersion": "549", "creationTimestamp": "2021-03-04T15:51:21Z", "labels": { "k8s-app": "kube-dns", "pod-template-hash": "f9fd979d6"
上述命令會返回大量的內容!我們可以使用jq來提取物件的名稱。
$ curl -s | jq '.items[].metadata.name' "coredns-f9fd979d6-5zxtx" "coredns-f9fd979d6-bn6jz" "etcd-kind-control-plane" "kindnet-fcjkd" "kube-apiserver-kind-control-plane" "kube-controller-manager-kind-control-plane" "kube-proxy-sn64n" "kube-scheduler-kind-control-plane"
/pods羅列出了所有的程式,就像ls /proc一樣。如果我們要檢視一個特定的程式,可以查詢/pods/POD_NAME。
$ curl -s | head -n 10 { "kind": "Pod", "apiVersion": "v1", "metadata": { "name": "kube-apiserver-kind-control-plane", "namespace": "kube-system", "selfLink": "/api/v1/namespaces/kube-system/pods/kube-apiserver-kind-control-plane", "uid": "a8f893b7-1cdb-48fd-9505-87d71c81adcb", "resourceVersion": "458", "creationTimestamp": "2021-03-04T15:51:17Z",
然後,我們可以再次使用jq來獲取特定欄位。
$ curl -s | jq '.status.phase' "Running"
上面的所有操作本質上都是可以使用kubectl來完成。kubectl提供了更友好的介面。但是,如果您想知道kubectl正在呼叫什麼API ,可以使用以下命令加上-v 6來執行它:
$ kubectl get -v 6 -n kube-system pods kube-apiserver-kind-control-plane I0304 12:47:59.687088 3573879 loader.go:375] Config loaded from file: /home/nick/.kube/config I0304 12:47:59.697325 3573879 round_trippers.go:443] GET NAME READY STATUS RESTARTS AGE kube-apiserver-kind-control-plane 1/1 Running 0 116m
有關更高階別的除錯,請使用-v 8來檢視完整的響應結果。
本文的關鍵不是要拋棄kubectl而是使用curl來與Kubernetes進行互動。就像您不應該拋棄ps而僅使用ls / proc一樣。
但是我發現像這樣剖析Kubernetes有助於對系統的深入瞭解有很大的幫助:
這些方式可能看起來會有點簡單,有點傻,但是卻往往是最有效的方式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2778291/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kubernetes 使用arthas進行除錯除錯
- AS之Debug除錯除錯
- PHP 除錯利器之 PHPDBGPHP除錯
- Kubernetes原始碼分析之Pod的刪除原始碼
- Dapr 遠端除錯之 Nocalhost除錯
- Xcode除錯技巧之:LLDBXCode除錯LLDB
- VS除錯技巧之附加程式除錯
- Emacs 除錯祕籍之 GUD 偵錯程式Mac除錯
- Python 之 錯誤,除錯和測試Python除錯
- windows下curl報錯:curl : (1) Protocol https not supported or disabled in libcurlWindowsProtocolHTTP
- 除錯篇——除錯物件與除錯事件除錯物件事件
- 除錯Kubernetes工作負載的最簡單方法 - Martin除錯負載
- 006 Web Assembly之除錯方法Web除錯
- Java安全之jar包除錯技巧JavaJAR除錯
- Postman除錯技巧之介面簽名Postman除錯
- Python之PySnooper程式碼除錯PythonOOP除錯
- debug技巧之遠端除錯除錯
- debug技巧之使用Arthes除錯除錯
- PHP curl error 60 錯誤解決PHPError
- Python學習之錯誤除錯和測試Python除錯
- 移動端網頁除錯 之 Eruda網頁除錯
- Xcode之斷點除錯詳解XCode斷點除錯
- 軟體除錯斷點之小記除錯斷點
- PHP中cURL錯誤號對照[轉]PHP
- PHP報錯:Call to undefined function curl_init()PHPUndefinedFunction
- Windows windbg kernel debug 雙機核心除錯 - USB3.0 除錯 USB除錯 除錯線Windows除錯
- chromium 之 CSS 解析過程(程式碼除錯)CSS除錯
- 前端入門技巧之瀏覽器除錯前端瀏覽器除錯
- 22 真機除錯bug(除錯包)除錯
- Linux命令curl去操作delete去刪除資源Linuxdelete
- gdb除錯命令小結_與多檔案除錯_遠端除錯除錯
- nginx 錯誤除錯Nginx除錯
- rac錯誤除錯除錯
- Python 程式碼除錯—使用 pdb 除錯Python除錯
- Mobile Web 除錯指南(2):遠端除錯Web除錯
- 根據除錯工具看Vue原始碼之watch除錯Vue原始碼
- 使用GDK7除錯Linux核心之KVM除錯Linux
- 斷點除錯之壓縮引發的血案斷點除錯