222. Choosing Kubernetes Infrastructure

這個章節在講如何選擇 K8s 建在哪裡,知道了一個蠻有趣的名詞 Kubernetes Turnkey Cloud Solutions

223. Configure High Availability

api_server_ha_0

api-server 可以是 Active-Active mode,不過 kubectl config 一次只能設定一個 URL,所以建議在前面放一個 load blancer

active_standby_mode_component

但是 Controller ManagerScheduler 就不能是 A-A mode,避免重複動作

controller_manager_election

controller-manager 預設在啟動時會帶 --leader-elect true 執行搶旗,沒有搶到的節點每兩秒 (--leader-elect-retry-period) 會去看看當選人是不是死了。

controller_manager_election_resource

▲ 搶旗方式是看誰先去更新 K8s 內的 resource kube-controller-manager(由 --leader-elect-resource-name string 定義 docs)

etcd_stacked_topology

▲ etcd stacked topology 就是將 ETCD server 置於 master node 裡面。

etcd_external_topology

▲ etcd 作為一個獨立的元件當然可以外掛,反正我們都要在 api-server config 內設定 etcd server 在哪。

224. ETCD in HA

這個章節主要討論 etcd 如何做 HA。

etcd_official_site

▲ etcd 官方網站的介紹說明 etcd 是一個 分散式且可靠的鍵值資料庫 (A distributed, reliable key-value store)

etcd_read_write_both

▲ etcd 每一個 node 都可以 R/W (這句話界於對與不對之間,後面會講到)

etcd_process_write_0

嚴格一點說起來 etcd 每個節點都能受理「寫入任務」,但只有 leader node 會執行寫入、派送的動作。

etcd_process_write_1

▲ 其它 follower 節點受理寫入任務後會把 transaction pass 到 leader node 身上。

OK,寫入沒問題了! 真的沒問題了嗎? leader node 要怎麼確保 transaction 合法、有效?

leader_election_raft_arglorithm

▲ 我們先來講講 leader 如何被選出的,etcd 使用 RAFT 的演算法來執行選舉,每個 node 身上都設有一個 random timer,時間一到就向其他節點發送類似「我可以當 leader 嗎」的請求來獲得選票取得 leader 資格。

etcd_process_write_2

▲ 那.. 當其中一個節點死去沒有辦法執行 transaction,這則 transaction 還有效嗎? 答案是: 只要超過 majority (quorum) 執行這則 transaction 就視為成功、合法。

官方 F&Q Why an odd number of cluster members? 提到

An etcd cluster needs a majority of nodes, a quorum, to agree on updates to the cluster state.

etcd_quorum

▲ etcd quorum 計算方式以及容錯程度 (無條件捨去),通常我們會選擇 3, 5, 7 單數作為 etcd cluster node 的數量。

how_to_install_etcd_0

▲ etcd 安裝的方式。

how_to_install_etcd_1

▲ 在 systemd service conf 設定 peer 資訊。

etcdctl_useage

etcd API 有分 V2 與 V3

我的 Minikube

一直以來我的練習環境都是使用 minikube,一款由官方維護能快速打造 kubernetes multi node 的工具。本來相關資訊都是放在另外的 MD 筆記裡面,剛好跟這一個章節有關,順便整合一下好了!

minikube dashboard

Minikube 自帶 dashboard add-on 功能 會自動幫你在 host OS 開一個 proxy server 橋接運作在 docker (我 driver 選 docker) 的 control-plane。

1
minikube dashboard

ssh tunnel

2022.07.25 註: 因為我的 minikube VM 本來是放在 remote 某個 office 裡面,沒有在 localhost 所以必須打 tunnel 開 dashboard (或者其他需求) 會比較方便。
office WSL used. 搭配 FireFox portable 使用 (設定 SOCKS 5 proxy),即可直接以 localhost 方式連接 minikube dashboard 或者其他網頁。

1
2
3
4
5
6
7
8
## for kubectl cluster-info used
sudo ssh -4fND 7777 root@192.168.207.151

## for dashboard use (minikube dashboard)
sudo ssh -4fNL 37676:127.0.0.1:37676 root@192.168.207.151

## check process
ps -aux

這個部分我也超級久沒碰 (中間還隔了 4 個月 ROC Army = =ゞ) 所以附上科普文章 SSH Tunneling (Port Forwarding) 詳解

使用 minikube 內建的 kubectl

灌好 minikube 後使用 minikube 自帶的 kubectl

1
2
3
4
5
6
7
alias kubectl='minikube kubectl -- '

## check version
kubectl version

## autocompletion
echo 'source <(kubectl completion bash)' >>~/.bashrc

kubectl 自動補齊

2022.10.18 更新 minikube version: 1.27.1

不知道為什麼 minikube 自帶的 kubectl 一直沒辦法自動補齊,後來手動安裝 kubelet 想直接使用 kubelet 的 bash completion 卻也無法使用 (kubectl: /usr/local/bin/kubectl, source <(kubectl completion bash)) @@

變成 minikube kubelet -- completion bash 混搭手動額外安裝的 kubelet 方能使用。

1
2
3
source <(minikube kubectl -- completion bash)
alias k=kubectl
complete -o default -F __start_kubectl k

~/.bashrc

echoserver 部屬

2022.07.25 註: 這邊應該是在練習 CKAD service 的時候弄的吧~

1
2
3
4
5
6
7
8
kubectl apply -f echoserver.yml
kubectl expose deployment echoserver --type=NodePort --port=8080

## check service list
minikube service list

## delete service
kubectl delete service echoserver

Minikube muti node cluster

Using Multi-Node Clusters

1
2
3
4
5
6
7
minikube start --nodes 2 -p minikube-node

## check node with minikube
minikube node list

## check with kubectl
kubectl get nodes

Fixed profile not found issue

將現有 minikube cluster 刪除後會遇到這種情況,只需要重新指定 profile 即可。

minikube_fix_profile_not_found_issue.jpg