使用 K3s 和 Traefik 創(chuàng)建本地開發(fā)集群
完整的 Kubernetes 集群往往非常復雜,需要較高的資源,往往我們在開發(fā)期間需要一個完整的 Kubernetes 來運行我們的應用,但是并不要求達到生產級別的集群,本文我們將探討幾種本地輕松配置 Kubernetes 集群的方法。
本地 Kubernetes 集群
我們先來回顧幾種適合在我們自己的電腦上運行 Kubernetes 集群的方案。
Minikube
Minikube 是 Kubernetes 項目文檔中建議使用的一種解決方案,它用一個單節(jié)點集群部署一個虛擬機,我們需要付出虛擬化的代價,主機的最低要求 2CPU、2G內存、20G 存儲空間。
這是一種簡單有效的學習 kubectl 命令的方法,但是單節(jié)點會有一些的不方便的地方,但 Minikube 團隊最近引入了多節(jié)點作為實驗性功能,來幫助解決這個問題。
Kind
Kind 是 Kubernetes SIG 的另一種用于本地部署集群的方法。他的核心實現是讓整個集群運行在 Docker 容器中。因此,它比 Minikube 更容易設置和更快啟動。它支持單個節(jié)點或多 master 以及多工作節(jié)點。
Kind 是為一致性測試和用于 CI 管道而創(chuàng)建的,提供了一些不錯的功能,比如可以直接在集群內部加載 Docker 鏡像,而不需要推送到外部鏡像倉庫。
k3s / k3d
K3s 是一個輕量級的集群,為了實現這種極簡主義,做了一些取舍。
集群的默認存儲是使用 SQLite 而不是 Etcd 所有的控制平面組件都封裝在一個單一的二進制中 控制外部依賴的數量
K3d 是一個允許我們在 Docker 容器內運行 k3s 的工具,就像 Kind 一樣。
應該選哪個?
我個人的需求是:
集群要快速啟動和停止 不同的集群可以并排運行 集群必須使用最少的系統(tǒng)資源
對我來說,最適合的是 k3d,因為它很容易配置,它在 Docker 中運行,消耗的資源很少,而且開箱即用功能齊全。
現在讓我們來看看如何使用 k3d 建立一個集群。
使用 k3d 啟動集群
首先先獲取 k3d,通過 https://github.com/rancher/k3d#get 獲取安裝方式。
創(chuàng)建新的 k3d 集群
直接運行下面的命令即可創(chuàng)建一個新的集群:
$?k3d?cluster?create?devcluster?\
--api-port?127.0.0.1:6443?\
-p?80:80@loadbalancer?\
-p?443:443@loadbalancer?\
--k3s-server-arg?"--no-deploy=traefik"
INFO[0000]?Created?network?'k3d-devcluster'?????????????
INFO[0000]?Created?volume?'k3d-devcluster-images'???????
INFO[0001]?Creating?node?'k3d-devcluster-server-0'??????
INFO[0016]?Pulling?image?'docker.io/rancher/k3s:v1.18.9-k3s1'?
INFO[0040]?Creating?LoadBalancer?'k3d-devcluster-serverlb'?
INFO[0056]?Pulling?image?'docker.io/rancher/k3d-proxy:v3.1.3'?
INFO[0064]?(Optional)?Trying?to?get?IP?of?the?docker?host?and?inject?it?into?the?cluster?as?'host.k3d.internal'?for?easy?access?
INFO[0066]?Successfully?added?host?record?to?/etc/hosts?in?2/2?nodes?and?to?the?CoreDNS?ConfigMap?
INFO[0066]?Cluster?'devcluster'?created?successfully!???
INFO[0066]?You?can?now?use?it?like?this:????????????????
kubectl?cluster-info
上面的創(chuàng)建集群命令有幾個需要注意的地方:
我們將本地主機的80和443端口映射到 k3s 虛擬負載均衡器上,這可以讓我們能夠直接從本地主機上訪問到 ingress 資源。 群集的部署沒有使用默認的 Traefik Ingress 控制器。
為什么要禁用 Traefik?因為我們可能想使用另一個 Ingress 控制器,或者因為 k3s 默認是與 Traefik 1 綁定在一起的,后面我們會安裝Traefik 2 版本。
獲取憑證
運行下面的命令獲取你的憑證,將其保存在文件中并導出到你的環(huán)境中:
$?mkdir?-p?$HOME/k3d
$?k3d?kubeconfig?get?devcluster?>?$HOME/k3d/kubeconfig
$?export?KUBECONFIG=$HOME/k3d/kubeconfig
通過運行一個簡單的 Kubectl 命令來測試你是否可以訪問集群。
$?kubectl?cluster-info
Kubernetes?master?is?running?at?[https://127.0.0.1:6443](https://127.0.0.1:6443/)
CoreDNS?is?running?at?[https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy](https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy)
Metrics-server?is?running?at?[https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy](https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy)
To?further?debug?and?diagnose?cluster?problems,?use?'kubectl?cluster-info?dump'.
安裝 Traefik 2
我們可以直接使用 Helm 來快速安裝 Traefik 2:
$?helm?repo?add?traefik?https://containous.github.io/traefik-helm-chart
"traefik"?has?been?added?to?your?repositories
$?helm?repo?list
NAME????URL????????????????????????????????????????????
traefik?https://containous.github.io/traefik-helm-chart
$?helm?install?traefik?traefik/traefik
NAME:?traefik
LAST?DEPLOYED:?Sun?Oct?18?01:18:16?2020
NAMESPACE:?default
STATUS:?deployed
REVISION:?1
TEST?SUITE:?None
部署完成后檢查 Traefik 是否正常工作,我們可以通過 port-forward ?dashboard 來驗證:
$?kubectl?port-forward?$(kubectl?get?pods?--selector?"app.kubernetes.io/name=traefik"?--output=name)?--address?0.0.0.0?9000:9000
然后在瀏覽器中訪問 http://localhost:9000/dashboard/,正常可以訪問到 traefik 的 dashboard 頁面。

部署應用
接下來部署一個簡單的應用程序來驗證我們的 Ingress Controller 是否正確配置了,這里我們使用 whoami 應用程序:
$?kubectl?create?deploy?whoami?--image?containous/whoami
deployment.apps/whoami?created
$?kubectl?expose?deploy?whoami?--port?80
service/whoami?exposed
然后我們定義一個 Ingress 規(guī)則來使用我們新的 Traefik,Traefik 既能讀取自己的 CRD IngressRoute,也能讀取傳統(tǒng)的 Ingress 資源。
apiVersion:?networking.k8s.io/v1beta1
kind:?Ingress
metadata:
??name:?whoami
??annotations:
????traefik.ingress.kubernetes.io/router.entrypoints:?web,websecure
????traefik.ingress.kubernetes.io/router.tls:?"true"
spec:
??rules:
??-?http:
??????paths:
??????-?path:?/
????????backend:
??????????serviceName:?whoami
??????????servicePort:?80
在這個例子中,我們在 HTTP 和 HTTPs 兩個入口點上暴露了 whoami 服務,每一個 URL 都會被發(fā)送到該服務上,我們可以在 Traefik Dashboard 上看到新的路由器。

要測試這個應用我們可以直接在瀏覽器中訪問:https://localhost/ ?即可,這是因為上面我們安裝 Traefik 的時候自動創(chuàng)建了一個 LoadBalancer 的 Service 服務。
$?kubectl?get?svc
NAME?????????TYPE???????????CLUSTER-IP????EXTERNAL-IP???PORT(S)??????????????????????AGE
kubernetes???ClusterIP??????10.43.0.1?????????????443/TCP??????????????????????13m
traefik??????LoadBalancer???10.43.32.29???172.19.0.2????80:31005/TCP,443:31507/TCP???7m25s
whoami???????ClusterIP??????10.43.98.9????????????80/TCP???????????????????????4m5s
總結
從上面示例可以看出創(chuàng)建一個開發(fā)級別的集群是非常簡單的,而且還有更多的功能可以挖掘,包括 k3s 的 Helm charts 自動部署或者使用 Golang API 來管理啊 Kind 的集群,快使用用一個功能齊全的 Kubernetes 集群取代你的老式 Docker-compose 吧。
原文鏈接:https://codeburst.io/creating-a-local-development-kubernetes-cluster-with-k3s-and-traefik-proxy-7a5033cb1c2d
訓練營推薦


?點擊屏末?|?閱讀原文?|?即刻學習云原生知識