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

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

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

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

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

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

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

終端

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

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

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

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

復制代碼

source <(kubectl completion zsh)

這樣可以為 kubectl 命令啟用 tab 鍵自動完成功能,所以不需要再復制黏貼 pod 名字了!

切換集群

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

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

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

增強的 kubectl

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

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

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

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

獲得 pod

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

描述 pod

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

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

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

編輯 YAML

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

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

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

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

目前,我編寫 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,推送新的鏡像,並重新部署到集群中。

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

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/*

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

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

檢查 docker 鏡像

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

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

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

我們可以使用 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 名稱。超級有用:

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

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

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

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

總結

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

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

  • iterm2
  • palenight
  • oh-my-zsh
  • kubectl tab 自動完成
  • kubectx
  • kubectl aliases
  • krew
  • * VSCode
  • * GitLens
  • skaffold
  • dive
  • * stern
  • 英文原文:https://medium.com/@mo_keefe/a-kubernetes-development-workflow-for-macos-8c41669a4518

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!