在Kubernetes (k8s) 上安装Redis
在Kubernetes上安装Redis有几种方法,下面我将介绍两种常见的方式:使用StatefulSet直接部署和使用Helm chart部署。
一、安装redis
1.1 拉去ARM镜像(7.4.2)
bash
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_redis:latest
1.2 拉去x86镜像(8.0.1)版本
bash
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest
方法一:使用StatefulSet部署Redis
首先创建一个Redis的配置文件ConfigMap:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
创建Redis的StatefulSet和Service:
yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest
ports:
- containerPort: 6379
name: redis
volumeMounts:
- name: redis-data
mountPath: /data
- name: redis-config
mountPath: /usr/local/etc/redis/redis.conf
subPath: redis.conf
volumes:
- name: redis-config
configMap:
name: redis-config
items:
- key: redis.conf
path: redis.conf
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
bash
kubectl apply -f redis-configmap.yaml
kubectl apply -f redis-statefulset.yaml
方法二:使用Helm安装Redis
如果你已经安装了Helm,这是更简单的方法:
添加Bitnami仓库(包含Redis chart):
bash
helm repo add bitnami https://charts.bitnami.com/bitnami
安装Redis:
bash
helm install redis registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest
获取密码(如果启用了认证):
bash
export REDIS_PASSWORD=$(kubectl get secret --namespace default my-redis -o jsonpath="{.data.redis-password}" | base64 --decode)
连接Redis:
bash
kubectl run --namespace default edis-client --rm --tty -i --restart='Never' \
--env REDIS_PASSWORD=$REDIS_PASSWORD \
--image registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest -- bash
redis-cli -h redis-master -a $REDIS_PASSWORD
redis-cli -h redis-replicas -a $REDIS_PASSWORD
验证安装
bash
kubectl get pods
kubectl logs <redis-pod-name>
完整版本 redis-deployment-all.yaml
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deployment
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest
ports:
- containerPort: 6379
env:
- name: REDIS_PASSWORD
value: "87vhqEneQ5u8"
volumeMounts:
- name: redis-log
mountPath: /var/log/redis/
- name: redis-data
mountPath: /data
command: ["redis-server", "--appendonly", "yes", "--requirepass", "$(REDIS_PASSWORD)"]
volumes:
- name: redis-log
emptyDir: {}
- name: redis-data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
type: NodePort
ports:
- port: 6379
targetPort: 6379
nodePort: 30379
selector:
app: redis
应用配置:
bash
kubectl apply -f redis-deployment-all.yaml
第三种:
完整的 Redis 部署配置(包含 PV 和 PVC)
首先创建 PersistentVolume (PV):
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/redis
persistentVolumeReclaimPolicy: Retain
创建 PersistentVolumeClaim (PVC):
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
修改你的 Deployment 使用 PVC 而不是 emptyDir:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deployment
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest
ports:
- containerPort: 6379
env:
- name: REDIS_PASSWORD
value: "87vhqEneQ5u8"
volumeMounts:
- name: redis-log
mountPath: /var/log/redis/
- name: redis-data
mountPath: /data
command: ["redis-server", "--appendonly", "yes", "--requirepass", "$(REDIS_PASSWORD)"]
volumes:
- name: redis-log
emptyDir: {}
- name: redis-data
persistentVolumeClaim:
claimName: redis-pvc
Service 配置保持不变:
yaml
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
type: NodePort
ports:
- port: 6379
targetPort: 6379
nodePort: 30379
selector:
app: redis
如何使用这些配置
依次应用这些配置文件:
bash
kubectl apply -f redis-pv.yaml
kubectl apply -f redis-pvc.yaml
kubectl apply -f redis-deployment.yaml
kubectl apply -f redis-service.yaml
验证资源是否创建成功:
bash
kubectl get pv
kubectl get pvc
kubectl get pods
kubectl get svc
访问 Redis:
集群内部访问: 使用服务名 redis-service 和端口 6379
集群外部访问: 使用节点 IP 和 30379 端口