利用k8s储存卷来部署redis
本文主要通过利用k8s如何部署Redis,来学习使用k8s的存储卷Volume。
Pod本⾝具有⽣命周期,故其内部运⾏的容器及其相关数据⾃⾝均⽆法持久存在。Kubernetes也⽀持类似Docker的存储卷功能,不过,其存储卷Volume是与Pod资源绑定⽽⾮容器。
Pod Volume
如何要在一个Pod里声明 Volume:
- ⼀是通过.spec.volumes字段定义在Pod之上的存储卷列表,其⽀持使⽤多种不同类型的存储卷且配置参数差别很⼤;
spec:
…
volumes:
* name: logdata
emptyDir: {}
* name: example
gitRepo:
repository: https://github.com/iKubernetes/k8s_book.git
revision: master
directory: .
- 另⼀个是通过.spec.containers.volumeMounts字段在容器上定义的存储卷挂载列表,它只能挂载当前Pod资源中定义的具体存储卷,当然,也可以不挂载任何存储卷
spec:
…
containers:
* name: <String>
…
volumeMounts:
* name <string> -required-
mountPath <string> -required-
在之前(声明式对象配置)有介绍过nginx的部署,接着来部署Redis,和Nginx有所不同的是,这里多了一个 ConfigMap 和Volume ,用来配置管理redis和储存。
环境
- 一个k8s 集群(mater* 1,node* 1)
- 一个正常连接k8smater的主机的终端
创建 Config-Map
使用 ConfigMap 来配置 Redis ,包含了Redis配置文件里需要的配置项,在创建Pod时会作为配置文件挂载到应用所在的容器中。 my-config-map.yaml 具体如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-redis-config
namespace: my-ns
data:
redis.conf: |
requirepass 123456
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
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events Ex
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
执行命令
# kubectl apply -f my-redis-config.yaml
创建 Deployment
创建Deployment 作为调度Pod运行 Redis 的载体。my-redis-deployment.yaml具体如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-redis # Unique name for the deployment
namespace: my-ns
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-storage
emptyDir: {}
- name: my-redis-config
configMap:
name: my-redis-config
items:
- key: redis.conf
path: redis.conf
执行
# kubectl apply -f my-redis-deployment.yaml
创建 service
NodePort 方式向外暴露服务。my-redis-service.yaml 具体如下
apiVersion: v1
kind: Service # Type of Kubernetes resource
metadata:
name: my-redis-svc # Name of the Kubernetes resource
namespace: my-ns
labels: # Labels that will be applied to this resource
app: my-redis
role: master
tier: backend
spec:
type: NodePort
ports:
- port: 6379 # Map incoming connections on port 6379 to the target port 6379 of the Pod
targetPort: 6379
nodePort: 30379
selector: # Map any Pod with the specified labels to this service
app: my-redis
role: master
tier: backend
执行
# kubectl apply -f my-redis-service.yaml
测试
redis-client 测试NodeId:NodePort
redis-cli -h YourNodeIp -p 30379 -a 123456
YourNodeIp:30379> info
# Server
redis_version:7.0.4
...
连接成功。