iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Kubernetes

一起來看 Kubernetes 官方文件吧!系列 第 4

Day04 - 一起來看 Kubernetes 官方文件吧!- minikube (下)

  • 分享至 

  • xImage
  •  

前言

把 minikube 文件內有提到的功能找幾個玩玩,快速的看過吧!

今日目標

  • 試用 minikube addon 指令
  • 試用 Headlamp
  • 試用 istio

其實 minikube 的文件比我想像中還豐富的許多,裡面也提供不少 **Tutorials,**若有時間的話也推薦讀者去看看,說不定會有意想不到的收穫唷~

minikube addon

https://minikube.sigs.k8s.io/docs/handbook/addons/

minikube addon 指令提供使用者一些常見於會部署在 k8s cluster 中做使用的 APP (e.g. ingress controller, service mesh 等等)
以下拿幾個來測試玩玩看

Headlamp Addon

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

https://ithelp.ithome.com.tw/upload/images/20240918/20168801bS21I0SD3d.png

執行 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 的 (因為資安考量吧),於是乎目前我想到的有兩種解法:

  1. 透過官方的方式手動建立一個 secret,並且給予對應的 annotations 連結至 serviceaccount
  2. 直接從上面看到的 pods 的對應目錄去抓檔案內容,預設會掛載至 /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 再回到瀏覽器上面輸入後,即可登入成功:

https://ithelp.ithome.com.tw/upload/images/20240918/20168801SQIN3TsCwQ.png

這時就可以瀏覽 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

Istio Addon

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/


上一篇
Day03 - 一起來看 Kubernetes 官方文件吧!- minikube (上)
下一篇
Day05 - 一起來看 Kubernetes 官方文件吧!- k8s 版本的生命週期
系列文
一起來看 Kubernetes 官方文件吧!11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言