一套適用於MacOS的Kubernetes開發工作流

Kubernetes開發沒有一刀切的解決方案。你可能在本地機器上通過Minikube學習Kubernetes,你也可能是一個擁有衆多集羣的大型組織的一員;你的集羣可能就部署在本地實驗室中,也可能部署在雲端。

無論你是需要管理策略的集羣管理員,還是需要開發新服務的應用程序開發人員,或者是運行Kubeflow的數據科學家,你可能正在做這些(或全部)事情:連接集羣、檢查集羣狀態、創建資源以及調試這些資源。

作爲Kubernetes開發者關係工程師,我經常與演示代碼、示例和沙箱集羣打交道。在這篇文章中,我將展示一些工具,這些工具可以幫助我更好地管理Kubernetes。

無論你正在運行什麼樣的Kubernetes,都可以使用這個環境,而且這些工具都可以從開源社區獲得。

終端

我使用了帶有palenight配色主題的iterm2,還使用默認的robby-russell主題運行zsh和oh_my_zsh。

這個主題有基本的Git支持,如果你希望在shell提示符中顯示當前的Kubernetes上下文,可以看看kube-ps1spaceship提示符

其次,我的~/.zshrc文件有一行:

source <(kubectl completion zsh)

這樣可以爲kubectl命令啓用tab鍵自動完成功能,所以不需要再複製粘貼pod名字了!

切換集羣

我每天幾乎都會在三個集羣之間來回切換。你可能也會這樣!每次都要打開kubeconfig文件,你會覺得煩嗎?我想肯定會的!所幸的是,kubectx可以解決這個問題:

kubectx可讓你輕鬆地在集羣上下文之間切換。我最喜歡的是運行kubectx -,它將連接到上一次使用的集羣。

增強的kubectl

現在我們已經有一個集羣可以使用了,讓我們開始做點什麼吧。

也許你覺得kubectl命令會變得很長,有太多的命令行標誌。我發現kubectl的tab鍵自動完成功能和一組別名(命令快捷方式)非常有用。

這裏有一組很棒的kubectl別名,你可以像下面這樣運行命令:

獲得pod

描述pod

最後,我使用了一些kubectl插件。但手動設置這些可能會很煩人,所以我使用了krew,一個開源的kubectl插件管理器:

你可以用krew來瀏覽、安裝和使用kubectl插件,這樣你就可以運行自定義命令。

編輯YAML

現在我們已經準備好了一個集羣,接下來讓我們來部署一些東西。

Kubernetes開發涉及編寫、管理、更新和部署大量的YAML文件。我把所有的YAML文件都提交到Git上。儘早使用GitOps(而不是在本地保存文件)可以讓我看到修訂歷史記錄,當我開始爲正在開發的應用程序正式化管道時,這些可以幫我獲得成功。

我將VSCode作爲文本編輯器,並使用了Moonlight主題。儘管VSCode已經提供了很多很棒的功能,Red Hat的YAML插件爲驗證、自動完成和格式化提供了很多便利。

目前,我編寫Kubernetes YAML的過程仍然是手動的。通常,對於每個新項目,我都需要編寫相同的Kubernetes規範文件:ConfigMap、Secret、Volume、Deployment、Service。

我正在努力尋找簡化這個過程的方法,不管是通過使用文本編輯器插件、模板還是其他工具。如果你使用了有助於編寫和管理YAML的工具,請讓我知道!

部署

有了YAML文件之後就可以開始部署資源了!因爲我的kubectl環境已經得到了增強,我迫不及待地想要開始手動部署資源。

但這可能是一條艱難的道路,你將會陷入到docker build、docker push、kubectl apply和kubectl delete pod命令的沼澤中。這一點都不好玩。

不過,有一個叫作skaffold的工具可以自動消除這種痛苦。skaffold非常神奇:它會監聽代碼庫發生的變更。當你在本地保存變更時,skaffold將自動進行docker build,推送新的鏡像,並重新部署到集羣中。

skaffold會自動生成鏡像標籤,這點非常酷。因此,在你的YAML文件中,你只需要列出鏡像倉庫,而不是標籤,skaffold將在部署時填充新標籤。

spec:
  containers:
  - name: helloworld
    image:  gcr.io/megangcp/helloworld
    imagePullPolicy: Always
   ports:
     - containerPort: 8080

skaffold需要的只是一個YAML配置文件:

apiVersion: skaffold/v1beta3
kind: Config
build:
  artifacts:
  - image: gcr.io/megangcp/helloworld
deploy:
  kubectl:
    manifests:
      - kubernetes/*

這是一個最小化的配置,我指定了鏡像倉庫(在這裏是谷歌容器註冊表,但其他鏡像註冊表也可以,如DockerHub)。我還指定了清單文件所在的目錄。

skaffold是高度可定製的,除了kubectl之外,還可以與Helm等部署工具一起使用。

檢查docker鏡像

skaffold抽象了docker的構建過程,但有時候我想查看新構建鏡像的這些內容:與以前的版本相比,鏡像大小有怎樣的變化?每個鏡像層的內容是什麼?

dive是一個用於檢查Docker鏡像的神奇工具。

我們可以使用dive來檢查不同鏡像層之間文件系統的變更。如果在Docker構建過程中某些內容出現了問題,這個工具會非常有用。

調試

現在我們已經有了運行Kubernetes的pod。接下來該做些什麼?

每隔一段時間,我的規範文件或應用程序代碼就會出問題。

我的kubernetes調試工作流程通常是這樣的:

  1. 描述pod(使用kdpo別名)。是我的規範文件出錯了嗎?(例如:Deployment是否試圖掛載一個我不小心放入另一個命名空間的Secret?)如果不是……

  2. 獲取pod日誌。skaffold dev命令將每個部署的容器的所有日誌組合起來,將它們流式傳輸到stdout。但是我發現,當我有兩個或多個pod在運行時,格式會變得很亂。同時,通常的kubectl logs命令可能導致無限複製粘貼新pod的名稱。

stern是一種非常棒的替代方案,以更定製化的方式查看日誌尾部。stern使用正則表達式在pod上選擇日誌——並且假設所有pod都以部署名稱作爲開頭,你可以跟蹤所有部署中的pod日誌,而無需知道確切的pod名稱。超級有用:

如果日誌沒有給我提供有用的線索,通常我會…

  1. 進入pod(帶有tab鍵自動完成功能的kex別名):

總結

Kubernetes是一款龐大而複雜的軟件,擁有大型的配置模型。我希望通過分享這些工具給你帶來一些幫助,無論你處在k8s旅程中的哪個位置。

以下是本文中提到的工具和插件的完整清單:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章