微吼云上線多路互動直播服務 加速多場景互動直播落地
1094
2025-04-02
簡介
Redis 參數配置
創建 ConfigMap 存儲 Redis 配置文件
Kubectl 部署 ConfigMap
簡介
Redis 參數配置
創建 ConfigMap 存儲 Redis 配置文件
Kubectl 部署 ConfigMap
Redis 數據存儲
創建 PV
創建 PVC 綁定存儲空間
通過 Kubectl 工具部署 PV、PVC
部署 Redis + redis_exporter
原理
redis_exporter
創建 Sidecar 部署 Redis
通過 Kubectl 工具部署 Redis
測試 Redis 是否能夠正常使用
Redis 是否能夠正常獲取監控數據
系統環境:
Redis 版本:5.0.8
Kubernetes 版本:1.19.2
操作系統版本:CentOS 7.8
簡介
Redis 是我們常用的非關系型數據庫,在項目開發、測試、部署到生成環境時,經常需要部署一套 Redis 來對數據進行緩存。這里介紹下如何在 Kubernetes 環境中部署用于開發、測試的環境的 Redis 數據庫,當然,部署的是單節點模式,并非用于生產環境的主從、哨兵或集群模式。
Redis 參數配置
在使用 Kubernetes 部署應用后,一般會習慣與將應用的配置文件外置,用 ConfigMap 存儲,然后掛載進入鏡像內部。這樣,只要修改 ConfigMap 里面的配置,再重啟應用就能很方便就能夠使應用重新加載新的配置,很方便。
創建 ConfigMap 存儲 Redis 配置文件
創建 Kubernetes 的 ConfigMap 資源,用于存儲 Redis 的配置文件 redis.conf 內容:
redis-config.yaml:
kind: ConfigMap apiVersion: v1 metadata: name: labels: app: redis data: redis.conf: |- dir /data port 6379 bind 0.0.0.0 appendonly yes protected-mode no pidfile /data/redis-6379.pid
Kubectl 部署 ConfigMap
通過 kubectl 工具部署 Kubernetes ConfigMap 資源,命令如下:
$ kubectl create -f redis-config.yaml
Redis 數據存儲
Kubernetes 部署的應用一般都是無狀態應用,部署后下次重啟很可能會漂移到不同節點上,所以不能使用節點上的本地存儲,而是網絡存儲對應用數據持久化,PV 和 PVC 是 Kubernetes 用于與儲空關聯的資源,可與不同的存儲驅動建立連接,存儲應用數據,所以接下來我們要創建 Kubernetes PV、PVC 資源。
創建 PV
PV 支持多種存儲驅動,不同存儲驅動的 PV 配置方式是不同的,需要根據你的存儲系統來配置 PV 參數。這里用的是 NFS 存儲(共享網絡文件存儲系統),直接使用前面創建的 StorageClass 即可 。
具體參考:
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存儲插件
創建 PVC 綁定存儲空間
redis-storage.yaml:
## PVC kind: PersistentVolumeClaim apiVersion: v1 metadata: name: redis spec: storageClassName: nfs-storage #---指定StorageClass resources: requests: storage: 5Gi #設置 pvc 存儲資源大小 accessModes: - ReadWriteOnce
通過 Kubectl 工具部署 PV、PVC
通過 kubectl 工具部署 Kubernetes PV、PVC 資源,命令如下:
$ kubectl create -f redis-storage.yaml
部署 Redis + redis_exporter
原理
Prometheus 的數據指標是通過一個公開的 HTTP(S) 數據接口獲取到的,我們不需要單獨安裝監控的 agent,只需要暴露一個 metrics 接口,Prometheus 就會定期去拉取數據;
對于一些普通的 HTTP 服務,我們完全可以直接重用這個服務,添加一個 /metrics 接口暴露給 Prometheus;而且獲取到的指標數據格式是非常易懂的,不需要太高的學習成本。
同時現在很多服務從一開始就內置了一個/metrics 接口,比如 Kubernetes 的各個組件、istio 服務網格都直接提供了數據指標接口。有一些服務即使沒有原生集成該接口,也完全可以使用一些 exporter 來獲取到指標數據,比如今天介紹的 redis_exporter,而 exporter 就有點類似于傳統監控服務中的 agent,作為服務一直存在,用來收集目標服務的指標數據然后直接暴露給 Prometheus。
redis_exporter
redis 沒有自帶 /metrics 接口供 Prometheus 使用,在這種情況下,我們就需要利用 exporter 服務來為 Prometheus 提供指標數據了。Prometheus 官方為許多應用就提供了對應的 exporter 應用,也有許多第三方的實現,我們可以前往官方網站進行查看:https://prometheus.io/docs/instrumenting/exporters/。
這里我們選擇官方的 redis_exporter:https://github.com/oliver006/redis_exporter
創建 Sidecar 部署 Redis
創建用于 Kubernetes Deployment 來配置部署 Redis 的參數:
配置 Redis 的鏡像地址、名稱、版本號;
配置其 CPU 與 Memory 資源的占用;
配置 Volume 掛載之前創建的 PV、PVC、ConfigMap 資源等等;
sidecar 掛載 redis_exporter。
這里通過 redis_exporter 的服務來監控 redis 服務,我們以 sidecar 的形式和主應用部署在同一個 Pod 中,比如我們這里來部署一個 redis,并用 redis_exporter 的方式來采集監控數據供 Prometheus 使用,這里通過 redis_exporter 的服務來監控 redis 服務,我們以 sidecar 的形式和主應用部署在同一個 Pod 中,比如我們這里來部署一個 redis,并用 redis_exporter 的方式來采集監控數據供 Prometheus 使用。
如下資源清單文件:promethues-redis-deploy.yaml:
## Service apiVersion: v1 kind: Service metadata: name: cloud-redis labels: app: redis spec: selector: app: redis ports: - name: redis port: 6379 targetPort: 6379 - name: prom port: 9121 targetPort: 9121 --- ## Deployment apiVersion: apps/v1 kind: Deployment metadata: name: cloud-redis labels: app: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: annotations: prometheus.io/scrape: "true" prometheus.io/port: "9121" labels: app: redis spec: initContainers: - name: system-init image: busybox:1.32 imagePullPolicy: IfNotPresent command: - "sh" - "-c" - "echo 2000 > /proc/sys/net/core/somaxconn && echo never > /sys/kernel/mm/transparent_hugepage/enabled" securityContext: privileged: true runAsUser: 0 volumeMounts: - name: sys mountPath: /sys containers: - name: redis-exporter image: oliver006/redis_exporter:latest resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 9121 - name: redis image: redis:5.0.8 command: - "sh" - "-c" - "redis-server /usr/local/etc/redis/redis.conf" ports: - containerPort: 6379 resources: limits: cpu: 1000m memory: 1024Mi requests: cpu: 1000m memory: 1024Mi volumeMounts: - name: data mountPath: /data - name: config mountPath: /usr/local/etc/redis/redis.conf subPath: redis.conf volumes: - name: data persistentVolumeClaim: claimName: redis - name: config configMap: name: redis-config - name: sys hostPath: path: /sys
參數簡介:
ports: 配置鏡像映射端口。
resources: 配置 CPU、Memory 資源限制,可以通過配置該值來配置 Pod 的 QoS 級別。
volumeMounts: 存儲卷掛載配置,用于鏡像內存儲的掛載配置,與 volumes 中對于的 name 進行綁定。
volumes: 存儲卷配置,可配置使用 pvc、hostPath、emptyDir、nfs 等存儲,需要配置 name 值與 -VolumeMounts 進行綁定。
通過 Kubectl 工具部署 Redis
通過 kubectl 工具部署 Deployment 來創建 Redis,命令如下:
# -n:指定部署應用的 Namespace 命名空間 $ kubectl create -f redis-deploy.yaml -n mall
測試 Redis 是否能夠正常使用
進入Redis 使用 redis-cli 命令進行連接:
$ kubectl exec -ti cloud-redis-79b69db657-vjh8r --container redis -n mall -- /bin/bash root@cloud-redis-79b69db657-vjh8r:/data# redis-cli 127.0.0.1:6379> set a "100" OK 127.0.0.1:6379> get a "100" 127.0.0.1:6379>
可以看到,已經成功連接并進入 Redis 命令行界面,說明數據庫能正常使用。
注意:
pod 里有多個容器,需要加上 --container or -c 參數,指定進入的容器。
Redis 是否能夠正常獲取監控數據
創建完成后,我們可以看到 redis 的 Pod 里面包含有兩個容器:
$ kubectl get pods -n mall NAME READY STATUS RESTARTS AGE cloud-redis-79b69db657-vjh8r 2/2 Running 0 5d4h $ kubectl get svc -n mall NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cloud-redis ClusterIP 10.96.243.202
我們可以通過 9121 端口來校驗是否能夠采集到數據:
$ curl 10.96.243.202:9121/metrics # HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 4.6144e-05 go_gc_duration_seconds{quantile="0.25"} 9.4462e-05 go_gc_duration_seconds{quantile="0.5"} 0.000122258 go_gc_duration_seconds{quantile="0.75"} 0.000168729 go_gc_duration_seconds{quantile="1"} 0.009149671 go_gc_duration_seconds_sum 1.531426455 go_gc_duration_seconds_count 6342 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge go_goroutines 10 # HELP go_info Information about the Go environment. # TYPE go_info gauge go_info{version="go1.15"} 1 # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. # TYPE go_memstats_alloc_bytes gauge go_memstats_alloc_bytes 4.304504e+06 # HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. # TYPE go_memstats_alloc_bytes_total counter go_memstats_alloc_bytes_total 1.6514546264e+10 # HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. # TYPE go_memstats_buck_hash_sys_bytes gauge go_memstats_buck_hash_sys_bytes 1.581302e+06 # HELP go_memstats_frees_total Total number of frees. # TYPE go_memstats_frees_total counter go_memstats_frees_total 1.45861236e+08 ......
源碼地址:
https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-redis-exporter
Kubernetes Redis
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。