把 minikube 文件內有提到的功能找幾個玩玩,快速的看過吧!
其實 minikube 的文件比我想像中還豐富的許多,裡面也提供不少 **Tutorials,**若有時間的話也推薦讀者去看看,說不定會有意想不到的收穫唷~
https://minikube.sigs.k8s.io/docs/handbook/addons/
minikube addon 指令提供使用者一些常見於會部署在 k8s cluster 中做使用的 APP (e.g. ingress controller, service mesh 等等)
以下拿幾個來測試玩玩看
Headlamp 我之前沒有用過,但看起來是個前端的 k8s 管理介面,來安裝看看:
minikube addons enable headlamp
啟用之後,可以稍微觀察發現到 k8s cluster 新增了一個 namesapce: headlamp
,並且部署了一個服務:
PS C:\Users\user> kubectl get po -n headlamp
NAME READY STATUS RESTARTS AGE
headlamp-68456f997b-cxb8j 1/1 Running 0 23s
等到 pods 為 Running 之後,再進行下面的步驟:
minikube service headlamp -n headlamp
執行 minikube service 指令後,會開啟一個頁面需要輸入 token,按照官方文件提供的指令獲取:
export SECRET=$(kubectl get secrets --namespace headlamp -o custom-columns=":metadata.name" | grep "headlamp-token")
kubectl get secret $SECRET --namespace headlamp --template=\{\{.data.token\}\} | base64 --decode
然後… 神奇的事情就發生了! windows 沒有 base64 指令沒辦法解析 secret → 開玩笑的,這個問題還好解決,但是 headlamp 裡面根本就沒有 secret 的物件呀!!
PS C:\Users\user> kubectl get secret -n headlamp
No resources found in headlamp namespace.
於是我就想起來了,在 k8s 1.24 之後,預設建立的 k8s cluster 是不會自動產生 serviceaccount 的 sercet token 的 (因為資安考量吧),於是乎目前我想到的有兩種解法:
/var/run/secrets/kubernetes.io/serviceaccount/token
路徑底下這裡我們使用第二種方式:
# 先獲取 pods 資訊確認掛載點
kubectl get po -n headlamp headlamp-68456f997b-cxb8j -o yaml
--- ...
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-26gv9
readOnly: true
--- ...
# 直接使用 kubectl exec 加上 cat 獲得資訊:
kubectl exec -n headlamp -it deployment/headlamp -- cat /var/run/secrets/kubernetes.io/serviceaccount/token
# eyJhbGciOiJSUzI1NiIsImtpZCI6Ijlhd3BVakFp 後面省略
使用上述指令獲得的 token 再回到瀏覽器上面輸入後,即可登入成功:
這時就可以瀏覽 GUI 看看有哪些有趣的功能了~
另外文件內也有提到,部分的資訊會需要 metrics-server,也是使用 minikube addon 指令就可以安裝了,真是方便。
minikube addons enable metrics-server
試用了一下,就以前端介面來說,功能算是蠻齊全了,對 pods 的 exec, logs ,edit
等等功能都有實作,顯示的資訊大致上就是 kubectl describe
指令能看到的資訊都整合上去了
在 pods 的介面可以看到需要在 k8s cluster 中安裝 prometheus 才可以看到比較詳細的資訊,或者等之後有機會再試試看吧。
總之比起 k8s 官方文件內推薦的 kubernetes-dashboards 看起來是再好用一點點 (個人觀點)
有興趣的讀者也可以到他們的 github 看看其他有趣的功能:https://github.com/headlamp-k8s/headlamp
https://minikube.sigs.k8s.io/docs/handbook/addons/istio/
istio 算是目前發展蠻成熟的一套 service mesh 工具,就來試試看在 minikube 上面的情況吧
一樣直接按照官方文件提供的指令來安裝:
minikube addons enable istio-provisioner
minikube addons enable istio
安裝完之後檢查,可以發現只有部屬基本的 istiod
以及 ingressgateway
兩個元件,常見的 kiali, jaeger 等等都沒有:
PS C:\Users\user> kubectl get po -n istio-system
NAME READY STATUS RESTARTS AGE
istio-ingressgateway-85c8c87b68-gnk25 1/1 Running 0 116s
istiod-64464fcbb9-7c7bt 1/1 Running 0 2m8s
在 minikube 的官方文件也只有到這邊,沒有提供 demo 來測試,那就拿前一天的範例來注入看看 sidecar 吧~
注入 sidecar 最快的方式就是直接在 namespace 上面打上對應的 labels
# 打入標籤,該 namespace 新建的 pods 都會加入 sidecar
PS C:\Users\user> kubectl label namespace default istio-injection=enabled
# 建立一個新的 pods
PS C:\Users\user> kubectl run test-sidecar --image=nginx
pod/test-sidecar created
PS C:\Users\user> kubectl get po
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 4d
test-sidecar 2/2 Running 0 14s
可以看到新建的 pods Ready 數為 2/2,即代表有 sidecar 的加入
接著拿我以前建立過的 virtualservices
+ gateways
測試看看,先確認目前的 apiVersion:
PS C:\Users\user> kubectl api-resources
...
destinationrules dr networking.istio.io/v1beta1 true DestinationRule
gateways gw networking.istio.io/v1beta1 true Gateway
virtualservices vs networking.istio.io/v1beta1 true VirtualService
...
目前環境內是使用 networking.istio.io/v1beta1
# 將以下內容儲存於 C:\Users\user\Documents\istio.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: my-gateway
namespace: istio-system # istio 的 namepsace
spec:
selector:
app: istio-ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "default/*.istio.com" # namespace/提供的 URL name
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-virtualservice
namespace: default
spec:
hosts:
- "nginx.istio.com" # 須申請 DNS record 至 istio-ingressgateway
gateways:
- istio-system/my-gateway # 對應至 namespace/Gateway name
http:
- match:
- uri:
prefix: /
route:
- destination:
host: test-sidecar
port:
number: 80 # 對應至 k8s service port
# 建立 service
PS C:\Users\user> kubectl expose pod test-sidecar --port=80
# 建立 vs,gw
PS C:\Users\user> kubectl apply -f C:\Users\user\Documents\istio.yaml
建立完以上內容後,確認環境資訊:
PS C:\Users\user> kubectl get svc -n istio-system
# externalIP pending 沒關係,我們會透過 cluster-ip 測試
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.99.50.9 <pending> 15021:32360/TCP,80:32508/TCP,443:32311/TCP 42m
# 確認 istio 資源
PS C:\Users\user> kubectl get vs,gw -A
NAMESPACE NAME GATEWAYS HOSTS AGE
default virtualservice.networking.istio.io/my-virtualservice ["istio-system/my-gateway"] ["nginx.istio.com"] 21m
NAMESPACE NAME AGE
istio-system gateway.networking.istio.io/my-gateway 21m
接著透過 minikube ssh
連線進 nodes,再透過 istio-ingressgateway
來連線看看
PS C:\Users\user> minikube ssh
# 透過 header 的方式模擬 DNS 測試使用
docker@minikube:~$ curl 10.99.50.9 -H "Host: nginx.istio.com"
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
可以注意到 10.99.50.9
這個 IP 是 istio-ingressgateway
的 IP,他會透過 vs,gw
的定義去找尋 nginx.istio.com 此 DNS 該導向至 k8s cluster 中的哪個服務
若是此環境內配有 load-balancer 的機制,就可以透過這個方式來暴露服務給外部做使用。
其實 minikube 的文件還蠻豐富的,推薦讀者可以多去逛逛,或許可以看到一些有趣的 use cases
另外也可以注意到上面的第一個 Headlamp 範例中,很明顯的文件的 demo 指令沒有人去更新 1.24 版本之後的流程,或許各位讀者有興趣的話也可以發 PR 過去修改文件開啟您的 開源貢獻之路 喔 ~
💡 補充:在 minikube 的文件中有個 Presentations 的頁面,主要是存放各種 KubeCon 與 minikube 相關的演講,其中一篇 KubeCon EU 2023 Minikube from CLI to GUI! - YouTube 在影片約 9 分鐘左右時,有特別解釋到上篇說 minikube 竟然可以在 k8s 1.24+ 直接使用 docker 當作 CRI
我英聽沒有很好,但似乎講者有提到說 minkube 有針對這點特別保留了 kubelet 的某些 code,若有興趣的讀者也可以去看此影片 ~
minikube 的試用就到此告一段落,接下來我會使用 windows 建立 ubuntu VM,並且使用 kubeadm
來建立一個正式的 k8s clsuter。
https://github.com/headlamp-k8s/headlamp
https://minikube.sigs.k8s.io/docs/handbook/addons/
https://www.youtube.com/watch?v=74X1RmqfUzs
https://istio.io/latest/docs/setup/getting-started/