利用k8s储存卷来部署redis之三StatefulSet
前两篇(1.volume2.pv&pvc)通过部署redis学习实战了k8s的来Volume、PV和PVC。但是,应⽤程序存在“有状态”和“⽆状态”两种类别,显然redis属于读写磁盘需求的有状态应⽤程序,如⽀持事务功能的RDBMS存储系统,所以,本文学习实战k8s有状态应用的部署。
Stateful基础
StatefulSet是Pod资源控制器的⼀种实现,⽤于部署和扩展有状态应⽤的Pod资源,确保它们的运⾏顺序及每个Pod资源的唯⼀性。适用以下需求的应用:
- 稳定且唯⼀的⽹络标识符。
- 稳定且持久的存储。
- 有序、优雅地部署和扩展。
- 有序、优雅地删除和终⽌。
- 有序⽽⾃动地滚动更新。
部署
接着,这里把之前的redis存储修改为stateful的方式,修改后的步骤:
- 创建 ConfigMap (参考第一篇)
- 修改 Deployment 为StatefulSets
修改部署StatefulSets
mkdir my-redis-statefulsets.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
namespace: my-ns
spec:
replicas: 1
serviceName: redis
selector:
matchLabels:
name: redis
template:
metadata:
labels:
name: redis
spec:
containers:
- name: redis
image: redis
resources:
requests:
cpu: 100m
memory: 100Mi
# command: ["redis-server","/etc/redis/redis.conf"]
command:
- redis-server
- /etc/redis/redis.conf
ports:
- containerPort: 6379
volumeMounts:
- name: my-redis-config
mountPath: /etc/redis/redis.conf
subPath: redis.conf
- name: my-redis-storage
mountPath: /data
volumes:
- name: my-redis-storage
emptyDir: {}
- name: my-redis-config
configMap:
name: my-redis-config
items:
- key: redis.conf
path: redis.conf
---
kind: Service
apiVersion: v1
metadata:
labels:
name: redis
name: redis
namespace: my-ns
spec:
type: NodePort
ports:
- name: redis
port: 6379
targetPort: 6379
nodePort: 30379
selector:
name: redis
其中:
- Headless Service:⽤于为Pod资源标识符⽣成可解析的DNS资源记录
- StatefulSet ⽤于管控Pod资源
- volumeClaimTemplate则基于静态或动态的PV供给⽅式为Pod资源提供 专有且固定的存储(这里我们直接使用了第二篇创建的pv)
测试
redis-client 连接 NodeId:NodePort
# redis-cli -h YourNodeIp-p 30379 -a 123456
YourNodeIp:30379> info
# Serverredis_version:7.0.4
连接成功!
参考
- 官方stateful介绍 https://kubernetes.io/zh-cn/docs/tutorials/stateful-application/basic-stateful-set/#writing-to-stable-storage
- 《Kubernetes进阶实战-第2版》 https://item.jd.com/13140598.html