Tuesday, February 1, 2022

[Kubernetes] 如何把 Master Node 改成有 Worker的屬性 (可分配Pods)

使用命令 kubectl taint 可以給節點(Node)增加一個污點。

比如:

kubectl taint nodes node1 key1=value1:NoSchedule

說明: 

給節點 node1 增加一個污點,它的鍵名是 key1,鍵值是 value1,效果是 NoSchedule。這表示只有擁有和這個污點相匹配的容忍度的 Pod 才能夠被分配到 node1 這個節點。

若要移除上述命令所添加的污點,你可以執行:

kubectl taint nodes node1 key1=value1:NoSchedule-

最常用的例子就是把 Master Node 改成有 Worker的屬性

kubectl taint nodes k8s1 node-role.kubernetes.io/master:NoSchedule-


[更新]

在K8S v1.24之後默認kubeadm取消taint,之前版本使用node-role.kubernetes.io/master標籤,在Kubernetes 1.24版本中,label標籤已經修改為node-role.kubernetes.io/control-plane

查看node節點所有標籤

kubectl get nodes --show-labels

我們可以直接查看master節點污點情況

kubectl describe node <node_name> | grep Taints

生成污點

kubectl taint nodes <node_name> node-role.kubernetes.io/control-plane:NoSchedule

取消污點

kubectl taint nodes <node_name> node-role.kubernetes.io/control-plane:NoSchedule-


Reference: 

kubectl 備忘單

https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/


[Kubernetes] How to use Informer to avoid frequently getting Pod and Service List via clientset.CoreV1()?

How to use Informer to avoid frequently getting Pod and Service List via clientset.CoreV1()?

 [情境]

之前開發Kubernetes相關的系統有遇過這種情況: 

需要不斷的輪詢(Pooling) Kubernetes API 去獲得最新的 Pods 與 Services List,例如是每2秒。但輪詢是比較沒有效率的做法,因為很有極大的可能是,大部分的輪詢結果都是沒有變化的。

 [解決方法]

使用Informer來解決此問題。

Friday, January 28, 2022

[用Golang寫小遊戲教學] 第九章 超簡化的碰撞檢測遊戲

[前言]



這是一個簡單的碰撞檢測遊戲,遊戲功能如下:
1、空格鍵發射紅色塊,紅色塊遇到左、右、上邊界反彈,遇到下邊界遊戲結束。
2、左右鍵移動白色塊接紅色塊,每接到一次加一分。
3、每5秒鐘隨機生成一個黃色塊,紅色塊觸碰到黃色塊時,黃色塊消失並加十分,黃色塊同時最多存在5個

但,這對於初學者來說還是太難理解其運作方式,我把這個小遊戲再精簡成超簡化的碰撞檢測遊戲,遊戲功能如下:
1、空格鍵發射紅色塊,紅色塊遇到左、右、上與下邊界反彈,遊戲不會自動結束。
2、左上角會顯示紅色塊目前的座標
3、在遊戲中按下空格鍵可以暫停,再按一次繼續。

[超簡化的碰撞檢測遊戲]

這邊會需要將Golang執行環境先準備好,請參考:

[用Golang寫小遊戲教學] 第七章 控制結構

[前言]

車輛需要依照交通規則、號誌與標誌來行駛,紅燈時停止、等待,綠燈直行或是轉彎,行駛速度也須遵守時速上限。在程式的世界中,執行程式的電腦也會遵守程式碼內所撰寫的控制結構來執行。在Golang的控制結構包含: If、Switch與For


注意: goto 這個控制結構我們先不研究歐!

[ If 陳述式]

Golang的if 陳述式用來控制程式執行符合條件的區塊,以下是 語法:

if condition1 {
// 如果 condition1 是true, 則此區塊會被執行
} else if condition2 {
        // 如果 condition2 是true, 則此區塊會被執行
} else {
       // 如果 condition1 與 condition2 都不是true, 則此區塊會被執行
}

