使用 Prometheus 和 Grafana 來監控你的 K3s / K8s 叢集
前言:
本文的目標為安裝 Prometheus 和 Grafana 來監控 K3s / K8s 叢集,達成用 Grafana 串接 Prometheus 監控的指標並用圖表呈現,也能幫警報系統串接 Gmail SMTP server 發送警告信。
還沒有建好叢集的讀者請先參考我的另一篇文章:
用 Multipass 和 K3s 建立 K8s 叢集
本文有用圖形化工具 portainer 和指令兩種方式教學,想安裝 portainer 的話請先參考我的另一篇文章:
使用 Portainer 圖形化工具管理 K3s / K8s 叢集
先用 helm 安裝 kube-prometheus-stack (內含 grafana):
可參考官方說明
1helm install my-kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 55.5.1
雖然 terminal 很快就顯示跑完了,但可以觀察虛擬機還是在大量跑東西。
順帶一提筆者一開始使用 1G 或 2G RAM 的主節點都會無限失敗 ...
使用 Portainer 圖形化工具管理 K3s / K8s 叢集
前言:
本文的目標為安裝 Portainer 圖形化工具來管理 K3s / K8s 環境,並簡單快速的用 yaml 設定來將容器自動部署到叢集上。
還沒有建好叢集的讀者請先參考我的另一篇文章:
用 Multipass 和 K3s 建立 K8s 叢集
先到 server 虛擬機內安裝 portainer:
123multipass shell k8s-serverkubectl apply -n portainer -f https://downloads.portainer.io/ce2-19/portainer.yaml
安裝完後確認是否成功:
1sudo kubectl get pods -n portainer
回到本機,連到以下網址:
1234http://<your_server_node_ip>:30777/# 或是https://<your_server_node_ip>:30779/
第一次啟動服務要設定帳號,如下圖:
設定完成就可以看到以下介面:
點選 Get Started 即可開始。
點選 local 進入 Dashboard:
...
用 Multipass 和 K3s 建立 K8s 叢集
前言:
本文的目標為在 macOS 上開兩個 ubuntu 虛擬機並將他們納入 Kubernetes 環境,且可從 macOS 本機連接。
Multipass : 在 macOS 快速建立 ubuntu 虛擬機。
K3s : 輕量化的 K8s(Kubernetes)。
安裝 kubectl:
1brew install kubectl
安裝 Multipass:
1brew install multipass --cask
創建兩台虛擬機:
鑒於筆者後面開發時遇到的巨坑經驗,如果可以的話虛擬機資源還是給多一點吧,server 給到 4G RAM 會對之後的開發友善許多。
123multipass launch --name k8s-server --mem 1G --disk 5G --cpus 1multipass launch --name k8s-worker --mem 1G --disk 5G --cpus 1
檢查虛擬機狀態順便記下 IP 後面會用到:
1multipass list
在 server 虛擬機上安裝 k3s:
123multipass shell k ...
使用 conda 管理 python 開發環境
前言:
我過往在開發自製小工具的時候都會採用 python,因為語法簡潔,也有很多別人寫好的套件可以用,但為了快速所以本機環境都沒認真管控。由於最近接手公司的 python 專案,覺得要認真建置一下開發環境了。
本文的範例都是基於 macOS 的。
安裝 conda:
conda 是一個與語言無關的跨平台環境管理器,定位會類似於 apt 或 yum,可以方便管理各種包。
要安裝 conda 可以使用 Anaconda 或 Miniconda 來輕鬆安裝,由於後者比較輕量,所以我是用後者:
1brew install --cask miniconda
安裝完後可以用 conda -V 確認一下。
使用 conda 管理虛擬環境:
虛擬環境的好處在於你可以切出不同的語言版本和不同的套件,而不需要擔心不同專案間的環境衝突或冗余套件。
在虛擬環境中可以自由使用 pip 安裝套件,作用範圍僅限當下的虛擬環境。
創建虛擬環境: 1conda create --name <env_name> python=<version>
查看虛擬環境列表: 1conda env ...
禁用 Linux 的密碼登入改用 ssh 憑證連線
緣由 :
用密碼登入代表有可能會有洩漏或被暴力破解等等的隱憂,所以可以改用非對稱式加密的 ssh 來保證安全,也可以幫助懶人不用每次都要打密碼。
作法 :
1. 本機產生 ssh 金鑰對:
如果你是 Unix/Linux 或 macOS,可以直接使用以下指令:
1ssh-keygen -t rsa -b 4096
如果你是 Ubuntu 或 Debian 又缺少這個工具,則需要先用指令安裝套件:
12sudo apt-get updatesudo apt-get install openssh-client
如果成功會在你的帳戶家目錄下產生 .ssh 目錄,裡面有私鑰 id_rsa 和公鑰 id_rsa.pub,請記住私鑰絕對不要外洩。
2. 推送金鑰到你的機器上:
1ssh-copy-id <username>@<remote_ip>
如果成功則會在你的機器的該帳號家目錄下產生 .ssh/authorized_keys。
或你也可以手動創建該目錄檔案並貼入公鑰 id_rsa.pub 的內容。
成功後記得確保 .ssh 和 authorized_keys 都是 ...
用 Certbot 來自動幫你的網站申請 & 更新免費的 Let's Encrypt SSL 憑證吧 !
為何需要 SSL 憑證 :
你是否有注意過網址有分成 http 和 https 呢?
HTTP (HyperText Transfer Protocol)
HTTPS (HyperText Transfer Protocol Secure )
很明顯的,他們的差距就在於安全性,當你訪問 http 的網站時,瀏覽器會跳出非安全連線的提示,這是因為 http 封包是用明文傳遞資訊,很容易被截取,所以需要用 SSL/TLS 這樣的非對稱式加密來保證資訊安全,這些協議使用公開密鑰和私有密鑰來加密通信,確保只有發送方和接收方能夠解密和讀取數據。
不過這樣還不夠,瀏覽器只信任第三方機構(Certificate Authority,簡稱CA)發布的數位憑證,如果你使用了自簽名的憑證,瀏覽器仍會跳出非安全連線的提示。
那麼,為什麼瀏覽器只信任 CA 頒發的憑證呢?這是因為 CA 在頒發數位憑證前會驗證該網站的身份,他會核實網站所有者的身份和控制權,這樣可以有效防止中間人攻擊。
什麼是 Let’s Encrypt :
如同前面提到的,我們需要向 CA 請求頒發數位憑證,而其中一間最知名又免費的 CA ...
快取的一致性難題與架構模式 (下)
Meta 是怎麼做的?
讀:和 Read aside 一樣。先從 Cache 讀,讀到就回,沒讀到就從 DB 讀然後寫回 Cache。
寫:先寫回 DB,接著清掉 Cache
讀寫和 Read aside 一樣,但對 Cache 的操作採用版本控制及 Polaris 系統實作
版本控制 :
所有對 Cache 寫入的請求字段要附加版本資訊
1234# 依收到請求的時間排序SET x=1 @VERSION=1 SET x=12345 @VERSION=3 (先到,所以先寫入) SET x=45678 @VERSION=2 (無效,因為剛剛已經先寫版本3了,所以版本2比較低視為無效)
缺點:若在 v2 的請求到達之前 v3 的資料就先被清除,v2 就會被成功寫入
Polaris :
是一個基於 Multi-Paxos 演算法實作的系統。
Polaris 是獨立的監控服務。
如上圖,當 DB 某資料更新成 x=4 後,會發請求告訴所有 Cache “x=4 @version 4” 的失效事件(invalidation event),表示跟 “x=4 @version 4” ...
快取的一致性難題與架構模式 (中)
阿里巴巴的開源專案 canal :
讀:和 Read Aside 一樣。先從 Cache 讀,讀到就回,沒讀到就從 DB 讀然後寫回 Cache。
寫:只寫回 DB,canal 會從 DB 的 binlog 複製到 Cache (canal 扮演 Slave 的角色去監聽 binlog)。
補充 : binlog 是 MySQL 二進位制格式的日誌,只要資料庫有操作,就會寫入 binlog。
MySQL 主從複製 :
在探討 canal 如何運作之前,我們必須先了解 MySQL 是如何達到主從複製的 :
Slave 產生 I/O thread 向 Master 請求 binlog。
Master 會產生一個 log dump thread,負責傳 binlog 給 Slave 的 I/O thread,而在讀取和發送
給 Slave 的過程中會將 binlog 上鎖。
Slave I/O thread 將得到的 binlog 日志寫入 Relay log(中繼日誌) 文件中。
Slave 產生 SQL thread 讀取 Relay log 文件中的日誌,並解析成具體操作 ...
快取的一致性難題與架構模式 (上)
快取是什麼 :
我們都知道電腦的核心運算是由 CPU 負責的,而我們的主要的資料儲存單元是硬碟,由於要在硬碟裡面搜尋資料並帶回來是一件時間成本極高的事,所以就有了將找過的資料暫存起來的概念,如下圖 :
CPU 會先在 CPU Cache 裡尋找資料,當發現沒有之後就會去 main memory(DRAM) 找,再沒有才會去硬碟找。
找到之後就會一路寫回來,這樣你下次要找同樣資料時就不用再跑這麼遠去硬碟找。
我們之後會探討的快取就是 main memory(DRAM) 與硬碟的這一塊。
為什麼要使用快取 :
DB 很慢 : 因為 RDBMS 需要保證 ACID,所以必須等待整個流程跑完。
DB 很貴 : 由於 RDBMS 的資料儲存在硬碟,會需要更多次 IO,上面已說明過。
DB 很遠 : 當你的 DB 建在新加坡,對於台灣用戶來說網路距離增加,傳輸速度也慢。
為什麼快取會有一致性難題 :
如果你是分散式系統,那就一定逃不過 CAP 定理,但如果我只在單一台電腦上同時裝 Cache(ex. Redis) 和 DB(ex. MySQL),還會有一致性難題嗎?讓我們接著以實作 ...
LeetCode 49. Group Anagrams
題目:
官網題目連結
根據題目敘述,會給定一個字串陣列 strs,需要把每個字串依據 anagram 做分類放進不同的陣列後回傳。
相同 anagram 定義 : 若字串 s 的字元出現頻率與字串 t 相同,則他們為同一個 anagram。
例如輸入 strs=[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”],應回傳 [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]],不看順序。
1 <= strs.length <= 10^4
0 <= strs[i].length <= 100
strs 裡的每個字串都只由小寫英文字組成
解法:
原本想到的作法是每個字串做一個字符出現次數表,但這樣的時間複雜度就會變成「字串總數 * (每個字串的最大長度 * 當下有的出現次數表(最大等於字串總數) * 當下有的出現次數表最大長度),光看就不可行。
後來想說既然存出現次數陣列沒比較快,那就改成存排序後的不重複字串,也就是對每個字串做排序後去比較我們存過的不重複字串,時間複雜度會變成「字串總數 * 最大字串排 ...