如何在 k8s 上部署单节点的 redis
背景是这样的,项目的测试环境需要 redis,对于测试环境来说,redis 的高可用性要求不高,所以就想着部署一个单节点的 redis,但在网上逛了一圈,发现教程都是部署 redis-cluster 的,看起来比较麻烦,所以我就想着不如从零开始使用 k8s YAML 文件的方式部署一个单节点的 redis。此文就是记录这个过程。
创建 deployment
kubectl create deployment my-redis --image=redis:latest --dry-run=client -o yaml > deployment.yaml
以上命令会生成一个 deployment.yaml 文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-redis
name: my-redis
spec:
replicas: 1
selector:
matchLabels:
app: my-redis
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-redis
spec:
containers:
- image: redis:latest
name: redis
resources: {}
status: {}
--image=redis:latest
指定了使用的镜像,--dry-run=client
和 -o yaml
参数是为了生成 yaml 文件,而不是直接创建 deployment,如果不加这两个参数,会直接在 k8s 中创建 deployment。
暴露服务
我们需要将 redis 服务暴露出来,这样才能在集群上的其他 pod 中或者公司内网中访问到 redis 服务。这里使用 LoadBalancer 类型的 service。上一节中我们创建的 deployment 的名字是 my-redis,redis 默认的端口是 6379,所以我们可以使用以下命令创建 service:
kubectl expose deployment my-redis --port 6379 --target-port 6379 --name=my-redis-service --type=LoadBalancer --dry-run=client -o yaml > service.yaml
以上命令会生成一个 service.yaml 文件,内容如下:
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-redis
name: my-redis-service
spec:
ports:
- port: 6379
protocol: TCP
targetPort: 6379
selector:
app: my-redis
type: LoadBalancer
status:
loadBalancer: {}
让 deployment 和 service 生效
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
或者
kubectl apply -f . # 一次性应用所有 yaml 文件
查看 deployment 和 service 是否生效:
> kubectl get svc | grep my-redis
my-redis-service LoadBalancer 10.244.116.225 11.1.101.115 6379:32387/TCP 2m
> kubectl get pods | grep my-redis
my-redis-d8f7b7d64-sx87r 1/1 Running 0 14m
测试一下:
> redis-cli -h 11.1.101.115
修改 redis 配置
我们现在是使用的 redis 的默认配置,但是如果我们需要修改一下配置,比如设置密码,怎么做呢?
参考 redis docker 镜像文档,我们需要将需要修改的配置文件挂载到容器中 /usr/local/etc/redis/redis.conf
这个路径下,然后在启动容器的时候指定配置文件的路径 redis-server /usr/local/etc/redis/redis.conf
。
我们可以使用 ConfigMap 来挂载配置文件,然后在 deployment 中指定挂载的路径,这样就可以修改 redis 的配置了。
创建 ConfigMap
首先我们在本地创建一个 redis.conf 文件,内容如下:
requirepass 123456
根据 redis.conf 文件创建名为 my-redis-config 的 ConfigMap
kubectl create configmap my-redis-config --from-file=redis.conf --dry-run=client -o yaml > configmap.yaml
以上命令会生成一个 configmap.yaml 文件,内容如下:
apiVersion: v1
data:
redis.conf: |
requirepass 123456
kind: ConfigMap
metadata:
creationTimestamp: null
name: my-redis-config
修改 deployment
修改 deployment.yaml 文件,添加 volumes 和 volumeMounts 以及 command:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-redis
name: my-redis
spec:
replicas: 1
selector:
matchLabels:
app: my-redis
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-redis
spec:
containers:
- image: redis:latest
name: redis
resources: {}
+ volumeMounts:
+ - mountPath: /usr/local/etc/redis
+ name: redis-config
+ command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
+ volumes:
+ - name: redis-config
+ configMap:
+ name: my-redis-config
status: {}