天天看點

Redis On K8s

redis on k8s 優勢很多:

1、可以通過運維平台對接k8s api,可以提高部署效率

2、擴縮容友善

3、遷移成本低,直連代理即可,和之前使用redis單機一樣的配置

為什麼這裡沒有采用小米的redis on k8s方案?

考慮到我們這很多微服務依賴的redis的壓力并不大(大量1-4g執行個體),輕量級的redis主從即可滿足需求,使用社群現有解決方案,基本不會增加運維成本。

如果引入predixy on k8s類的專業代理元件,需要投入的人力成本過大(predixy 在非k8s環境下之前也用過,偶發bug,目前我們團隊也沒有對其二開或bugfix的能力)

參考:

https://github.com/dandydeveloper/charts

https://artifacthub.io/packages/helm/dandydev-charts/redis-ha

架構如下圖

看上去偏重些,redis的pod中有4個container,自帶了prometheus監控和redis狀态的治理,好在除了redis本身外其餘container占用的資源都很少,整體還是可以接受的。

Redis On K8s

實戰:

git clone 後, cd charts/

cp -a redis-ha redis-1g    # ps:我這裡是搞了個redis-1g的獨立檔案夾,專用于啟動1g的redis主從例。

然後去修改下value.yaml中的配置:

1、redis的 replicas 從3改為2(節約資源)

2、開啟haproxy的配置支援,并修改replicas 從3改為2(節約資源)

3、開啟metrics和servicemonitor(用于自動化的名額資料采集)

4、啟用sysctlimage,并優化些核心參數 (非必要,可選)

5、設定quorum為1,修改min-replicas-to-write: 0(預設配置不是這樣的,我這裡精簡掉了1個slave,是以必須把配置也改低些)

6、顯式設定 maxmemory: "1024mb"  (強烈建議開啟,寫滿後觸發自動淘汰key,避免因為達到k8s的limits自動殺掉pod)

7、設定 maxmemory-policy: "volatile-lfu"  (建議,非必須修改項)

8、設定resources limit和 request的值(生産pod必須顯式設定)

9、hardantiaffinity值的設定 (生産必須設定為true,測試的話如果沒有很多k8s節點,可以這個參數設定為false)

10、各種exporter都設定為true

我這裡改好的yaml如下:

配置檔案改好後,我們去部署:

helm install redis-arch redis-1g

注意: 這個redis的yaml中,是開啟了持久化的,我們的k8s還需要配置個default storgeclass,我這裡用的是本機nfs(生産上可以用其它的解決方案)

Redis On K8s

等容器都啟動好後,最終效果如下:

Redis On K8s
Redis On K8s
Redis On K8s
Redis On K8s

可以去grafana畫闆子(這個git倉庫裡面,也自帶了一個grafana的周邊,感興趣的可以自行試用),下面是我随手畫的demo:

Redis On K8s

擴容和縮容:

1、修改redis的configmap,調大maxmemory

2、修改sts配置檔案,調大 limits(limits要求比maxmemory大些)

修改sts配置後,會自動觸發redis的pod的重建

重建過程中,redis會觸發主從切換,但是因為前端有haproxy了,是以不可用時間通常在20s以内

tips:

如果用不慣helm這種方式的,我們也可以部署一套redis出來後,把它全部的yam都扒拉出來,然後把可能需要改動的地方都用變量替換,制做出一套模闆。

這樣我們就可以通過 自研的服務去調k8s api(甚至用jenkins包裝下執行apply一系列的yaml也行) 達到快速拉起一套redis叢集的目的。