K8S的高级功能-存储

1存储抽象

环境准备

1、所有节点 安装nfc共享存储

#所有机器安装
yum install -y nfs-utils

主节点

#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r

从节点

showmount -e 172.22.29.135

#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data

mount -t nfs 172.22.29.135:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt

K8S的高级功能-存储

2 做一个部署将容器/usr/share/nginx/html目录指定到外面目录/nfs/data/nginx-pv中

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv-demo
name: nginx-pv-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
server: 172.22.29.135
path: /nfs/data/nginx-pv

2 挂载目录 PV&PVC

pv :指定每个文件夹的存储大小

pvc:创建一个中间件来说明需要多大空间会自动查询pv的那个空间可以使用,那么创建pod时,只需要绑定一个pvc 就可以自动关联到文件夹了,删除pvc时会将pv中的内容也删除,但pv的名字和空间大小会保留以等待其他PVC 使用

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置

PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格给指定的文件夹标明存储大小

静态创建空间

#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

创建PV

---:分割文档

kind: PersistentVolume 持久化卷

metadata: name: 给文档起一个名字

storage: 10M 标记存储大小10M

accessModes:  ReadWriteMany 可读可写 多节点

storageClassName:nfs 给卷起一个名字

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m
spec:
capacity:
storage: 10m
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 172.22.29.135
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02-1gi
spec:
capacity:
storage: 50m
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 172.22.29.135
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03-3gi
spec:
capacity:
storage: 100m
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 172.22.29.135

K8S的高级功能-存储

PVC创建

创建一个pvc 名字是Nginx-pvc

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200m
storageClassName: nfs

K8S的高级功能-存储

创建Pod绑定PVC

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-pvc
name: nginx-deploy-pvc
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deploy-pvc
template:
metadata:
labels:
app: nginx-deploy-pvc
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: nginx-pvc

K8S的高级功能-存储

3 挂载配置文件 ConfigMap

抽取应用配置,并且可以自动更新

redis示例

1、把之前的配置文件创建为配置集

命令行操作

# 创建配置,redis保存到k8s的etcd;
kubectl create cm redis-conf --from-file=redis.conf

yaml 文件操作 kubectl apply -f redis.yaml

apiVersion: v1
data: #data是所有真正的数据,key:默认是文件名 value:配置文件的内容
redis.conf: |
appendonly yes
kind: ConfigMap
metadata:
name: redis-conf
namespace: default

2 pod 安装操作

apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
command:
- redis-server
- "/redis-master/redis.conf" #指的是redis容器内部的位置
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data
name: data
- mountPath: /redis-master
name: config #引用22行的配置文件
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: redis-conf
items:
- key: redis.conf
path: redis.conf

3检查是否生效

kubectl exec -it redis -- redis-cli
127.0.0.1:6379> CONFIG GET appendonly
127.0.0.1:6379> CONFIG GET requirepass

4 修改ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
name: example-redis-config
data:
redis-config: |
maxmemory 2mb
maxmemory-policy allkeys-lru

5 检查配置是否更新

kubectl exec -it redis -- redis-cli

127.0.0.1:6379> CONFIG GET maxmemory
127.0.0.1:6379> CONFIG GET maxmemory-policy

检查指定文件内容是否已经更新

修改了CM。Pod里面的配置文件会跟着变

配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。

原因:我们的Pod部署的中间件自己本身没有热更新能力

4 Secret

1 安装

kubectl create secret docker-registry everup-docker 
--docker-username=everup
--docker-password=wangkuo123
--docker-email=everup@163.com

##命令格式
kubectl create secret docker-registry regcred
--docker-server=<你的镜像仓库服务器>
--docker-username=<你的用户名>
--docker-password=<你的密码>
--docker-email=<你的邮箱地址>

2 测试安装是否成功下载私有docker内容

apiVersion: v1
kind: Pod
metadata:
name: redis-docker
spec:
containers:
- name: redis-docker
image: everup/redis:v1
imagePullSecrets:
- name: everup-docker
发表评论

相关文章