尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
Kubernetes 開發沒有一刀切的解決方案。你可能在本地機器上通過 Minikube 學習 Kubernetes,你也可能是一個擁有眾多集群的大型組織的一員;你的集群可能就部署在本地實驗室中,也可能部署在雲端。
無論你是需要管理策略的集群管理員,還是需要開發新服務的應用程序開發人員,或者是運行 Kubeflow 的數據科學家,你可能正在做這些(或全部)事情:連接集群、檢查集群狀態、創建資源以及調試這些資源。
作為 Kubernetes 開發者關係工程師,我經常與演示代碼、示例和沙箱集群打交道。在這篇文章中,我將展示一些工具,這些工具可以幫助我更好地管理 Kubernetes。
無論你正在運行什麼樣的 Kubernetes,都可以使用這個環境,而且這些工具都可以從開源社區獲得。
終端
我使用了帶有 palenight 配色主題的 iterm2,還使用默認的 robby-russell 主題運行zsh和 oh_my_zsh。
這個主題有基本的 Git 支持,如果你希望在 shell 提示符中顯示當前的 Kubernetes 上下文,可以看看kube-ps1或spaceship 提示符。
其次,我的~/.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/*
這是一個最小化的配置,我指定了鏡像倉庫(在這里是Google容器註冊表,但其他鏡像註冊表也可以,如 DockerHub)。我還指定了清單文件所在的目錄。
skaffold 是高度可定制的,除了 kubectl 之外,還可以與 Helm 等部署工具一起使用。
檢查 docker 鏡像
skaffold 抽象了 docker 的構建過程,但有時候我想查看新構建鏡像的這些內容:與以前的版本相比,鏡像大小有怎樣的變化?每個鏡像層的內容是什麼?
dive 是一個用於檢查 Docker 鏡像的神奇工具。
我們可以使用 dive 來檢查不同鏡像層之間文件系統的變更。如果在 Docker 構建過程中某些內容出現了問題,這個工具會非常有用。
調試
現在我們已經有了運行 Kubernetes 的 pod。接下來該做些什麼?
每隔一段時間,我的規範文件或應用程序代碼就會出問題。
我的 kubernetes 調試工作流程通常是這樣的:
- 描述 pod(使用 kdpo 別名)。是我的規範文件出錯了嗎?(例如:Deployment 是否試圖掛載一個我不小心放入另一個命名空間的 Secret?)如果不是……
- 獲取 pod 日志。skaffold dev 命令將每個部署的容器的所有日志組合起來,將它們流式傳輸到 stdout。但是我發現,當我有兩個或多個 pod 在運行時,格式會變得很亂。同時,通常的 kubectl logs 命令可能導致無限復制黏貼新 pod 的名稱。
stern 是一種非常棒的替代方案,以更定制化的方式查看日志尾部。stern 使用正則表達式在 pod 上選擇日志——並且假設所有 pod 都以部署名稱作為開頭,你可以跟蹤所有部署中的 pod 日志,而無需知道確切的 pod 名稱。超級有用:
如果日志沒有給我提供有用的線索,通常我會…
- 進入 pod(帶有 tab 鍵自動完成功能的 kex 別名):
總結
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