Kubectl
修改 Kubernetes Kube Proxy IPVS scheduler mode
由於 kube-proxy 在 ipvs scheduler 的模式是 rr,這篇會教學如何在 kubernetes cluster 裡面改變 ipvs scheduler 的模式。
環境
目前有三台 node 所組成的 kubernetes cluster
1 | kubectl get nodes -o wide |
Kubernetes 裡面有一個 hello world deployment,並使用 NodePort 暴露 8080 port 的位置。
1 | kubectl get all |
使用 ipvsadm 查看 ipvs 的 scheduler 模式,目前的模式是 rr。
1 | ipvsadm -ln |
下一節將說明如何修改 ipvs scheduler 的方法。
方法
首先,IPVS scheduler 的設定是在 kube-proxy 的 ConfigMap 裡面。
1 | kubectl edit cm kube-proxy -n kube-system |
將 data.config.conf.ipvs.scheduler 裡的參數修改成其他的 scheduler 模式:
1 | data: |
在 Service: IPVS proxy mode 裡面有提供以下的 scheduler 的模式:
- rr: round-robin
- lc: least connection (smallest number of open connections)
- dh: destination hashing
- sh: source hashing
- sed: shortest expected delay
- nq: never queue
或參考 IPVS wiki
刪除原有的 kube-proxy 的 pod,daemonset.apps/kube-proxy 會自動重新建立新的 kube-proxy Pod。
1 | kubectl delete -n kube-system $(kubectl get all -n kube-system | grep pod/kube-proxy | cut -d ' ' -f 1) |
再次使用 ipvsadm 查看 ipvs 的 scheduler 就會是修改後的狀態。
1 | ipvsadm -ln |
Reference
管理多個 Kubernetes Cluster:建立、切換、合併 context
用途
要存取某個 Kubernetes 的 cluster,必須先設定好 Kubernetes 的 context,context 裡面會描述要如何存取到你的 Kubernetes 的 cluster。
當你今天有兩個 Kubernetes 的 cluster 的時候,分別是正式版的 cluster 跟測試用的 cluster,很頻繁在這兩個 cluster 作切換,這時候只需要分別對兩個不同的 context 就可以了,然後利用 kubectl 提供的指令,就能在不同的 cluster 作切換。
雖然目前還用不到兩個 cluster,但我還是建議先設定這個檔案,因為在還沒有設定這個檔案前,你可能會需要 ssh 遠端回你的主機才能使用 kubectl 指令,不過你可以在本地端設定這份檔案,就不需要遠端回你的主機了。
能夠有這些方便的功能,都是建立在你已經在本地端建立好你的設定檔。
Context
在 Kubernetes 裡面,切換不同的 cluster 是以 context 為單位,一個 context 裡面必需要三個元件,分別是 User、Server、Certification。這三個東西說起來也很直觀,有個使用者 (User) 必須要有憑證 (Certification) 才能連到某個 Cluster (Server)。
底下是一個 Context 所包含的內容:
1 | +---------------+ |
Server 跟 Certification 會一起放在 Cluster 底下,這麼做的好處是,如果今天有兩個不同的使用者,想要連到同一個 Cluster,則不需要重新輸入一次 Certification 跟 Server。
通常設定檔會放在 $HOME/.kube/
底下,然後檔名命名為 config
,不需要副檔名,當你使用 kubectl 指令的時候,預設就會使用這個設定檔。
這裡提供一個設定檔的範例,裡面的架構就如同上面的圖,可以對照著看,我也加了些註解:
1 | # $HOME/.kube/config |
如果路徑正確,檔名正確,設定內容正確,就能看一下我們目前狀態:
1 | kubectl config get-contexts |
第二欄 NAME 就是 context 的名稱,透過 use-context 指令就能夠在不同的設定檔作切換:
1 | kubectl config use-context <context-name> |
像是這樣:
1 | kubectl config use-context minikube |
路徑
尋找設定檔的優先順序:
- 優先使用環境變數
$KUBECONFIG
所設定的路徑 - 如果沒有設定
$KUBECONFIG
環境變數,則使用${HOME}/.kube/config
假設想要使用其他的設定檔 /tmp/admin.conf
,那可以這樣輸入:
1 | export KUBECONFIG=/tmp/admin.conf |
這看起來並不是非常好用,如果你要切換某個 context 的時候,還需要設定 KUBECONFIG
的路徑,如果能把所有 context 整合在一起就會好用多了。
Merge
Kubernetes 目前並沒有 kubectl config merge
的指令,不過在未來可能會有,有興趣的話可以參考這篇 Github 上的討論。
暫時性
目前解決方法是用冒號 : 將不同的檔案串在一起,放在越前面的檔案,順位越高:
1 | export KUBECONFIG=${HOME}/.kube/config:/tmp/admin.conf |
或是在每次輸入指令前都加上 KUBECONFIG
的設定:
1 | KUBECONFIG=${HOME}/.kube/config:/tmp/admin.conf kubectl config get-contexts |
永久性
直接寫進 bashrc,每當開啟終端機的時候都會套用環境變數:
1 | ~/.bashrc |
一勞永逸地做法,把新的檔案跟 ${HOME}/.kube/config
合併:
1 | KUBECONFIG=${HOME}/.kube/config:/tmp/admin.conf kubectl config view --flatten > mergedkub && mv mergedkub ${HOME}/.kube/config |
另外還有腳本:
1 | ~/.bashrc |
使用方法:
1 | kmerge /tmp/admin.conf |