之前学习实践使用熟悉卷(Volume)来存储利用k8s储存卷来部署redis,本文接着学习实践k8s的存储,主要通过redis存储例子学习实战PV和PVC。
PV & PVC
Kubernetes为例⽤户和开发隐藏底层架构的⽬标,在用户和存储服务之间添加了一个中间层,也就是PersistentVolume和PersistentVolumeClaim。
- PersistentVolume 持久卷 (是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。)
- PersistentVolumeClaim 持久卷申领 ( 表达的是用户对存储的请求。概念上与 Pod 类似。) 更多详细参见参考 https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes
RedisVolume修改为PV&PVC
接着,这里把之前的redis存储修改为pv-pvc的方式,修改后的步骤:
- 创建 ConfigMap (参考第一篇)
- 增加声明PV和PVC (新增)
- 增加 Deployment (把Volume修改为 步骤2 的PVC)
- 暴露 Service (参考第一篇)
步骤2,增加声明PV和PVC
mkdir my-redis-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-redis-pv
labels:
app: my-redis
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data/my-redis"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-pvc
namespace: my-ns
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
执行创建
master# kubectl apply -f my-redis-pv-pvc.yaml
查看pv状态
master# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
my-redis-pv 1Gi RWO Retain Bound my-ns/redis-pvc 50m
查看pvc状态
master# kubectl get pvc -n my-ns
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-pvc Bound my-redis-pv 1Gi RWO 54m
pv和pvc已经Bound成功。
步骤3,增加 Deployment (把Volume修改为 步骤2 的PVC)
mkdir my-redis-deployment-pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-redis # Unique name for the deployment
namespace: myns
labels:
app: my-redis # Labels to be applied to this deployment
spec:
selector:
matchLabels: # This deployment applies to the Pods matching these labels
app: my-redis
role: master
tier: backend
replicas: 1 # Run a single pod in the deployment
template: # Template for the pods that will be created by this deployment
metadata:
labels: # Labels to be applied to the Pods in this deployment
app: my-redis
role: master
tier: backend
spec: # Spec for the container which will be run inside the Pod.
containers:
- name: my-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-persistent-storage
persistentVolumeClaim:
claimName: redis-pvc # 这里修改为步骤2声明的pvc
- name: my-redis-config
configMap:
name: my-redis-config
items:
- key: redis.conf
path: redis.conf
执行创建deployment
master# kubectl apply -f my-redis-deployment-pvc.yaml
检查状态
master# kubectl get pod -n my-ns
NAME READY STATUS RESTARTS AGE
my-redis-6565459689-mbptf 1/1 Running 0 53m
测试
redis-client 连接 NodeId:NodePort
# redis-cli -h YourNodeIp-p 30379 -a 123456
YourNodeIp:30379> info
# Server
redis_version:7.0.4
连接成功。