在本文中,我們將簡單瞭解k3d,這是一款可讓您在安裝了Docker的任何地方執行一次性Kubernetes叢集的工具,此外在本文中我們還將探討在使用k3d中可能會出現的一切問題。
什麼是k3d?
k3d是一個小型程式,用於在Docker中執行K3s叢集。 K3s是經過CNCF認證的輕量級Kubernetes發行和沙箱專案。它是為資源有限環境設計的,被打包為單個二進位制檔案,所需RAM小於512MB。 要了解有關K3s的更多資訊,請檢視我們之前的公眾號文章及B站上的視訊。
k3d藉助從K3s倉庫構建的Docker映象在安裝了Docker的任何機器上的Docker容器中啟動多個K3s節點。 這樣,一臺物理(或虛擬)機(稱為Docker Host)可以執行多個K3s叢集,每個叢集同時有多個server和agent節點。
k3d能做什麼?
2021年1月,釋出k3dv4.0.0,包含以下功能:
- 建立/停止/啟動/刪除/擴大/縮小K3s叢集(和單個節點)
- 通過命令列標誌
- 通過配置檔案
- 管理可與叢集一起使用的容器映象倉庫並與之互動
- 管理叢集的Kubeconfigs
- 將本地Docker daemon中的映象匯入叢集中執行的容器執行時中
顯然,還有更多的方法,您可以用來對使用過程中的細節進行調整。
k3d的用途是什麼?
k3d的主要應用場景是在Kubernetes上進行本地開發,因為k3d輕量、簡單的特性,在這一場景下幾乎不會遇到麻煩和資源使用問題。 開發k3d的初衷是為開發人員提供一個簡單的工具,使他們能夠在開發環境的機器上執行輕量級的Kubernetes叢集,從而在類似於生產的環境中獲得快速的迭代時間(相對於在本地執行docker-compose與生產中的Kubernetes要快得多)。
隨著時間的推移,k3d還發展成為一種運維工具,用於在隔離的環境中測試某些Kubernetes(或特別是K3s)功能。 例如,使用k3d,您可以輕鬆地建立多節點叢集,在其上部署一些應用程式,輕鬆停止一個節點並檢視Kubernetes的反應,還能夠將您的應用重新排程到其他節點上。
此外,您可以在持續整合系統中使用k3d來快速啟動叢集,在其上部署測試堆疊並執行整合測試。完成操作後,您就可以輕鬆地停用整個叢集。無需擔心適當的清理和可能的殘留。
我們還提供了一個k3d-dind映象(類似於電影《盜夢空間》中的夢中的夢,我們在容器內的容器中放置了容器。)通過此操作,您可以建立一個執行k3d的docker-in-docker環境,該環境會在Docker中生成一個K3s叢集。這意味著您只有一個容器(k3d-dind)在您的Docker主機上執行,而該容器又在其中執行了整個K3s / Kubernetes叢集。
如何使用k3d?
1、安裝k3d(如需使用也可安裝kubectl)
注意:本文介紹內容對版本有要求,請至少使用k3d v4.1.1以上版本
2、可以嘗試以下其中一個示例,或使用文件或CLI幫助文字找到適合您自己的方式(k3d [command] --help)
“簡單”的方式
k3d cluster create
該命令將建立一個帶有兩個容器的K3s叢集:一個Kubernetes控制平面節點(server)和一個位於其前面的負載均衡器(serverlb)。 它將它們都放置在專用的Docker網路中,並在Docker主機上隨機選擇的免費埠上暴露Kubernetes API。 它還在後臺建立了一個名為Docker的卷,作為映象匯入的準備。
預設情況下,如果不提供name引數,叢集將被命名為k3s-default,並且容器將顯示為k3d-
k3d等待一切準備就緒,從叢集中拉取Kubeconfig並將其與預設的Kubeconfig合併(通常位於$ HOME / .kube / config或者KUBECONFIG環境變數指向的任何路徑中)。
不用擔心,您也可以調整該行為。
使用kubectl檢視您剛建立的用於顯示節點的內容:. kubectl get nodes
k3d還為您提供了一些命令來列出您所建立的東西:.k3d cluster | node | registry list
“簡單但精妙”的方式
k3d cluster create mycluster --api-port 127.0.0.1:6445 --servers 3 --agents 2 --volume '/home/me/mycode:/code@agent[*]' --port '8080:80@loadbalancer'
此命令生成帶有六個容器的K3s叢集:* 1個負載均衡器* 3個server(控制平面節點)* 2個agent(以前為worker節點)
通過--api-port 127.0.0.1:6445,您可以使用k3d將Kubernetes API埠(6443內部)對映到127.0.0.1 / localhost的埠6445。這意味著隨後將在Kubeconfig中包含以下連線字串:server: https://127.0.0.1:6445以連線到此叢集。
該埠將從負載均衡器對映到您的主機系統。請求將從那裡被代理到server節點,從而有效地模擬生產環境設定,在該環境中server節點也可能發生故障,並且希望故障轉移到另一個server上。
--volume /home/me/mycode:/code@agent[] 繫結將你的本地目錄/home/me/mycode掛載到所有([] agent 節點)內部的路徑/code。使用索引(0或1)替換*,以便只把它掛載到其中一個節點。
告訴k3d應該將卷安裝到哪個節點的規範稱為“節點過濾器”,它也用於其他標誌,例如埠對映的--port標誌。
也就是說,--port '8080:80@loadbalancer'將本地主機的埠8080對映到負載均衡器(serverlb)上的埠80,該負載均衡器可用於將HTTP ingress流量轉發到叢集。 例如,可以將Web應用程式部署到叢集(Deployment)中,該叢集通過一個 Ingress(如myapp.k3d.localhost)在外部暴露(Service)。
然後(前提是一切都設定為將該域解析為本地主機IP),則可以將瀏覽器指向http://myapp.k3d.localhost:8080 訪問您的應用程式。 然後,流量從您的主機通過Docker橋介面流向負載均衡器。 從那裡,它被代理到叢集,並通過Ingress和Service傳遞到您的應用程式Pod。
注意:你必須設定一些機制,將myapp.k3d.localhost路由到本地主機IP(127.0.0.1)。
最常見的方法是在你的/etc/hosts檔案中使用127.0.0.1
myapp.k3d.localhost的條目(C:\Windows\System32\drivers\etc/hosts)。。
但是,這不允許使用萬用字元(.localhost),因此一段時間後可能會變得有些麻煩,因此您可能需要了解dnsmasq(MacOS /
UNIX)或Acrylic(Windows)之類的工具來減輕負擔。 提示:可以在某些系統(至少是Linux作業系統,包括SUSE
Linux和openSUSE)上安裝libnss-myhostname軟體包,以將.localhost域自動解析為127.0.0.1,這意味著您不必再手動操作。例如
,如果您希望通過Ingress進行測試,則需要在其中設定域。
在此處,需要注意的事是:如果建立多個server節點,則K3s將被分配到--cluster-init標誌,這意味著它將K3s的預設內部資料庫(預設為SQLite)更改為etcd。
“配置即編碼”方式
從k3d v4.0.0(釋出於2021年1月)開始,我們支援使用配置檔案,來配置一切您以前通過命令列標誌所做的程式碼(不久之後甚至可能支援更多)。在撰寫本文時,您可以在repo中找到用於驗證配置檔案的JSON模式:
https://github.com/rancher/k3d/blob/092f26a4e27eaf9d3a5bc32b249f897f448bc1ce/pkg/config/v1alpha2/schema.json
示例配置檔案:
# k3d configuration file, saved as e.g. /home/me/myk3dcluster.yaml
apiVersion: k3d.io/v1alpha2 # this will change in the future as we make everything more stable
kind: Simple # internally, we also have a Cluster config, which is not yet available externally
name: mycluster # name that you want to give to your cluster (will still be prefixed with `k3d-`)
servers: 1 # same as `--servers 1`
agents: 2 # same as `--agents 2`
kubeAPI: # same as `--api-port 127.0.0.1:6445`
hostIP: "127.0.0.1"
hostPort: "6445"
ports:
- port: 8080:80 # same as `--port 8080:80@loadbalancer
nodeFilters:
- loadbalancer
options:
k3d: # k3d runtime settings
wait: true # wait for cluster to be usable before returining; same as `--wait` (default: true)
timeout: "60s" # wait timeout before aborting; same as `--timeout 60s`
k3s: # options passed on to K3s itself
extraServerArgs: # additional arguments passed to the `k3s server` command
- --tls-san=my.host.domain
extraAgentArgs: [] # addditional arguments passed to the `k3s agent` command
kubeconfig:
updateDefaultKubeconfig: true # add new cluster to your default Kubeconfig; same as `--kubeconfig-update-default` (default: true)
switchCurrentContext: true # also set current-context to the new cluster's context; same as `--kubeconfig-switch-context` (default: true)
假設我們將其另存為/home/me/myk3dcluster.yaml,我們可以使用它來配置新叢集
k3d cluster create --config /home/me/myk3dcluster.yaml
注意:您仍然可以設定額外的引數或標誌,這些引數或標誌將優先於(或將被合併)你在配置檔案中定義的任何引數。
k3d還能做什麼?
你可以在很多場景下使用k3d,例如:
- 與k3d託管的容器倉庫一起建立叢集
- 使用叢集通過熱程式碼過載進行快速開發
- 將k3d與其他開發工具(例如Tilt或Skaffold)結合使用
- 兩者都可以通過k3d image import利用映象匯入的功能
- 兩者都可以利用k3d託管的倉庫來加快開發週期
- 在您的CI系統中使用k3d(為此我們提供了PoC:https://github.com/iwilltry42/k3d-demo/blob/main/.drone.yml)
- 使用社群維護的vscode擴充套件程式(https://github.com/inercia/vscode-k3d)將其整合到您的
- vscode工作流程中 用它來設定K3s的高可用性
您可以通過使用在此demo repo中準備好的指令碼來自己嘗試所有這些操作:
https://github.com/iwilltry42/k3d-demo。
THORSTEN KLEIN
trivago的DevOps工程師,SUSE自由軟體工程師,也是k3d的維護者。