If陳述式內的條件(condition),可以是產生 true / false 的運算式、變數的值等等。也可以利用 && (and) 或是 || (or) 去做交集或是聯集關係。

請看下列簡單的例子

Friday, January 14, 2022

[用Golang寫小遊戲教學] 第六章 結構 (Struct)

 

[前言]

我們在有些情況會希望把一些資料(有相關性)集結在一個結構內,舉例來說,一張身分證內包含了: 姓名、身份證字號、戶籍地、出生日期、配偶等等的資料,如果我們可以用一種型別可以包含上述這些資料,對於管理資料來說就會方便許多。如果大家有學過C語言的話,就會知道struct 這個複合資料型別。在Golang,就是把在C語言內的struct搬過來使用,並稱之為結構 (Struct)型別。而且,還可以賦予它擁有函數的做法,稱之為Receiver。

注意: 我們暫時不提interface,因為會太複雜ㄡ!


[定義結構(Struct)]

在Golang的定義結構 (Struct) 是使用 type 關鍵字基於 struct 來定義一個新的型別,語法用下列例子說明:

type IdentityCard struct {
myID string
myAge int
}

上述我們定義了一個新的struct型別,名稱是IdentityCard,裡面包含了兩個變數:myID與myAge。但,只是定義新的struct型別還不夠,我們需要宣告變數與初始化它才能使用。關於變數宣告可參考之前的文章: 

Thursday, January 13, 2022

[用Golang寫小遊戲教學] 第五章 函式(Function)

 

[前言]

函式(Function) 指的是將一或多段程式碼包裝起來,並且可以定義不給或是給定帶入的參數值,並可以重複使用。在程式開發中,是非常重要且經常使用的特性。因為它可以讓你的程式碼更方便維護與容易理解。

在之前的文章內有一些練習的連結,大家如果有注意到的話,每個練習都有一個func main() 的主程式函式定義,這也是Golang程式開始執行的進入點。

[函式(Function)之定義]

Golang 定義函式時,利用關鍵字func 放在前面,後面接著函式名稱,而需要輸入的參數型別宣告,則是放在名稱之後的小括號內。如果多個參數有同樣的型別,那麼只要最右邊同型別的名別右方加上型別就可以了。所需要回傳的變數前面須加上return關鍵字。

例如: 

Monday, December 27, 2021

[用Golang寫小遊戲教學] 第四章 陣列(Array)與切片(Slice)

[前言]

陣列(Array)就好比是單排座位的列車,座位編號從0開始,共有N個座位且不可增加座位數量。
切片(Slice)很像陣列(Array),但它是可以增加座位數量。 Slice細節還有關於容量與長度的問題,我們就先忽略它~
所以,這兩種資料結構可以存放一長串的資料,這是在寫小遊戲中非常常使用到的功能。


[陣列(Array)]

陣列(Array):它的長度是固定的(fixed length),使用語法: " [數量] 型別" 定義。例如: [100]int

它比較沒有彈性,內部存放的資料都必須要有相同的型別(像是整數、字串等等)。

已經學習過變數宣告,我們舉兩個例子(變數宣告與變數短宣告)來宣告變數型別為陣列:

Saturday, December 25, 2021

[用Golang寫小遊戲教學] 第一章 Golang開發環境設定

[前言]

工欲善其事,必先利其器。

Golang是個跨作業系統(像是: Windows、Linux、Mac OS等等)與支援多CPU架構(x86、ARM64等等)的程式語言,換句話說,Golang的程式可以透過go command直接在眾多的作業系統與幾種不同的CPU架構下執行。

進一步來說,也可以把Golang程式編譯/或交叉編譯 到不同的作業系統與不同的CPU架構下成為執行檔案,即可直接執行。其內涵不了解沒有關係,這不防礙接下來安裝的步驟。


[安裝Golang]

我這邊只先舉Windows 10的安裝範例,對於Linux或是Mac的作業系統,網路上應該有很多安裝教學可以參考ㄡ~

首先請用點擊下列Golang官方下載網頁:

https://go.dev/dl/