以下為 Ubuntu 22.04 上建立 Kubernetes cluster 的操作步驟,會建立:
- 1 個 master node
- 2 個 worker node,並透過
kubeadm join
到 master node
軟體開發、伺服器和生活瑣事
以下為 Ubuntu 22.04 上建立 Kubernetes cluster 的操作步驟,會建立:
kubeadm join
到 master node因為需要做一系列檢查,醫師建議住院比較不會排隊排太久。原本以為三天左右檢查跑完就可以離開,結果檢查項目一直增加,跑了一週多。
這次攜帶的物品不夠齊全,讓阿宅宅不太起來,所以列一些需要注意的項目供參考。
一般住院注意事項:
常用物品:
阿宅須知:
之前有人提過不明原因被 TeamViewer 判斷成商業用途而要求付費,而我則是不明原因被 TeamViewer 中斷連線。
目前手上有 Parsec 可以玩,在資料壓縮和聯繫速度都蠻出色的,但裝置支援程度稍微差了一些。
另外一個選擇大概就是老牌的 RealVNC,支援 Linux 和 Windows,用 Android 連線也還算順。我可能會考慮用他來替代 TeamViewer 吧。
在 deployment 完成後,可能會建立多個 pods,這些 pods 預設在 node 的 private ip 中,不會與 host 連線。正式的作法,是建立 NodePort service,或是 load balancer 轉送資料到 pods。
若需要暫時與其中一個 pod 連線,可以透過 kubernetes 的 port-forward 功能轉送資料。
先確認欲連線的 pod IP address:
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-nginx-7d76cf4997-68rmh 1/1 Running 0 19m 172.17.0.6 minikube <none> <none> my-nginx-7d76cf4997-d5lxt 1/1 Running 0 19m 172.17.0.5 minikube <none> <none> my-nginx-7d76cf4997-q6rx4 1/1 Running 0 19m 172.17.0.4 minikube <none> <none>
上表中,可以看到 pod 的 IP 都被指定在 172.17.0.x
下。這邊假設我們要在 127.0.0.1 的 port 8080 轉送到 172.17.0.4
這個 pod 的 port 80
:
$kubectl port-forward pods/my-nginx-7d76cf4997-q6rx4 8080:80 Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80
顯示 port-forwarding 狀態、且指令仍在執行沒有中斷,表示 port-forwarding 建立成功。接下來就可以從 127.0.0.1:8080
送資料到 pod 中 (範例中 pod 中為 nginx):
$ curl http://127.0.0.1:8080 <html><body><p> Hello World, kubernetes </p></body></html>
我明明應該要寫 code 的啊,為什麼現在都在寫 config …..
追 minikube 中的 log kubectl logs s3-provider-xxxx -p
時,看到錯誤訊息:
Defaulted container "s3fuse" out of: s3fuse, init-myservice (init) /bin/sh: /docker-entrypoint.sh: Permission denied
第一,是檢查 docker-entrypoint.sh
的權限。要讓 script 可以執行,在 COPY
進 image 以後記得調整權限:
RUN ["chmod", "+x", "/docker-entrypoint.sh"]
另外,再看了一下 entrypoint 寫什麼:
#!/bin/bash set -euo pipefail set -o errexit set -o errtrace ....
第一行這樣寫有點雷。
shebang 雖然可以讓 shell 可以了解需要使用哪一個直譯器來執行 script (可以參考之前 shebang 的介紹),但是每個系統的 bash 路徑並不一定相同。有些在 /bin/bash
,有些則在 /usr/bin/bash
,當然還有其他例外。
若不確定直譯器的路徑時,可以透過 env
這個指令來協助,這個工具在個系統上的絕對路徑都是 /usr/bin/env
,env
會從 runtime environment 偵測執行檔的路徑 (上面的範例是 bash),這樣一來 script 作者就不需要為每個環境來客製化設定。
用 env
來改寫 shebang
,結果如下:
#!/usr/bin/env bash set -euo pipefail set -o errexit set -o errtrace ....